1

我在设备上有大量生成的数据(A[i,j,k]),但我只需要 A[i,:,:] 的一个“切片”,在常规 CUDA 中这很容易用一些指针算术完成。

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

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

显然这是完全错误的,因为没有尺寸信息(除非从 dest 形状推断),但希望你明白吗?

4

2 回答 2

2

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

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

于 2011-04-19T19:57:22.547 回答
0

不太可能在 PyCuda 中实现。

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

  1. 将整个数组A复制到内存中,并从感兴趣的切片中创建一个 numpy 数组。
  2. 创建一个读取矩阵并创建所需切片的内核。
  3. 重新排列 Produced Data,使您可以从指针算术中一次读取一个切片。
于 2011-04-19T18:53:50.610 回答