1

PGI 14.10 を使用して OpenACC のキャッシュ句を試しています。[1] のスライドに基づいた単純なループがあります。

#include <stdlib.h>

int main(int argc, char **argv) {
    int N = 1024;
    int *restrict x = (int *)malloc(sizeof(int) * N);
    int *restrict y = (int *)malloc(sizeof(int) * N);

#pragma acc parallel loop copy(x[0:N], y[0:N])
    for (int i = 1; i < N - 1; i++) {
#pragma acc cache(x[i-1:2])
        y[i] = (x[i - 1] + x[i + 1]) / 2.0;
    }
    return 0;
}

--metrics shared_load_transactions,shared_store_transactions を指定して nvprof でこれを実行すると、ロードもストアも報告されません。それで、キャッシュディレクティブは私が望む効果を持っていませんか(もしそうなら、なぜそれが機能しないのですか)? それとも、nvprof を使用して共有トランザクションを測定するのは間違っていますか?

Minfo の出力は以下のとおりです。

[1] http://www.pgroup.com/lit/presentations/cea-3.pdf

main:
      6, Generating copy(x[:N])
         Generating copy(y[:N])
         Accelerator kernel generated
          9, #pragma acc loop gang, vector(256) /* blockIdx.x threadIdx.x */
      6, Generating Tesla code
4

1 に答える 1

3

PGI フォーラムで回答: http://www.pgroup.com/userforum/viewtopic.php?t=4611&start=0&postdays=0&postorder=asc&highlight=

どうやら、キャッシュ ディレクティブは PGI 14.x コンパイラでほぼ完全に無効になっていましたが、2015 バージョンで利用できるようになります。

于 2014-12-18T23:10:03.797 に答える