Numpy pycuda-memcpy_dtoh,没有给出似乎已经设置的内容

Numpy pycuda-memcpy_dtoh,没有给出似乎已经设置的内容,numpy,cuda,pycuda,Numpy,Cuda,Pycuda,我有一个非常简单的函数,其中我传入一个字符数组并进行一个简单的字符匹配。我想根据匹配的字符返回1/0的数组 问题:当int数组从设备中复制回来时,虽然我可以看到该值已在数据结构中设置(当我在赋值后在函数中打印它时),但该值并不是预期的值 我肯定这是件愚蠢的事 将pycuda.driver导入为cuda 导入pycuda.autoinit 从pycuda.compiler导入SourceModule 将numpy作为np导入 mod=SourceModule(“”) __全局无效测试(const

我有一个非常简单的函数,其中我传入一个字符数组并进行一个简单的字符匹配。我想根据匹配的字符返回1/0的数组

问题:当int数组从设备中复制回来时,虽然我可以看到该值已在数据结构中设置(当我在赋值后在函数中打印它时),但该值并不是预期的值

我肯定这是件愚蠢的事

将pycuda.driver导入为cuda
导入pycuda.autoinit
从pycuda.compiler导入SourceModule
将numpy作为np导入
mod=SourceModule(“”)
__全局无效测试(const char*q、const int chrSize、int*d、const int intSize){
int v=0;
如果(q[threadIdx.x*chrSize]='a'| | q[threadIdx.x*chrSize]='c'){
v=1;
}
d[threadIdx.x*intSize]=v;
printf(“x=%d,y=%d,val=%c ret=%d\\n”,threadIdx.x,threadIdx.y,q[threadIdx.x*chrSize],d[threadIdx.x*intSize]);
}
""")
func=mod.get_函数(“测试”)
#输入数据
a=np.asarray(['a','b','c','d','d',dtype=np.str)
#分配/复制到设备
a_gpu=cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu,a)
#目标阵列
d=np.zero((4),dtype=np.int16)
#分配/复制到设备
d_gpu=cuda.mem_alloc(d.n字节)
cuda.memcpy_htod(d_gpu,d)
#运行函数
func(a_gpu,np.int8(a.dtype.itemsize),d_gpu,np.int8(d.dtype.itemsize),block=(4,1,1))
#将数据复制回priint
cuda.memcpy\u dtoh(d,d\u gpu)
印刷品(d)
输出:

x=0, y=0, val=a ret=1
x=1, y=0, val=b ret=0
x=2, y=0, val=c ret=1
x=3, y=0, val=d ret=0
[1 0 0 0]
预期产出:

x=0, y=0, val=a ret=1
x=1, y=0, val=b ret=0
x=2, y=0, val=c ret=1
x=3, y=0, val=d ret=0
[1 0 1 0]

您有两个主要问题,这两个问题都与
memcpy\u dtoh
无关:

< > >您已经声明了代码> d<代码>代码>代码> dygPU<代码>,作为dType <代码> NP.INT16<代码>,但是内核正在期待C++ >代码> int >代码>,导致类型不匹配。您应该使用
np.int32
类型来定义数组

  • 内核中
    d
    的索引不正确。如果已向编译器声明数组为32位类型,则将数组索引为
    d[threadIdx.x]
    将自动包含该类型的正确对齐方式。不需要将
    intSize
    传递并使用到内核进行索引
    d
    ,这样做是不正确的

  • 如果您解决了这两个问题,我怀疑代码将按预期工作