2012-04-27 3 views
3

저는 parallel.gpu.CUDAKernel을 사용하여 Matlab 2011a에서 CUDA 커널을 시작했습니다. 루프 내에서 후속 커널 시작으로 동일한 gpuArray가 채워지도록 코드를 설계했지만 각 실행은 자체를 gpuArray의 고유 한 세그먼트로 제한합니다.Matlab에서 CUDA 커널 시작 사이의 gpuArray 데이터 유지

실행이 끝나면 전체 배열이 가득차 야합니다. 그러나 gather()를 사용하여 메모리를 호스트로 다시 전송하면 마지막 커널 시작으로 작성된 메모리 만 정확합니다. 나머지는 비어 있습니다. 중간에 어딘가의 루프에서 빠져 나가는 경우에도 마찬가지입니다.

필자는 커널 반복을 나타내는 플래그를 전달함으로써 이것이 사실인지 확인했습니다. 첫 번째 반복을 제외하고는 커널은 아무 것도하지 않습니다. 그러나 후속 커널은 아무 일도하지 않더라도 첫 번째 커널이 작성한 데이터 위치는 여전히 비어 있습니다! 첫 번째 커널을 시작한 직후 루프에서 빠져 나가는 경우는 그렇지 않습니다.

따라서 Matlab은 커널 시작 사이에서 gpuArray를 재설정하고있는 것으로 보입니다. 그렇게하는 것을 막을 수있는 방법이 있습니까?

+0

Parallel Computing Toolbox의 gpuArray는 그다지 기능적이지 않습니다. 재킷을 사용하는 것이 낫습니다. 내가 Jacket에서 일하기 때문에 편견이 있지만, gpuArray로 시간을 낭비해서는 안된다고 말할 때 농담이 아닙니다. 재킷을 사용하지 않으려는 경우 CPU를 고수하거나 자신의 모든 CUDA 코드를 작성하는 것이 좋습니다. – arrayfire

+0

그것은 훌륭한 제품처럼 보입니다. 불행하게도, 나는 대학이 제공하는 자유 소프트웨어와 소프트웨어로 제한됩니다. 지금은 mex 인터페이스를 작성하려고합니다. – Richard

+0

좋은 소리입니다. IT 부서에 자켓 구입을 요청하는 메모를 보내면 그렇게 할 수 있습니다. 사실, 그들은 이미 Jacket에 대한 라이센스를 가지고있을 것입니다 (대부분의 대학은 지금까지 Jacket 라이센스를 가지고 있습니다). – arrayfire

답변

2

feval 호출의 출력을 캡처하면이 기능이 작동합니다. 난 당신이 후있어 생각으로 MATLAB에 다음 코드가 작동 실행, 그리고

__global__ void setOneEl(double * array, double val, int element) { 
    array[element] = val; 
} 

: 이런 사소한 커널을 고려

>> k = parallel.gpu.CUDAKernel('kern.ptx'); 
>> g = parallel.gpu.GPUArray.zeros(1,10); 
>> for ii = 1:2:10, g = k.feval(g, rand, ii); end 
>> gather(g) 
ans = 
     0 0.0975   0 0.2785   0 0.5469   0 0.9575   0 0.9649 

보통 MATLAB의 의미에 부합하기 위해, gpuArray 객체는 값입니다 따라서 gpuArray 인스턴스를 수정하려면 다른 MATLAB 데이터 유형에서와 같이 출력 값을 동일한 배열로 다시 캡처해야합니다. 그러나 CUDAKernel.feval 호출은 결과를 동일한 변수에 캡처 할 때 이해하며 현재 위치 최적화를 사용하여 복사본을 만들지 않도록 할 수 있습니다.