2013-04-08 18 views
0

我問這個問題要清楚這兩個子句在嵌套數據環境中的行爲。pcopyin創建後

當我第一次讀到了OpenACC的API,我想,如果我有下面的代碼:

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

第一款分配油門必要的內存,然後​​條款複製從數據主機加速器(不分配)。

現在讀取第2版API的草稿,我的理解是第二個​​子句沒有做任何事情,因爲數據已經分配在加速器上,並且由於數據已經存在於加速器中,所以沒有分配也不應該發生轉移。是對的嗎?

當我用這種例子測試CAPS編譯器時,我想我得到了我期望的行爲。這是正確的,因爲在API中含糊不清?有了v2,如果我想要做這種事情,我應該用更新來替換我的copyin子句嗎?

回答

1

我認爲你已經解釋了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,

+0

好了,感謝您的答案。我以爲我誤解了v1.0規格錯誤,但我想要確認一下。我將再次用CAPS編譯器檢查我的例子,看看會發生什麼。我可能犯了一些錯誤。 – chabachull 2013-04-10 07:02:10