PyCUDA - ElementWise无法进行等式检查

时间:2017-10-16 13:47:14

标签: python gpu-programming pycuda

我正在尝试为两个阵列构建一个相等检查器,我可以使用PyCUDA在我的GPU上运行。

按照PyCUDA GPU Arrays documentation page给出的示例,我尝试编写自己的实现。但是,虽然下面的代码按算法的预期工作,例如, "z[i] = x[i] + y[i]",它返回相等检查器操作数"z[i] = x[i] == y[i]"的错误输出。

import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
from pycuda.elementwise import ElementwiseKernel

matrix_size = (5,)
a = np.random.randint(2, size=matrix_size)
b = np.random.randint(2, size=matrix_size)

print a
print b

a_gpu = gpuarray.to_gpu(a) 
b_gpu = gpuarray.to_gpu(b)

eq_checker = ElementwiseKernel(
        "int *x, int *y, int *z",
        "z[i] = x[i] == y[i]",
        "equality_checker")

c_gpu = gpuarray.empty_like(a_gpu)
eq_checker(a_gpu, b_gpu, c_gpu)

print c_gpu

打印出如下内容:

[0 1 0 0 0]
[0 1 1 1 0]
[4294967297 4294967297          0          1          1]

有没有人理解为什么会出现这种错误,或者至少有一种替代的PyCUDA方法来实现所需的功能?

1 个答案:

答案 0 :(得分:1)

解决!问题是numpy自动返回64位整数,而PyCUDA只标准地接受32位整数。

因此,通过指定numpy生成的int类型来修复此问题,例如:

a = np.random.randint(2, size=matrix_size, dtype=np.int32)
b = np.random.randint(2, size=matrix_size, dtype=np.int32)

之后它按预期工作。