2013-03-19 2 views
10

У меня есть цикл for, который может быть выполнен с использованием schedule(static) или schedule(dynamic, 10) в зависимости от состояния. В настоящее время мой код не DRY (Не повторяйте себе) достаточно и для размещения предыдущей функции, которые он имеет следующий повтор:openMP условная прагма "if else"

boolean isDynamic; //can be true or false 
if(isDynamic){ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10) 
    for(...){ 
     //for code inside 
    } 
}else{ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static) 
    for(...){ 
     //SAME for code inside, in fact, this is the EXACT same for as before 
    } 
} 

Прочитав эти темы, я заметил, что OpenMP имеет #if(expression) прагму:

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

Так что интересно, имеет ли OpenMPвид прагмы? Что-то вроде:

#if(isDynamic)pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(dynamic, 10) 
else 
pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(static) 

Или я вынужден поместить мой для тела цикла в отдельную функцию и называть его таким образом?

ответ

4

Это интересный вопрос. В принципе, вы хотите изменить политику schedule во время выполнения. Насколько мне известно, такой директивы для текущего OpenMP не существует.

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

Однако я также попытался использовать schedule(runtime), который считывает переменную окружения OMP_SCHEDULE. Итак, я изменил эту переменную среды во время выполнения, но не работал. Это связано с тем, что среда OpenMP читает эту среду только один раз в начале. Это может быть проблема, связанная с реализацией. Таким образом, другая реализация может читать эту переменную среды «на лету». Вы можете попробовать этот подход.

+0

Я предполагаю, что вы говорите об этом предложении (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, я не думаю, что даже компилирует, OMP_FOR даже не определен. Что касается OMP_SCHEDULE, я понятия не имел об этом. Я постараюсь посмотреть вокруг и посмотреть, что я могу найти, THX! –