условная прагма openMP «если еще»

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

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)

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

10

Решение

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

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]