微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决pycuda - memcpy_dtoh,没有给出似乎已经设置的内容

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

问题:当从设备复制 int 数组时,虽然我可以看到数据结构中已经设置了值(因为我在分配后在函数中打印它),但值不符合预期。

>

我确定这很愚蠢。

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np

mod = SourceModule("""
__global__ void test(const char *q,const int chrSize,int *d,const int intSize) {
    int v = 0;
    if( 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_function("test")

# input data
a = np.asarray(['a','b','c','d'],dtype=np.str_)
# allocate/copy to device
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu,a)

# destination array
d = np.zeros((4),dtype=np.int16)
# allocate/copy to device
d_gpu = cuda.mem_alloc(d.nbytes)
cuda.memcpy_htod(d_gpu,d)

# run the function
func(a_gpu,np.int8(a.dtype.itemsize),d_gpu,np.int8(d.dtype.itemsize),block=(4,1,1))

# copy data back and priint
cuda.memcpy_dtoh(d,d_gpu)
print(d)

输出

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

预期输出

x=0,val=d ret=0
[1 0 1 0]

解决方法

您有两个主要问题,都与 memcpy_dtoh 无关:

  1. 您已将 dd_gpu 声明为 dtype np.int16,但内核期望使用 C++ int,从而导致类型不匹配。您应该使用 np.int32 类型来定义数组。

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

如果你解决了这两个问题,我怀疑代码会按预期工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。