Mam pętlę for, która może być wykonana przy użyciu schedule(static)
lub schedule(dynamic, 10)
w zależności od warunku. Obecnie Mój kod nie jest suche (dry) i wystarczająco, aby pomieścić poprzednią funkcjonalność Posiada następujące powtórzenia:Pragm acja warunkowa 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
}
}
Po przeczytaniu tych tematów, zauważyłem, że OpenMP ma #if(expression)
pragmy:
- 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
Ale chociaż widziałem wielu ludzi z moim problemem, nie wydaje się być pozbawiony ogólne rozwiązanie. Najlepszym rozwiązaniem jest przekształcenie ciała pętli for w funkcję, a następnie wywołanie funkcji, ale to rozwiązanie nie jest dla mnie wystarczająco dobre.
Więc zastanawiam się, czy OpenMP ma jakiś rodzaj pragmy z #if(expression) else
? Coś jak:
#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)
Albo jestem zmuszony Place My dla ciała pętli do oddzielnego funkcji i wywołać ją w ten sposób?
Zakładam, że mówisz o tej sugestii (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, nie sądzę, że nawet kompiluje, OMP_FOR nawet nie jest zdefiniowany. Jeśli chodzi o OMP_SCHEDULE, nie miałem o tym pojęcia. Spróbuję rozejrzeć się i zobaczyć, co mogę znaleźć, thx! –