2
我想爲兩個數組構建一個相等檢查器,我可以使用PyCUDA在GPU上運行它。PyCUDA - ElementWise不能進行相等性檢查
按照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值,可以考慮使用'&'運算符,因爲在這種情況下它會完成同樣的事情,而且它可能會更快。 – scnerd
不幸的是括號不能解決它。 '&'運算符對二進制工作正常,但最終我想將它用於非二進制整數。我對C代碼不是很熟悉,但是關於相等運算符有什麼可以使它與算術和布爾運算有根本區別? – SLesslyTall
這可能是值得輸入結果的類型,只是爲了確保你得到你所期望的:'z [i] =(int)(x [i] == y [i])''。這些天我也沒有做太多C,所以我在這裏猜測,因爲我不太肯定'=='操作符的返回類型是 – scnerd