PyCUDA 内存地址:内存偏移?
我有一大堆生成的数据(A[i,j,k])在设备上,但我只需要其中的一部分,也就是A[i,:,:]。在普通的CUDA中,这个操作可以通过一些指针运算轻松实现。
那么在pycuda中也能做到这一点吗?也就是说:
cuda.memcpy_dtoh(h_iA,d_A+(i*stride))
显然,这个写法完全不对,因为没有大小的信息(除非从目标形状推断出来),但希望你能明白我的意思?
2 个回答
0
在PyCuda中实现这个功能的可能性不大。
我能想到以下几种解决方案:
- 把整个数组A复制到内存中,然后从中提取出你需要的部分,做成一个numpy数组。
- 创建一个内核程序,读取这个矩阵并生成你想要的那部分数据。
- 重新整理生成的数据,这样你就可以通过指针运算一次读取一部分。
2
pyCUDA的gpuArray类支持对一维数组进行切片,但对需要步幅的高维数组支持还不够(不过这个功能正在开发中)。不过,你可以通过gpuarray这个成员访问多维gpuArray的底层指针,这个成员是pycuda.driver.DeviceAllocation类型的。同时,你也可以通过gpuArray.dtype.itemsize成员获取大小信息。这样,你就可以进行你想要的指针运算,以便得到驱动程序的memcpy函数可以接受的内容。
虽然这不是很符合Python的风格,但确实可以工作(至少在我去年做很多pyCUDA和MPI相关的工作时是这样)。