Выберите прагму OpenMP в соответствии с условием - PullRequest
4 голосов
/ 20 февраля 2012

У меня есть код, который я хочу оптимизировать, который должен работать с различными потоками.После выполнения некоторых тестов с использованием различных техник планирования в цикле for, который у меня есть, я пришел к выводу, что лучше всего выполнять динамическое планирование, когда у меня только один поток, и руководствуюсь иначе.Возможно ли это даже в openMP?

Точнее, я хочу иметь возможность сделать что-то вроде следующего:

if(omp_get_max_threads()>1)
#pragma omp parallel for .... scheduling(guided)
else
#pragma omp parallel for .... scheduling(dynamic)
for(.....){
  ...
}

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

1 Ответ

8 голосов
/ 20 февраля 2012

Возможное решение - скопировать цикл в оператор if и «извлечь» тело цикла в функцию, чтобы избежать нарушения принципа DRY . Тогда будет только одно место, где вы должны будете изменить этот код, если вам понадобится изменить его в будущем:

void foo(....)
{
   ...
}

if(omp_get_max_threads()>1)
{
    #pragma omp parallel for .... scheduling(guided)
    for (.....)
        foo(....);
}
else
{
    #pragma omp parallel for .... scheduling(dynamic)
    for (.....)
        foo(....);
}
...