2017-10-16 14 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와 같은 발생하는 int의 타입을 지정하여 고정된다.