我在设备上有大量生成的数据(A[i,j,k]),但我只需要 A[i,:,:] 的一个“切片”,在常规 CUDA 中这很容易用一些指针算术完成。
在pycuda中可以做同样的事情吗?IE
cuda.memcpy_dtoh(h_iA,d_A+(i*stride))
显然这是完全错误的,因为没有尺寸信息(除非从 dest 形状推断),但希望你明白吗?
我在设备上有大量生成的数据(A[i,j,k]),但我只需要 A[i,:,:] 的一个“切片”,在常规 CUDA 中这很容易用一些指针算术完成。
在pycuda中可以做同样的事情吗?IE
cuda.memcpy_dtoh(h_iA,d_A+(i*stride))
显然这是完全错误的,因为没有尺寸信息(除非从 dest 形状推断),但希望你明白吗?
pyCUDA gpuArray 类支持一维数组的切片,但不支持需要跨步的更高维度(尽管它即将到来)。但是,您可以从 gpuarray 成员(它是 pycuda.driver.DeviceAllocation 类型)访问多维 gpuArray 中的底层指针,并从 gpuArray.dtype.itemsize 成员中获取大小信息。然后,您可以执行您想到的相同类型的指针运算,以获得驱动程序 memcpy 函数将接受的东西。
它不是很pythonic,但它确实有效(或者至少在我去年做很多pyCUDA + MPI hacking时它确实有效)。
不太可能在 PyCuda 中实现。
我可以考虑以下解决方案: