Ich habe eine for-Schleife, die je nach Bedingung mit schedule(static)
oder schedule(dynamic, 10)
ausgeführt werden kann. Derzeit Mein Code nicht trocken ist (Sie sich nicht wiederholen) genug und die bisherige Funktionalität aufzunehmen es die folgende Wiederholung hat:openMP bedingte Pragma "wenn sonst"
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
}
}
Nachdem diese Threads lesen, bemerkte ich, dass OpenMP eine #if(expression)
Pragma hat:
- 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
Aber obwohl ich viele Menschen mit meinem Problem gesehen habe, scheint es eine allgemeine Lösung zu fehlen. Die beste Lösung ist, den Körper der for-Schleife in eine Funktion zu transformieren und dann die Funktion aufzurufen, aber diese Lösung ist nicht gut genug für mich.
Also frage ich mich, hat OpenMP eine Art von Pragma #if(expression) else
? Etwas wie:
#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)
Oder bin ich für Schleifenkörper in eine separate Funktion zu setzen gezwungen und es auf diese Weise nennen?
Ich nehme an, Sie sprechen über diesen Vorschlag (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, ich glaube nicht, dass selbst kompiliert wird, OMP_FOR ist nicht einmal definiert. Soweit OMP_SCHEDULE geht, hatte ich keine Ahnung davon. Ich werde versuchen, mich umzusehen und zu sehen, was ich finden kann, thx! –