OpenMP: условное использование #pragma - PullRequest
12 голосов
/ 14 сентября 2011

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

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

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

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

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

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 ();
}

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

1 Ответ

7 голосов
/ 14 сентября 2011

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

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

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

...