Python PyCUDA内存寻址:内存偏移?
我在设备上有大量生成的数据(a[I,j,k]),但我只需要a[I,:,:]的一个“切片”,在常规CUDA中,这可以通过一些指针算法轻松实现 在pycuda中可以做同样的事情吗?i、 ePython PyCUDA内存寻址:内存偏移?,python,cuda,addressing,relative-addressing,pycuda,Python,Cuda,Addressing,Relative Addressing,Pycuda,我在设备上有大量生成的数据(a[I,j,k]),但我只需要a[I,:,:]的一个“切片”,在常规CUDA中,这可以通过一些指针算法轻松实现 在pycuda中可以做同样的事情吗?i、 e cuda.memcpy_dtoh(h_iA,d_A+(i*stride)) 显然,这是完全错误的,因为没有大小信息(除非从dest形状推断),但希望您能理解这一点。不太可能在PyCuda中实现 我可以想到以下解决办法: 在内存中复制整个数组A,并从感兴趣的切片创建一个numpy数组 创建一个读取矩阵并创建所需切
cuda.memcpy_dtoh(h_iA,d_A+(i*stride))
显然,这是完全错误的,因为没有大小信息(除非从dest形状推断),但希望您能理解这一点。不太可能在PyCuda中实现 我可以想到以下解决办法:
pyCUDA gpuArray类支持1D阵列的切片,但不支持需要跨步的更高维度(尽管即将到来)。但是,您可以从gpuArray成员(pycuda.driver.DeviceAllocation类型)访问多维gpuArray中的底层指针,并从gpuArray.dtype.itemsize成员访问大小信息。然后,您可以执行与您所想的相同类型的指针算法,以获得驱动程序memcpy函数可以接受的内容
它不是很像python,但确实有效(或者至少在去年我进行了大量pyCUDA+MPI黑客攻击时有效)。我还是选择了选项1,但将问题保留了几个小时,看看是否有其他人有我们没有想到的神奇解决方案。是的,我也这么做了,甚至超过一周。不是每个人都可以每天阅读:)