是否有任何 OpenAcc 编译器支持将包含可分配数组的派生类型复制到 GPU 或从 GPU 复制以及它们在加速代码中的使用?
OpenACC 规范 (v2.0) 声明这是可能的,但我无法在任何地方的编译器中找到它。PGI 编译器支持派生类型,但似乎不支持那些包含可分配数组的类型(请参阅PGI 论坛上的此页面)。虽然自他们以来这可能已经改变,但它似乎并没有在任何地方被宣传(很好)。
是否有任何 OpenAcc 编译器支持将包含可分配数组的派生类型复制到 GPU 或从 GPU 复制以及它们在加速代码中的使用?
OpenACC 规范 (v2.0) 声明这是可能的,但我无法在任何地方的编译器中找到它。PGI 编译器支持派生类型,但似乎不支持那些包含可分配数组的类型(请参阅PGI 论坛上的此页面)。虽然自他们以来这可能已经改变,但它似乎并没有在任何地方被宣传(很好)。
目前我无法访问 Cray 或 CAPS 编译器,并且 PGI 编译器不支持此功能。一个合适的解决方法似乎是在派生类型中创建一个指向可分配数组的指针,并使用该copy
子句将其复制到 GPU。如果 PGI 编译器的未来版本支持这种深拷贝,那么我将更新答案。
您认为 OpenACC 2.0 在哪里说明了这一点?
我在 2013 年 6 月的 2.0 版中找到的相关参考资料是:
第 13 页“完全支持 Fortran 派生类型和派生类型成员,包括可分配和指针成员。”
第 26-27 页“在 Fortran 中,如果指定了具有派生类型的变量或数组,则该派生类型的所有成员都将根据需要进行分配和复制。如果任何成员具有 OpenACC 编程接口 27 可分配或指针属性,则数据通过该成员访问的内容不会被复制。”
第二个引用明确指出,目前不支持在派生类型内复制可分配对象和指针对象的内存。
技术委员会正在努力“修复此问题”,但尚未发布解决方案。
Cray 提供了一个命令行选项来打开对“深拷贝”的支持。这是 Cray 扩展,因此不是便携式解决方案。