2016-02-12 4 views
6

Ich habe eine Frage, wie OpenMP Pseudocode zu produzieren, wenn Sie eine bestimmte Abhängigkeit Grafik im Auge haben. So nehme an, dass wir dieses spezielle grafische Darstellung haben:Produce OpenMP-Code gegeben Abhängigkeit Diagramm

#pragma omp parallel 
    { 
     #pragma omp single 
     { 
      A(); 
      #pragma omp task B(); 
      #pragma omp task C(); 
      D(); 
      #pragma omp taskwait 
      #pragma omp task E(); 
      F(); 
     } 
    } 

Nun ist die Sache ist, dass, obwohl der Code oben tut wichtige Parallelität gelingen, Aufgabe E:

Dependence graph

Eine Lösung so etwas wie dies sein könnte muss warten, bis Task D abgeschlossen ist, und Task F muss auf den Abschluss von Task B warten, was laut Grafik nicht erforderlich ist.

Also meine Frage ist, kann mir jemand OpenMP Pseudocode geben, wo E nicht auf D warten und F wird nicht auf B für die gegebene Abhängigkeit Grafik warten?

Antwort

4

Zu diesem Zweck schlägt der OpenMP-Standard die depend Klausel für die Richtlinie vor.

In Ihrem speziellen Fall, ich denke, dies wie folgt verwendet werden:

#include <stdio.h> 

int a, b, c; 

void A() { 
    a = b = c = 1; 
    printf("[%d]In A: a=%d b=%d c=%d\n", omp_get_thread_num(), a, b, c); 
} 

void B() { 
    a++; 
    sleep(3); 
    printf("[%d]In B: a=%d\n", omp_get_thread_num(), a); 
} 

void C() { 
    b++; 
    sleep(2); 
    printf("[%d]In C: b=%d\n", omp_get_thread_num(), b); 
} 

void D() { 
    c++; 
    sleep(1); 
    printf("[%d]In D: c=%d\n", omp_get_thread_num(), c); 
} 

void E() { 
    a++; 
    sleep(3); 
    printf("[%d]In E: a=%d, b=%d\n", omp_get_thread_num(), a, b); 
} 

void F() { 
    c++; 
    sleep(1); 
    printf("[%d]In F: b=%d c=%d\n", omp_get_thread_num(), b, c); 
} 

int main() { 

    #pragma omp parallel num_threads(8) 
    { 
     #pragma omp single 
     { 
      #pragma omp task depend(out: a, b, c) 
      A(); 
      #pragma omp task depend(inout: a) 
      B(); 
      #pragma omp task depend(inout: b) 
      C(); 
      #pragma omp task depend(inout: c) 
      D(); 
      #pragma omp task depend(inout: a) depend(in: b) 
      E(); 
      #pragma omp task depend(inout: c) depend(in: b) 
      F(); 
     } 
    } 
    printf("Finally a=%d b=%d c=%d\n", a, b, c); 

    return 0; 
} 

Wie Sie sehen können, habe ich a einige Variablen eingeführt, b und c, die ich verwende Abhängigkeiten zwischen Aufgaben zu definieren. Ich modifiziere sie auch im Call entsprechend, obwohl das nicht notwendig ist (ich habe es nur gemacht, um zu zeigen, wie der Flow gehandhabt wurde).

Und hier ist das, was ich auf meiner Maschine bekommen:

~/tmp$ gcc -fopenmp depend.c 
~/tmp$ ./a.out 
[6]In A: a=1 b=1 c=1 
[7]In D: c=2 
[2]In C: b=2 
[6]In B: a=2 
[2]In F: b=2 c=3 
[6]In E: a=3, b=2 
Finally a=3 b=2 c=3 
+0

Ja, das scheint perfekt zu arbeiten. Vielen Dank! – blaze9

Verwandte Themen