2014-01-09 71 views
0

我正在使用CAPS OpenACC編譯器。我試圖在OpenACC雜注行中的結構數據類型中使用動態數組。我的代碼是這樣的:在OpenACC編譯指示行中使用struct datatype

struct Structure{ 
     int val[n]; 
     int length; 
     int *valdyn; 
}; 
#pragma acc parallel copyin(sa,sb) copyout(c[0:n]) 
{ 
    #pragma acc loop 
    for (int i = 0; i < n; i++) 
    c[i] = sa.valdyn[i] + sb.valdyn[i]; 
} 

它編譯成功。但是,當我試圖運行,我得到了這些錯誤

terminate called after throwing an instance of 'hmpperr::DeviceError' 
    what(): cuCtxSynchronize() failed: Launch failed (700) 

所以我的問題是,有沒有什麼辦法與OpenACC的一起使用結構數據類型? 而且我的情況也適用於結構的結構類似:

struct Structure{ 
    int val[20]; 
    int length; 
    struct Other_Struct *Residue ; 
    int *valdyn;  
}; 

回答

5

在OpenACC的,你只能用指針來連續數據OpenACC的數據條款 - 否則編譯器不知道如何將數據複製到設備。 通常,只要沒有指向其他數據結構的指針或數組,就可以使用Struct類型。 你有一個指針傳遞給VAL,而不是指向保存它的結構,因此,例如:

struct Structure{ 
    int val[n]; 
    int length; 
    int *valdyn; 
}; 
int * sa_valdyn = sa.valdyn; 
int * sb_valdyn = sb.valdyn; 
#pragma acc parallel copyin(sa_valdyn[0:n],sb_valdyn[0:n]) copyout(c[0:n]) 
{ 
#pragma acc loop 
for (int i = 0; i < n; i++) 
c[i] = sa_valdyn[i] + sb_valdyn[i]; 
} 

應該工作。還要注意,您需要知道valdyn的大小才能將數據複製到設備。

+0

感謝您的回答@Ruyk。因此,只使用連續的數據傳輸是OpenACC Standart,對吧? – grypp

+0

是的。否則,編譯器將會非常複雜地瞭解如何將數據複製到設備。 – Ruyk

+0

你說得對。編譯器會在分析階段工作太多以決定複製數據。那麼,讓我們拭目以待cuda 6.0 :) http://devblogs.nvidia.com/parallelforall/wp-content/uploads/sites/3/2013/11/deep_copy-624x307.png 但我不知道, OpenCL側統一內存的情況如何。也許它已經宣佈。 – grypp