PyCUDA - ElementWise 无法进行相等性检查
PyCUDA - ElementWise fails for equality checking
我正在尝试为两个数组构建相等性检查器,我可以在我的 GPU 上使用 PyCUDA 运行。
按照 PyCUDA GPU Arrays documentation page 上给出的示例,我尝试编写自己的实现。但是虽然下面的代码按预期的算术工作,例如"z[i] = x[i] + y[i]"
,它 returns 等式检查器操作数 "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 方法来实现所需的功能?
已解决!问题是 numpy 自动 returns 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)
之后它按预期工作。
我正在尝试为两个数组构建相等性检查器,我可以在我的 GPU 上使用 PyCUDA 运行。
按照 PyCUDA GPU Arrays documentation page 上给出的示例,我尝试编写自己的实现。但是虽然下面的代码按预期的算术工作,例如"z[i] = x[i] + y[i]"
,它 returns 等式检查器操作数 "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 方法来实现所需的功能?
已解决!问题是 numpy 自动 returns 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)
之后它按预期工作。