6

特定の依存関係グラフを念頭に置いている場合に OpenMP 疑似コードを生成する方法について質問があります。したがって、次の特定のグラフがあるとします。

依存グラフ

解決策は次のようになります。

    #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

1 に答える 1

4

この目的のために、OpenMP 標準はディレクティブのdepend句を提案しています。task

あなたの特定のケースでは、これは次のように使用できると思います。

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

ご覧のとおり、いくつかの変数を導入し、aタスク間の依存関係を定義するために使用していますbcそれに応じて呼び出しでそれらを変更しますが、これは必要ではありません (フローがどのように処理されるかを示すためだけに行いました)。

そして、これが私のマシンで得られるものです:

~/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
于 2016-02-13T06:18:47.773 に答える