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

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

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

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

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

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

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

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

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

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

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

26 ответов

15 просмотров

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта