Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyCUDA内存寻址:内存偏移?_Python_Cuda_Addressing_Relative Addressing_Pycuda - Fatal编程技术网

Python PyCUDA内存寻址:内存偏移?

Python PyCUDA内存寻址:内存偏移?,python,cuda,addressing,relative-addressing,pycuda,Python,Cuda,Addressing,Relative Addressing,Pycuda,我在设备上有大量生成的数据(a[I,j,k]),但我只需要a[I,:,:]的一个“切片”,在常规CUDA中,这可以通过一些指针算法轻松实现 在pycuda中可以做同样的事情吗?i、 e cuda.memcpy_dtoh(h_iA,d_A+(i*stride)) 显然,这是完全错误的,因为没有大小信息(除非从dest形状推断),但希望您能理解这一点。不太可能在PyCuda中实现 我可以想到以下解决办法: 在内存中复制整个数组A,并从感兴趣的切片创建一个numpy数组 创建一个读取矩阵并创建所需切

我在设备上有大量生成的数据(a[I,j,k]),但我只需要a[I,:,:]的一个“切片”,在常规CUDA中,这可以通过一些指针算法轻松实现

在pycuda中可以做同样的事情吗?i、 e

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

显然,这是完全错误的,因为没有大小信息(除非从dest形状推断),但希望您能理解这一点。

不太可能在PyCuda中实现

我可以想到以下解决办法:

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

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


    它不是很像python,但确实有效(或者至少在去年我进行了大量pyCUDA+MPI黑客攻击时有效)。

    我还是选择了选项1,但将问题保留了几个小时,看看是否有其他人有我们没有想到的神奇解决方案。是的,我也这么做了,甚至超过一周。不是每个人都可以每天阅读:)