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

Posted

技术标签:

【中文标题】pycuda - memcpy_dtoh,没有给出似乎已设置的内容【英文标题】:pycuda - memcpy_dtoh, not giving what appears to have been set 【发布时间】:2021-05-12 03:53:56 【问题描述】:

我有一个非常简单的函数,我传入一个 char 数组并进行简单的字符匹配。我想根据匹配的字符返回一个 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, 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]

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于pycuda - memcpy_dtoh,没有给出似乎已设置的内容的主要内容,如果未能解决你的问题,请参考以下文章

在 pyCuda 内核中生成单个随机数

如何在 pyCUDA 内核中生成随机数?

理解和优化 pyCUDA 中的线程、块和网格

[pycuda]win10安装完毕pycuda安装完毕后测试代码

PyCuda - 使用 *.cubin - 未找到命名符号

pyCuda,发送多个单变量参数的问题