あなたは 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,