2014-11-08 94 views
0

我在OpenACC中做了一個非常簡單的向量添加內核。我想知道這是否與我使用的編譯器有關(與OpenCL一起使用)有問題,因爲我遇到問題,似乎將數據從設備複製回主機。所有的結果都是正確的但是結果[0]。例如。下面的代碼:OpenACC邊界問題

for (i=0; i<VEC_SIZE; i++) { 
    a[i] = i; 
    b[i] = VEC_SIZE-i; 
    result[i]=0; 
    } 
    #pragma acc kernels copyin(a,b) copy(result) 
    for (i=0; i<VEC_SIZE; i++) { 
    result[i] = a[i]+b[i]; 
    } 

    // verify result 
    for (i=0; i<VEC_SIZE; i++) { 
    if ((a[i] + b[i]) != result[i]) { 
     fprintf(stderr, "Incorrect results id %d val: %d \n", i, result[i]); 
    } 
    } 

返回如下:

Incorrect results id 0 val: 0 

這意味着所有的結果,但在索引0是正確的,它好像reuslt索引零時,無法從設備複製了一個。

這是一個編譯器/運行時錯誤還是我錯過了我的編碼方面的東西?

+0

該代碼看起來對我很好。我圍繞你在這裏展示的內容構建了一個完整的代碼和測試用例,並使用PGI 14.9工具對其進行編譯,並且它似乎工作正常。例子是[here](http://pastebin.com/jXKGWVAC) – 2014-11-08 16:41:25

+0

太棒了,它看起來非常像我的accULL中的一個bug。非常感謝您的確認。如果你想,你可以發佈並答覆我可以接受。 – AzaraT 2014-11-08 16:53:32

+0

也許更好,當你發現修復是什麼的時候,回來回答這個問題。這對未來的讀者會更有用。或者也許別人會來爲你排序。你正在使用最新版本的accull?它似乎是0.3,但似乎你也可以從[主分支](https://bitbucket.org/ruyman/accull/)下載,它可能會給你「0.3.1」似乎還有一個[accull支持郵件列表](https://groups.google.com/forum/#!forum/accull)。 – 2014-11-08 17:18:24

回答

0

是的,我也認爲這是你的編譯器的一個bug,因爲你的代碼看起來不錯,你可以試試PGI編譯器,現在我正在使用它,它現在屬於NVIDIA。 此外,您可以將您的代碼「複製(結果)」更改爲「copyout(result)」,以減少內存I/O時間,因爲結果的初始值對於設備而言是無用的。