У меня есть цикл 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)
прагму:
- OpenMP: conditional use of #pragma
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- Choose OpenMP pragma according to condition
- Conditional "pragma omp"
- http://openmp.org/mp-documents/ntu-vanderpas.pdf
Но хотя я видел много людей с моей проблемой, по-видимому, отсутствует общее решение. Лучшее решение - преобразовать тело цикла 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)
Или я вынужден поместить мой для тела цикла в отдельную функцию и называть его таким образом?
Я предполагаю, что вы говорите об этом предложении (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, я не думаю, что даже компилирует, OMP_FOR даже не определен. Что касается OMP_SCHEDULE, я понятия не имел об этом. Я постараюсь посмотреть вокруг и посмотреть, что я могу найти, THX! –