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

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

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

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

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

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

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

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

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

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

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

26 ответов

14 просмотров

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

Игорь-Ильич Автор вопроса
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-шные Расчёт ускорение для всех тел и далее шаг

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта