c++ - OpenACC 和面向对象的 C++

标签 c++ openacc

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

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 struct 是一个平面结构,它自己处理指针间接寻址它应该可以将它复制为成员吗? 还是需要指向结构的指针并且指针必须与指令硬连接? 然后我担心我必须使用别名指针的问题,正如 jeff larkin 在 the above mentioned question 所建议的那样. 我不介意做这项工作来让它运行,但我找不到任何引用如何做到这一点。 使用编译器指令 keepgpu,keepptx有助于理解编译器在做什么,但我更喜欢逆向工程生成的 ptx 代码的替代方法。

非常感谢任何指向有用的引用项目或文档的指针。

最佳答案

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

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

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

希望对您有所帮助, 垫子

关于c++ - OpenACC 和面向对象的 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39095908/

相关文章:

C++ 缩放图形内容

c++ - 从 C++ 中的非原始对象 vector 中删除所有匹配元素

c++ - cmake制作多个可执行文件

OpenACC 的 C/预处理器标准宏?

c++ - C/C++ 和 GNU/PGI : undefined reference to `__pgio_ini'

c++ - OpenACC CPU 与 GPU 优化

c - 删除 C 中的数据依赖

c++ - Golang CGO异常0x40010006

rust - 从 Rust 调用 OpenACC 代码不在 GPU 上运行

c++ - 我的小 std::unique 示例不起作用