OpenMP вложенное распараллеливание

0

Я использую библиотеку, которая уже распараллеливается с OpenMP. Проблема в том, что для обработки, которую он делает, достаточно 2-4 ядер. Использование более 4 ядер не имеет большого значения.

Мой код выглядит так:

for (size_t i=0; i<4; ++i)
    Call_To_Library (i, ...);

Поскольку для библиотеки достаточно 4 ядер (т. Call_To_Library 4 ядра должны использоваться в Call_To_Library), и я работаю с 16- Call_To_Library, я намерен также распараллелить цикл for. Обратите внимание, что это for состоит максимум из 3-4 итераций.

Каким будет лучший подход к параллелизации этого внешнего? Могу ли я использовать OpenMP? Лучше всего использовать вложенные распараллеливания? В библиотеке, которую я вызываю, уже используется OpenMP, и я не могу изменить его код (и в любом случае это было бы непросто).

PS. Даже если внешний цикл состоит только из 4 итераций, его стоит распараллеливать. Каждый вызов в библиотеку занимает 4-5 секунд.

Теги:
openmp

1 ответ

2
Лучший ответ

Если между итерациями этого цикла нет зависимости, вы можете:

 #pragma omp for schedule(static)
 for (size_t i=0; i<4; ++i)
    Call_To_Library (i, ...);

Если, как вы сказали, каждый вызов Call_To_Library занимает такое большое количество времени, накладные расходы на наличие вложенных операторов OpenMP, вероятно, будут незначительными.

Кроме того, вы говорите, что у вас нет контроля над количеством потоков openmp, созданных в Call_To_Library. Это решение умножит количество потоков openmp на 4 и, скорее всего, вы увидите ускорение в 4 раза. Вероятно, внутренняя Call_To_Library была распараллелена таким образом, что одновременно можно было выполнить не более нескольких потоков openmp. С внешней параллелью вы увеличиваете это число 4 раза.

Проблема с вложенным параллелизмом может заключаться в том, что у вас есть взрыв количества потоков, созданных в одно и то же время, и поэтому вы можете видеть менее идеальное ускорение из-за накладных расходов, связанных с созданием/закрытием потоков openmp.

  • 1
    Спасибо, я думаю, мне также нужно вызвать openmp_set_nested() . Как я могу убедиться, что внешний for создает только 4 потока, а вызов библиотеки - 4 других потока? Т.е. 4х4 = 16 потоков.
  • 0
    Вы можете контролировать количество рабочих потоков openmp с помощью переменной env OMP_NUM_THREADS.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню