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