моего типа
Каждый из этих объектов хранит в себе указатели на остальные (думаю важное замечание, нужно для вычислений, см далее)
В цикле для каждого из этих объектов вызываю некоторый метод, который использует в вычислениях те самые указатели на другие объекты
Этот цикл хочу распараллелить
Пробывал разные варианты директив
Судя по описанию понял, что мне должно подходить:
#pragma omp parallel for shared(мой вектор) private(i - индекс, используемый в цикле)
Но и при этом и при других сочетаниях ничего не изменяется
Без директив и с ними время не изменяется
Число объектов 2к
Функция, которая вызывается для каждого объекта перебирает все остальные, дергает некоторые их поля и что-то считает
По заданию и логике ускорение быть должно, но ничего не изменяется
Подскажите, в каком направлении копать?
Копать в направлении отсылки актуального кода.
Фото нельзя наверное? Нет возможности скопировать пока что
По фото мы не лечим. Это - к Кашпировскому.
Скину позже тогда :)
Добавьте явно num_threads(требуемоеколичество потоков) Прям в прагму в конец, если не принципиально чтобы i была объявлена до цикла, то private можно не указывать, а объявить переменную прям в цикле, она автоматически будет private
Я до этого использовал omp_set_num_threads Или это не влияет?
А можно встречный вопрос, зачем именно OMP использовать надо ?
Ну поидее должно было сработать
Достаточно: #pragma omp parallel for for(size_t i=0; i<N; ++i) { ... } shared - по умолчанию ко всем, кроме индекса цикла, который private. прагма должна обязательно быть перед циклом. > Число объектов 2к А время работы какое? Если очень маленькое, то надо увеличить число объектов. Иначе время на создание потоков и их запуск будет больше работы.
При этом важно, ЧТО внутри цикла...
Ну и стоит проверить что openmp вообще работает, а то классическая ошибка - не до настроили студию.
Те может всё компилироваться, но не работать?
Может скомпилироваться с выключенной поддержкой openmp и работать на однонм потоке
20 секунд К общей памяти обращений много Очень По сути только это и происходит
Ясно Как лучше проверить На элементарном цикле вывести номера потоков?
#pragma omp parallel { printf("%d\n", omp_get_thread_num()); } как-то так достаточно
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 досконально, но на мой взгляд это может не распараллеливаться вообще. Мне кажется, нужен прямой код
Лучше указать, какой for у тебя проблемный
А как собирается?
Там всё собирается Но тут сейчас на скорую руку закинул всё в один файл И удалил «ненужное» Вроде ничего лишнего не убрал
Ну вот те два фора, где прагмы omp-шные Расчёт ускорение для всех тел и далее шаг
Обсуждают сегодня