0

ネストされたデータ環境でのこれら 2 つの句の動作を明確にするために、この質問をお願いします。

初めて openACC API を読んだとき、次のコードがあればと思いました。

#pragma acc create(a[0:20])
{
  #pragma acc pcopyin(a[0:20])
  {
    ...
  }
} 

最初の句で必要なメモリがアクセラレータに割り当てられ、次にpcopyin句でデータがホストからアクセラレータに (割り当てなしで) コピーされました。

th API の v2 のドラフトを読んでいるとpcopyin、データがアクセラレータに既に割り当てられているため、2 番目の句はまったく何もしないことがわかります。また、データはアクセラレータに既に存在するため、割り当ても転送も行われません。 . そうですか?

この種の例で CAPS コンパイラをテストしたところ、期待どおりの動作が得られたと思います。API のあいまいさが原因でしたか? v2 で、このようなことをしたい場合、copyin 句を更新で置き換える必要がありますか?

4

1 に答える 1

1

あなたは v1.0 仕様を間違って解釈したと思います (間違って読むのは簡単です。あなただけではありません)。"present_or_ something " は、変数のリストがまだ存在しない場合にのみ" something " を実行します。

したがって、あなたの場合、「#pragma acc pcopyin(a[0:20])」は何もしないでください (「作成」のため、CAPS Compiler 3.3.2 でここで動作を確認すると発生します)

動作を確認するために私が書いた例を次に示します (present_or_copyin(a[0:20] を copyin(a[0:20] に変更して、動作が異なることを確認してください: " および "present_or_copyin" であるため、present_or_copyin または "copyin" は異なる結果になります):

#include <stdio.h>

int main(void) {

    int a[20], b[20], i;

    for (i = 0; i < 20; i++) {
        a[i] = 42;
    }


    #pragma acc data, create(a[0:20]) copyout(b[0:20])
    {
    // will upload the array of 42
        #pragma acc data copyin(a[0:20])
        {
            // executed on the host, not seen on GPU
            for (i = 0; i < 20; i++) {
                a[i] = 666;
            }
            // has no effect: already present
            #pragma acc data present_or_copyin(a[0:20])
            {
                #pragma acc kernels, private(i)
                #pragma acc loop independent
                for (i = 0; i < 20; i++) {
                    a[i] += i;
                }
                #pragma acc kernels, private(i)
                #pragma acc loop independent
                for (i = 0; i < 20; i++) {
                    b[i] = a[i];
                }

            }
        }
    }
    for (i = 0; i < 20; i++) {
        printf("%d, ", b[i]);
    }
    printf("\n");

}

「present_or_copyin」を使用して、このサンプル プログラムは次のように記述します。

42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,

「copyin」を使用して、このサンプル プログラムは次のように記述します。

666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685,

于 2013-04-09T12:34:03.937 に答える