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

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

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

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

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

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

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

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

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

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

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

26 ответов

7 просмотров

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

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

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

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

@Aiwan что такое база образца?
Alexey
27
Не многие знают, а кто знает, тот уже успел забыть, что в далёком 2004 году эта игра произвела настоящий фурор, настолько революционной была технология, применяемая для её соз...
ICCID
4
Короче я тут узнал полный пиздец Что кучу постов которые я создавал через posted Спустя время не могу редактировать и менять Мол телега возвращае ошибку Это реально так ...
inc.
13
коллеги, добрый вечер! А никто не знает как модальная форма может себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult...
Михаил
83
Хотя у меня сейчас есть более сложная задача, вот её думаю: как объяснить челу переходного возраста противоположного полу, обучающегося в польском колледже (а-ля наш техникум)...
Вячеслав Кузьменко
15
а вы в курсе, что Initialize() не работает? var arr123: array[0..123] of Byte; ... Initialize(arr123, SizeOf(arr123));
Iluha Companets
8
Добрый день Хочу начать обучение языку, не являюсь представителем it, буду благодарна за помощь, совсем пока не понимаю ничего) Подскажите, пожалуйста, где можно начать первы...
Sara Lala
30
что читать по делфи?вообще 0 в нем
fd dsds
9
верно что я могу удалить эти addq и subq т.к. со стеком никакого взаимодействия нет (исключая call)?
Michael
16
const dirname = new URL((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new UR...
Kirill Shaplyko
4
Карта сайта