170 похожих чатов

Подскажите, пожалуйста Пытаюсь с помощью openmp распараллелить следующее Имеется вектор объектов

моего типа
Каждый из этих объектов хранит в себе указатели на остальные (думаю важное замечание, нужно для вычислений, см далее)

В цикле для каждого из этих объектов вызываю некоторый метод, который использует в вычислениях те самые указатели на другие объекты

Этот цикл хочу распараллелить
Пробывал разные варианты директив

Судя по описанию понял, что мне должно подходить:

#pragma omp parallel for shared(мой вектор) private(i - индекс, используемый в цикле)

Но и при этом и при других сочетаниях ничего не изменяется
Без директив и с ними время не изменяется

Число объектов 2к
Функция, которая вызывается для каждого объекта перебирает все остальные, дергает некоторые их поля и что-то считает

По заданию и логике ускорение быть должно, но ничего не изменяется

Подскажите, в каком направлении копать?

26 ответов

8 просмотров

Копать в направлении отсылки актуального кода.

Игорь-Ильич Автор вопроса
Ilya Zviagin
Копать в направлении отсылки актуального кода.

Фото нельзя наверное? Нет возможности скопировать пока что

Добавьте явно num_threads(требуемоеколичество потоков) Прям в прагму в конец, если не принципиально чтобы i была объявлена до цикла, то private можно не указывать, а объявить переменную прям в цикле, она автоматически будет private

Игорь-Ильич Автор вопроса
Il V
Добавьте явно num_threads(требуемоеколичество пото...

Я до этого использовал omp_set_num_threads Или это не влияет?

А можно встречный вопрос, зачем именно OMP использовать надо ?

Достаточно: #pragma omp parallel for for(size_t i=0; i<N; ++i) { ... } shared - по умолчанию ко всем, кроме индекса цикла, который private. прагма должна обязательно быть перед циклом. > Число объектов 2к А время работы какое? Если очень маленькое, то надо увеличить число объектов. Иначе время на создание потоков и их запуск будет больше работы.

Alexandr Rudalev
Достаточно: #pragma omp parallel for for(size_t i...

При этом важно, ЧТО внутри цикла...

Ну и стоит проверить что openmp вообще работает, а то классическая ошибка - не до настроили студию.

Игорь-Ильич Автор вопроса
Alexandr Rudalev
Ну и стоит проверить что openmp вообще работает, а...

Те может всё компилироваться, но не работать?

Игорь Ильич
Те может всё компилироваться, но не работать?

Может скомпилироваться с выключенной поддержкой openmp и работать на однонм потоке

Игорь-Ильич Автор вопроса
Alexandr Rudalev
Достаточно: #pragma omp parallel for for(size_t i...

20 секунд К общей памяти обращений много Очень По сути только это и происходит

Игорь-Ильич Автор вопроса
Alexandr Rudalev
Может скомпилироваться с выключенной поддержкой op...

Ясно Как лучше проверить На элементарном цикле вывести номера потоков?

Игорь Ильич
Ясно Как лучше проверить На элементарном цикле вы...

#pragma omp parallel { printf("%d\n", omp_get_thread_num()); } как-то так достаточно

Игорь Ильич
20 секунд К общей памяти обращений много Очень П...

20 секунд это много, ещё стоит посмотреть на неявное использование блокирующего ресурса.

Игорь-Ильич Автор вопроса
Alexandr Rudalev
20 секунд это много, ещё стоит посмотреть на неявн...

Звучит понятно Непонятно как посмотреть Или нужно просто знать?

Игорь Ильич
Звучит понятно Непонятно как посмотреть Или нужно...

Ну тут надо смотреть какие функции используются, классика: #pragma omp parallel for for(size_t i=0; i<N; ++i) { x[i] = rand() % 100; } В windows может летать, а в Linux стать работать в десятки раз дольше, т.к. rand() использует глобальный объект с блокировкой.

Игорь Ильич
https://pastebin.com/D9iK2Q6j

Это вопрос про OpenMP. Я нашёл только два for с прагмами, в обоих - вызовы функций в теле. Я не знаю omp досконально, но на мой взгляд это может не распараллеливаться вообще. Мне кажется, нужен прямой код

Игорь Ильич
https://pastebin.com/D9iK2Q6j

Лучше указать, какой for у тебя проблемный

Игорь-Ильич Автор вопроса
Il V
А как собирается?

Там всё собирается Но тут сейчас на скорую руку закинул всё в один файл И удалил «ненужное» Вроде ничего лишнего не убрал

Игорь-Ильич Автор вопроса
Ilya Zviagin
Лучше указать, какой for у тебя проблемный

Ну вот те два фора, где прагмы omp-шные Расчёт ускорение для всех тел и далее шаг

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
70
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Люди добрые, помогите с идеями, потому что свои закончились. У клиента падает софтина в момент инициализации модуля OtlEventMonitor на RegisterWindowMessage('Gp/OtlTaskEvents/...
Михаил Усков
7
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
2
GridView fully ignored first parent(SizedBox), and take width from second parent(Container). How can I constrain GridView by first parent? Widget build(BuildContext context) {...
Hamster
1
Hey there Which is the best Linux destro for developers (coding)? To my research on reddit, they said Linux mint is good for mid level spec and Ubuntu for high Lev hardwar...
Wiz 🪄
11
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
Карта сайта