2017-10-16 11 views
2

PyCUDAを使用してGPUで実行できる2つの配列の等価チェッカーを構築しようとしています。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ビットの整数だけを標準的に受け入れるということでした。

これは従ってなど、intの種類numpyの生成を指定することによって固定されている:予想通りに動作した後

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

関連する問題