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