2016-05-18 18 views
0

Ich muss die Ausführungszeit einer Schleife mit verschiedenen Scheduling-Typ und Thread-Nummer mit openMP vergleichen.Wie dynamisch Scheduling-Typ wählen?

I Themen Nummer dynamisch, indem ein int Variable direkt im Pragma Makro einstellen:

int threads_number = 4; 
#pragma omp parallel for num_threads(threads_number) 

Aber ich versuche zu tun, das gleiche für schedule, ich static, dynamic und guided Typen vergleichen müssen . Aber es scheint, dass ich einen int als enum oder einen char* als Namen für diesen nicht verwenden kann.

Gibt es eine Möglichkeit, es dynamisch zu wählen, oder muss ich die Schleife 3 mal schreiben und wählen, welche mit einer if aufrufen, die irgendwie schmutzig scheint?

Antwort

3

Sie können die Art der Planung festlegen, wenn der angewendete Zeitplan runtime lautet.

Wenn der Zeitplan (Laufzeit) angegeben ist, wird die Entscheidung bezüglich der Planung auf die Laufzeit verschoben. Die Art und Größe der Chunks für den Zeitplan kann zur Laufzeit durch Setzen der Umgebungsvariablen OMP_SCHEDULE festgelegt werden. Wenn diese Umgebungsvariable nicht festgelegt ist, ist der resultierende Zeitplan implementierungsdefiniert. Wenn schedule (Laufzeit) angegeben ist, darf chunk_size nicht angegeben werden. - OpenMP-4.5 Specification

Dies wird mit der Funktion getan void omp_set_schedule(omp_sched_t kind, int chunk_size);

Die Arten Planung, die in omp.h als dieser Enum unter

typedef enum omp_sched_t { 
    omp_sched_static = 1, 
    omp_sched_dynamic = 2, 
    omp_sched_guided = 3, 
    omp_sched_auto = 4 
} omp_sched_t; 
+1

Hinweis definiert zur Verfügung, die mit Zeitplan (Laufzeit) und dann omp_sched_static kann leicht schlechtere Ergebnisse für den statischen Zeitplan liefern, als wenn der Compiler wüsste, dass der Zeitplan zum Zeitpunkt der Kompilierung statisch war. Das liegt daran, dass der Compiler, wenn er weiß, dass der Zeitplan statisch ist, besseren Code generieren kann, der keine Aufrufe in die Laufzeit für die Planung innerhalb der Schleife hat. Wenn der Zeitplan jedoch dynamisch sein kann, muss er ein teurereres Codegenerierungsmuster verwenden, das einen Zeitplanungsaufruf für jeden "Blockgrößen" -Satz von Iterationen vornimmt. –