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メソッドを持っていますか?
括弧 'z [i] =(x [i] == y [i])'を追加して、それが機能するかどうか試してみてください。そうでない場合は、0/1の値だけを使用している場合は、代わりに '&'演算子を使用することをお勧めします。その場合、同じことを達成します。 – scnerd
残念ながら、かっこはそれを修正しません。 '&'演算子はバイナリには問題ありませんが、最終的には非バイナリ整数に使用したいと思います。私はCコードに慣れていませんが、算術やブール値とは根本的に異なるようにする等価演算子については何かありますか? – SLesslyTall
'z [i] =(int)(x [i] == y [i])'のように、結果を型変換するだけの価値があります。私は最近Cをあまり使っていないので、 '=='演算子の返り値の型が – scnerd