如何使用PGI cuda fortran编译器将设备阵列的一部分转移到另一个设备阵列?

时间:2019-04-10 12:20:33

标签: cuda fortran pgi

现在,我想使用以下代码将一个设备阵列转移到另一个设备阵列:

program main
  implicit none
  integer :: a(5,5,5,5)
  integer, device :: a_d(5,5,5,5),b_d(5,5,5,5)
  a=0
  a_d=a
  b_d(1:2,:,:,:)=a_d(2:3,:,:,:)
end program

pgi编译器针对b_d(1:2,:,:,:)=a_d(2:3,:,:,:)返回以下错误:

  

PGF90-S-0519-分配中的多个设备驻留对象。

如何解决此问题,或者是否有一种有效的方法将仅一部分设备阵列转移到另一个设备阵列?

1 个答案:

答案 0 :(得分:1)

文档中的内容如下:

  

3.4.2。表达式中的隐式数据传输

     

表达式中可以包含一些有限的数据传输。在   通常,经验法则是所有算术或运算必须发生   在主机上,通常只允许一个设备阵列出现在主机上   表达式的右侧。

我敢肯定,这意味着不支持您尝试执行的切片分配,因为表达式的左侧有一个设备数组。

我不确定什么是解决此问题的最佳方法。如果您可以推断出阵列的间距,cudaMemcpy2D绝对可以工作。希望PGI的人可以将解决方案编辑到该社区Wiki条目中。