2011-04-19 96 views
1

我已经在设备上生成了大量的数据(A [i,j,k]),但我只需要A [i,:,]的一个'slice',并且在常规的CUDA中,用一些指针算术很容易实现。PyCUDA内存寻址:内存偏移量?

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

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

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

回答

2

pyCUDA gpuArray类支持一维数组的切片,但不支持需要跨步的较高维(虽然它即将到来)。但是,您可以从gpuarray成员(它是pycuda.driver.DeviceAllocation类型)和gpuArray.dtype.itemsize成员的大小信息访问多维gpuArray中的基础指针。然后你可以做同样类型的指针算术,以获得驱动程序memcpy函数可以接受的东西。

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

0

在PyCuda中实现的可能性不大。

我认为以下解决方案:

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

无论如何,我选择了第一个选项,但是让问题开放了几个小时,看看是否有其他人有我们没有想到的神奇解决方案。 – Bolster 2011-04-19 19:16:24

+0

是的,我也这么做,即使超过一周。不是每个人都可以每天阅读 – fabrizioM 2011-04-19 19:46:50