Я использую библиотеку, которая уже распараллеливается с 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 секунд.
Если между итерациями этого цикла нет зависимости, вы можете:
#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.
openmp_set_nested()
. Как я могу убедиться, что внешний for создает только 4 потока, а вызов библиотеки - 4 других потока? Т.е. 4х4 = 16 потоков.