PyCUDA内存寻址:内存偏移?

时间:2011-04-19 17:38:18

标签: python cuda addressing relative-addressing pycuda

我在设备上有大量生成的数据(A [i,j,k]),但我只需要一个'切片'的A [i,:,],并且在常规的CUDA中可以通过一些指针算法轻松完成。

在pycuda中可以做同样的事情吗?即

cuda.memcpy_dtoh(h_iA,d_A+(i*stride))

显然这是完全错误的,因为没有大小信息(除非从dest形状推断),但希望你能得到这个想法?

2 个答案:

答案 0 :(得分:2)

pyCUDA gpuArray类支持切割一维数组,但不支持需要步长的更高维度(尽管它即将到来)。但是,您可以从gpuarray成员访问多维gpuArray中的基础指针,该成员是pycuda.driver.DeviceAllocation类型,以及来自gpuArray.dtype.itemsize成员的大小信息。然后,您可以执行相同类型的指针运算,以获得驱动程序memcpy函数将接受的内容。

它不是非常pythonic,但它确实有效(或者至少它是去年我做了很多pyCUDA + MPI黑客攻击时)。

答案 1 :(得分:0)

不太可能在PyCuda中实现。

我可以考虑以下解决方案:

  1. 将整个数组 A 复制到内存中,并从感兴趣的切片中生成一个numpy数组。
  2. 创建一个读取矩阵并创建所需切片的内核。
  3. 以一种可以从指针算术一次读取切片的方式重新排列生成的数据。