Подтвердить что ты не робот

OpenMP: условное использование #pragma

Я использую OpenMP для повышения эффективности своей работы на циклах.

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

На самом деле, я бы хотел использовать openMP только в том случае, если условие выполнено, мой код

#pragma omp parallel for
 for (unsigned i = 0; i < size; ++i)
   do_some_stuff ();

Но я хочу отключить #pragma, если размер достаточно мал i.e.:

if (size > OMP_MIN_VALUE)
  #pragma omp parallel for
for (unsigned i = 0; i < size; ++i)
do_some_stuff ();

Но не работает, лучший способ - написать цикл дважды, но я не хочу этого делать...

if (size > OMP_MIN_VALUE)
{
  #pragma omp parallel for
  for (unsigned i = 0; i < size; ++i)
    do_some_stuff ();
}
else
{
  for (unsigned i = 0; i < size; ++i)
    do_some_stuff ();
}

Каков лучший способ сделать это?

4b9b3361

Ответ 1

Я думаю, что вы сможете добиться эффекта, который вы ищете, используя необязательное schedule предложение в своей директиве parallel for:

#pragma omp parallel for schedule(static, OMP_MIN_VALUE)
 for (unsigned i = 0; i < size; ++i)
   do_some_stuff ();

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