我想寫一個與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代碼。
任何指向有用的參考項目或文件的指針都會受到高度讚賞。
? – jefflarkin
另外,你可以請包括你的Vector3的定義?我猜測,但是想確認我們正在建造同樣的東西。 – jefflarkin
@jefflarkin感謝您的幫助。我正在使用自定義類,但是,更改了代碼以使用tarball中示例2中的float3。這裏有一個代碼https://gist.github.com/danielwinkler/12ab5b73221faca89d69d83d72c633b7 – dwn