2017-10-16 42 views
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實現所需的功能?

+0

你可以嘗試添加括號'z [i] =(x [i] == y [i]),看看是否有效?如果不是,如果你只使用0/1值,可以考慮使用'&'運算符,因爲在這種情況下它會完成同樣的事情,而且它可能會更快。 – scnerd

+0

不幸的是括號不能解決它。 '&'運算符對二進制工作正常,但最終我想將它用於非二進制整數。我對C代碼不是很熟悉,但是關於相等運算符有什麼可以使它與算術和布爾運算有根本區別? – SLesslyTall

+0

這可能是值得輸入結果的類型,只是爲了確保你得到你所期望的:'z [i] =(int)(x [i] == y [i])''。這些天我也沒有做太多C,所以我在這裏猜測,因爲我不太肯定'=='操作符的返回類型是 – scnerd

回答

1

解決!問題是numpy會自動返回64位整數,而PyCUDA只能標準接受32位整數。

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

之後它按預期工作:

這因此通過指定整數numpy的產生,如類型固定。