OpenMP условная прагма "if else"

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

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(expression) else вид прагмы? Что-то вроде:

#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)

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

Ответ 1

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

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

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