0

カーネル構造に関連するものがあるのだろうか。カーネル内のすべての行が GPU で動作するわけではありませんか?

たとえば、私はこのコードを持っています:

#pragma acc kernels copy(a[0:n],b[0:n])
    {
        #pragma acc loop
        for (i = 0; i < n; i++)
            a[i] = i+10;   
        a[1] = 10;
        a[3] = 5;
        #pragma acc loop
        for (i = 0; i < n; i++)
            b[i] = i+20;
    }

また、ACCパラレル構造でも同じですか?

4

1 に答える 1

1

カーネル構造について、仕様を引用します。

コンパイラは、カーネル領域のコードを一連のアクセラレータ カーネルに分割します。通常、各ループ ネストは個別のカーネルになります。プログラムが kernels コンストラクトに遭遇すると、デバイス上で一連のカーネルを順番に起動します。

だからシーケンス

a[1] = 10;
a[3] = 5;

2 つのループの間に配置したものは、デバイス上で実行できます。問題は、このコードがループ内にないため、OpenACC コンパイラが GPU で実行するために 1 回だけ反復する「偽の」ループを作成する必要があることです。これを行うと時間がかかることが多いため、一部の OpenACC コンパイラは、データをダウンロードした後、ホスト上でこのような連続行を実行することを好みます。

並列セクションの場合、答えは簡単です。すべてのコードは常にデバイス上で実行されます。

于 2013-06-11T08:12:23.257 に答える