【问题标题】:PyCUDA - ElementWise fails for equality checkingPyCUDA - ElementWise 无法进行相等性检查
【发布时间】:2018-03-28 01:39:19
【问题描述】:

我正在尝试为两个数组构建一个相等检查器,我可以使用 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 方法来实现所需的功能?

【问题讨论】:

  • 您可以尝试添加括号z[i] = (x[i] == y[i]) 看看是否有效?如果不是,如果您只使用 0/1 值,请考虑改用 & 运算符,因为在这种情况下它会完成同样的事情,而且可能会更快。
  • 不幸的是括号不能解决它。 & 运算符适用于二进制,但最终我想将它用于非二进制整数。我对 C 代码不是很熟悉,但是等式运算符有什么地方使它与算术和布尔值有根本的不同吗?
  • 可能值得输入结果,只是为了确保你得到你所期望的:z[i] = (int)(x[i] == y[i])。这些天我也没有做太多的 C,所以我在这里有点猜测,因为我不确定 == 运算符的返回类型是什么
  • 再次遗憾的是,它给出了同样的错误。 :(。我已在 PyCUDA GitHub 上将其作为问题提出,并将根据我得到的任何答案进行更新。

标签: python gpu pycuda


【解决方案1】:

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

因此可以通过指定 numpy 生成的整数类型来解决这个问题,例如:

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

之后它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多