У меня есть цикл 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)
прагма:
- OpenMP: условное использование #pragma
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- Выберите OpenMP pragma в соответствии с условием
- Условный "pragma omp"
- http://openmp.org/mp-documents/ntu-vanderpas.pdf
Но хотя я видел много людей с моей проблемой, похоже, не хватает общего решения. Лучшее решение - преобразовать тело цикла 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)
Или мне пришлось поместить мое тело цикла в отдельную функцию и назвать его таким образом?