2016-02-12 12 views
6

特定の依存関係グラフを念頭に置いてOpenMP擬似コードを生成する方法について質問があります。依存関係グラフでOpenMPコードを生成

Dependence graph

ソリューションは、このようなものが考えられます: だから私たちは、この特定のグラフがあるとし

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

今のものである上記のコードは、重要な並列処理を成功んが、タスクEタスクDが完了するのを待たなければならず、タスクFはタスクBが完了するのを待たなければならず、これはグラフに従って必要ではない。

私の質問は、誰かがEがDを待たずにFが与えられた依存関係グラフのBを待たないOpenMP擬似コードを私に提供することができますか?

答えて

4

このため、OpenMP標準ではtaskディレクティブにdepend句が提案されています。あなたの特定のケースで

、私はこれは次のように使用することができ推測:あなたが見ることができるように

#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; 
} 

、私は、タスク間の依存関係を定義するために使用するいくつかの変数abcを導入しました。私はそれに応じてコールに応じて変更しますが、これは必須ではありません(私はフローの処理方法を示すためにのみ行った)。ここ

そして、私は私のマシン上で得るものです:

~/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

ええ、それは完璧に動作するようです。ありがとうございました! – blaze9

関連する問題