2016-08-23 90 views
1

我想寫一個與OpenACC並行的面向對象的C++代碼。 我能夠在OpenACC上找到一些stackoverflow問題和GTC會談,但我找不到一些面向對象的代碼的真實世界的例子。OpenACC和麪向對象的C++

this question中顯示了一個OpenACCArray的示例,它在後臺執行一些內存管理(代碼可在http://www.pgroup.com/lit/samples/gtc15_S5233.tar處獲得)。 但是,我想知道是否可以創建一個管理更高級別的數組的類。例如。

struct Data 
{ 

// OpenACCArray<float> a; 

    OpenACCArray<Vector3<float>> a3; 

    Data(size_t len) { 
#pragma acc enter data copyin(this) 
//  a.resize(len); 
     a3.resize(len); 
    } 
    ~Data() { 
#pragma acc exit data delete(this) 
    } 
    void update_device() { 
//  a.update_device(); 
     a3.update_device(); 
    } 
    void update_host() { 
//  a.update_host(); 
     a3.update_host(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    const size_t len = 32*128; 
    Data d(len); 

    d.update_device(); 
#pragma acc kernels loop independent present(d) 
    for (int i=0; i < len; ++i) { 
    float val = (float)i/(float)len; 

    d.a3[i].x = val; 
    d.a3[i].y = i; 
    d.a3[i].z = d.a3[i].x/d.a3[i].y; 
    } 
    d.update_host(); 
    for (int i=0; i < len/128; ++i) { 
     cout << i << ": " << d.a3[i].x << "," << d.a3[i].y << "," << d.a3[i].z << endl; 
    } 
    cout << endl; 
    return 0; 
} 

有趣的是該程序的工作原理,但只要我去掉OpenACCArray<float> a;,即其他成員添加到數據結構,我得到的內存錯誤。 FATAL ERROR: variable in data clause is partially present on the device

由於OpenACCArray結構是一個平面結構,它自己處理指針間接方向,它應該能夠將其複製爲成員? 還是需要是一個指向結構的指針,並且指針必須與指令硬連線? 然後我擔心我必須使用別名指針的問題,正如jeff larkin在the above mentioned question上建議的那樣。 我不介意做這項工作,但我找不到任何參考如何做到這一點。 使用編譯器指令keepgpu,keepptx有助於理解編譯器正在做什麼,但我寧願選擇反向工程生成的ptx代碼。

任何指向有用的參考項目或文件的指針都會受到高度讚賞。

+0

? – jefflarkin

+0

另外,你可以請包括你的Vector3的定義?我猜測,但是想確認我們正在建造同樣的東西。 – jefflarkin

+0

@jefflarkin感謝您的幫助。我正在使用自定義類,但是,更改了代碼以使用tarball中示例2中的float3。這裏有一個代碼https://gist.github.com/danielwinkler/12ab5b73221faca89d69d83d72c633b7 – dwn

回答

1

在OpenACCArray1.h標題中,刪除兩個「#pragma acc enter data create(this)」編譯指示。發生的是「數據」構造函數在設備上創建「a」和「a3」對象。因此,當在OpenACCArray構造函數中遇到第二個輸入數據區域時,設備這個指針已經在那裏。

由於「a3」和「數據」共享此指針的相同地址,因此只有一個數據成員時才起作用。因此,當遇到第二個輸入數據附註時,本檢查發現它已經在設備上,因此不會再次創建它。當添加「a」時,「數據」的大小是「a」的兩倍,因此本檢查發現該指針已經存在,但與以前大小不同。這就是「部分存在」錯誤的含義。數據在那裏,但與預期的大小不同。

只有父類/結構應該在設備上創建這個指針。

希望這有助於你從例如使用壓縮包上OpenACCArray哪個版本 墊

+0

謝謝你的解釋,澄清行爲。我會按照你的建議。 – dwn