Pycuda搞乱了numpy矩阵转置

Pycuda搞乱了numpy矩阵转置,numpy,pycuda,Numpy,Pycuda,当转换为pycuda.gpuarray时,为什么转置后的矩阵看起来不同 你能复制这个吗?这是什么原因造成的?我是否使用了错误的方法 示例代码 from pycuda import gpuarray import pycuda.autoinit import numpy data = numpy.random.randn(2,4).astype(numpy.float32) data_gpu = gpuarray.to_gpu(data.T) print "data\n",data print

当转换为
pycuda.gpuarray
时,为什么转置后的矩阵看起来不同

你能复制这个吗?这是什么原因造成的?我是否使用了错误的方法

示例代码

from pycuda import gpuarray
import pycuda.autoinit
import numpy

data = numpy.random.randn(2,4).astype(numpy.float32)
data_gpu = gpuarray.to_gpu(data.T)
print "data\n",data
print "data_gpu.get()\n",data_gpu.get()
print "data.T\n",data.T
输出

data
[[ 0.70442784  0.08845157 -0.84840715 -1.81618035]
 [ 0.55292499  0.54911566  0.54672164  0.05098847]]
data_gpu.get()
[[ 0.70442784  0.08845157]
 [-0.84840715 -1.81618035]
 [ 0.55292499  0.54911566]
 [ 0.54672164  0.05098847]]
data.T
[[ 0.70442784  0.55292499]
 [ 0.08845157  0.54911566]
 [-0.84840715  0.54672164]
 [-1.81618035  0.05098847]]

在numpy中,
data.T
对底层1D数组没有任何作用。它只是简单地操纵步幅来获得转置。这使它成为一个恒定的时间和恒定的内存操作

似乎
pycuda.to_gpu()
没有考虑跨步,只是在复制底层1D数组。这将产生你所观察到的确切行为

在我看来,你的代码没有错。相反,我会认为这是一个bug在<代码> PycUDA < /C> >

我在谷歌搜索了一下,找到了


作为一种解决方法,您可以尝试将
numpy.ascontiguousarray(data.T)
传递到
gpuarray.to_gpu()
。当然,这将在主机RAM中创建数据的第二个副本。

基本原因是numpy transpose只创建一个视图,它对底层阵列存储没有影响,而当对设备内存执行复制时,PyCUDA直接访问该存储。解决方案是在进行转置时使用
copy
方法,该方法将在主机内存中创建一个包含转置顺序数据的数组,然后将其复制到设备:

data_gpu = gpuarray.to_gpu(data.T.copy())

这就是
gpuarray
类的工作原理。还不支持对底层数据的视图和快速访问。嗨,aix,感谢您的详细解释(我投票支持您),但我选择了talonmies,因为我最终使用的代码就是talonmies。干杯