我認爲你已經解釋了v1.0規格錯誤(很容易讀錯,你並不孤單)。 「present_or_ something」「」「只有當變量列表尚不存在時。所以在你的情況下,「#pragma acc pcopyin(a [0:20])」不應該做任何事情(因爲「create」,這是我在使用CAPS Compiler 3.3檢查行爲時發生的情況。 2
這是我寫的檢查行爲的示例(請將present_or_copyin([0:20]更改爲copyin(a [0:20])以查看行爲是不同的:我修改數組「a 「之間的‘存在’和‘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,
好了,感謝您的答案。我以爲我誤解了v1.0規格錯誤,但我想要確認一下。我將再次用CAPS編譯器檢查我的例子,看看會發生什麼。我可能犯了一些錯誤。 – chabachull 2013-04-10 07:02:10