OpenACC和面向对象的C ++

时间:2016-08-23 08:19:36

标签: c++ openacc

我正在尝试编写一个与OpenACC并行化的面向对象的C ++代码。 我能够在OpenACC上找到一些stackoverflow问题和GTC演讲,但我找不到面向对象代码的一些真实世界的例子。

this question中,显示了OpenACCArray的示例,该示例在后台执行了一些内存管理(代码在http://www.pgroup.com/lit/samples/gtc15_S5233.tar处可用)。 但是,我想知道是否有可能创建一个在更高级别管理阵列的类。 E.g。

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;,即向该Data结构添加另一个成员,我就会出现内存错误。 FATAL ERROR: variable in data clause is partially present on the device

由于OpenACCArray结构是一个平面结构,它自己处理指针间接,它应该将它复制为成员吗? 或者确实需要是指向结构的指针,指针必须与指令硬连接? 然后我担心我必须使用jeff larkin在the above mentioned question建议的别名指针。 我不介意做这个运行的工作,但我找不到任何参考如何做到这一点。 使用编译器指令keepgpu,keepptx有助于理解编译器正在做什么,但我更倾向于使用逆向工程生成的ptx代码。

非常感谢任何有用的参考项目或文档的指示。

1 个答案:

答案 0 :(得分:1)

在OpenACCArray1.h标头中,删除两个“#pragma acc enter data create(this)”pragma。发生的事情是“数据”构造函数在设备上创建“a”和“a3”对象。因此,当在OpenACCArray构造函数中遇到第二个输入数据区域时,设备此指针已经存在。

当只有一个数据成员时它起作用,因为“a3”和“Data”共享该指针的相同地址。因此,当遇到第二个输入数据编译指示时,当前检查看到它已经在设备上,因此不再创建它。当添加“a”时,“Data”的大小是“a”的两倍,因此当前检查看到该指针已经存在但是具有与之前不同的大小。这就是“部分存在”错误的含义。数据存在,但与预期的大小不同。

只有父类/结构应该在设备上创建this指针。

希望这有帮助, 垫