У меня есть цикл, который может быть выполнен с помощью 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 в отдельную функцию и вызывать его таким образом?
Это интересный вопрос. В основном, вы хотите изменить schedule
политика во время выполнения. Насколько я знаю, такой директивы для текущего OpenMP нет.
У меня была точно такая же проблема, как и у тебя. Мое решение закончилось тем, что я сделал тело цикла как функцию, как вы упомянули. В противном случае вам нужно использовать некрасивый макрос.
Тем не менее, я также пытался использовать schedule(runtime)
, который читает переменную среды OMP_SCHEDULE
, Итак, я изменил эту переменную среды во время выполнения, но не работал. Это потому, что среда выполнения OpenMP читает эту среду только один раз в начале. Это может быть проблема, связанная с реализацией. Таким образом, другая реализация может читать эту переменную среды на лету. Вы можете попробовать этот подход.
Других решений пока нет …