2013-03-19 9 views
10

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:

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?

Antwort

4

Dies ist eine interessante Frage. Grundsätzlich möchten Sie die Richtlinie schedule zur Laufzeit ändern. Soweit ich weiß, gibt es keine solche Richtlinie für das aktuelle OpenMP.

Ich hatte genau das gleiche Problem, das Sie getan haben. Meine Lösung endete damit, den Schleifenkörper als eine Funktion zu gestalten, wie Sie erwähnt haben. Andernfalls müssen Sie ein hässliches Makro verwenden.

Allerdings habe ich auch versucht, schedule(runtime) zu verwenden, die die Umgebungsvariable OMP_SCHEDULE liest. Also habe ich diese Umgebungsvariable zur Laufzeit geändert, aber nicht funktioniert. Das liegt daran, dass die OpenMP-Laufzeitumgebung diese Umgebung nur einmal am Anfang liest. Dies kann ein umsetzungsspezifisches Problem sein. Eine andere Implementierung kann diese Umgebungsvariable im laufenden Betrieb lesen. Sie können diesen Ansatz versuchen.

+0

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! –