2014-07-11 7 views
1

나는 다음과 같은 CUDAKernel 객체있다 :MATLAB CUDA 커널 개체 - 수집 사용 중 오류가 있습니까?

workspace

내가 사용 호출 : 위에서 보듯이

kernel1 = parallel.gpu.CUDAKernel('kcc2.ptx', 'kcc2.cu'); 
kernel1.ThreadBlockSize = 256; 
kernel1.GridSize = 4; 

gpuTM = gpuArray(single(TM)); 
gpuLTM = gpuArray(single(LTM)); 
gpuLTMP = gpuArray(int32(LTMP)); 

rng('shuffle'); 
randz = abs(randi(2^53 -1, [1, r_max])); 
GPUrands = gpuArray(double(randz)); 

[x,y] = gather(feval(kernel1, gpuLTM, gpuLTMP, F_M, Force, GPUrands, ... 
    (r_max), single(Lamda), single(Fixed_dt), single(r), single(q), ... 
    single(gama_B), single(gama_M), single(mu_B), single(mu_M), ... 
    single(KB_p_ref), single(KB_m_ref), single(f_ref), single(g_ref), ... 
    single(Kca_p_ref), single(Kca_m_ref))); 

, 나는이 개 왼쪽 인수를 아직 내가 MATLAB에서 오류가 발생합니다 :

gpuArray/gather를 사용하는 중 오류 : 출력 인수가 너무 많습니다.

나는 그것을 얻지 못한다. 내 모든 매개 변수는 CUDA 커널과 MATLAB에 있습니다. 당신이 볼 수있는 것과, 그래서 커널 함수는 다음 C++ 프로토 타입이 있습니다

__global__ void myKern(const float *transMatrix, const int *pointerMatrix, 
    float *masterForces, float *Force, const double *rands, const int r_max, 
    const float lamda, const float dt, const float r, const float q, 
    const float gama_B, const float gama_M, const float mu_B, const float mu_M, 
    const float KB_p_ref, const float KB_m_ref, const float f_ref, 
    const float g_ref, const float Kca_p_ref, const float Kca_m_ref) 

그것은 단지 반환해야 그들이 유일한 상수가 아닌 포인터이기 때문에 (MATLAB에서 [x,y]) masterForcesForce.

무엇이 문제 일 수 있습니까?

답변

3

직접 다중 출력 변수에 gather을 적용 할 수 없습니다, 당신은 별도의 라인 (이 기본적인 MATLAB 구문은) 그렇게해야합니다 :

[x,y] = feval(kernel1, ...); 
x = gather(x); 
y = gather(y); 

쿠다 커널을 평가의 결과는 두 변수입니다 gpuArray (GPU에 저장된 데이터)을 입력하십시오. 그런 다음 각 변수에 gather을 적용하여 데이터를 CPU 메모리로 전송할 수 있습니다.