2013-08-10 2 views
0

나는 matlab에의 CUDA 프로그램을 가지고 있지만, 코드가 IN/OUT 인수에 대한 간단한 mexFunction 제외하고는 동일 불구하고 MEX 버전은 비주얼 스튜디오 버전보다 훨씬 느립니다. mex 버전은 3 초가 걸리고 순수 C는 0.5 초가 걸립니다.같은 코드입니다, mex는 훨씬 느리고 순수한 C입니다, 왜?

Visual Studio 2010을 사용하여 프로그래밍 한 Quadro K2000M 카드, CUDA 기능 3.0, CUDA 드라이버 5.5, 런타임 5.0을 사용하고 있습니다. mexGPUExample.cu에 대한 단계를 MATLAB에서 수행하고 -gencode = arch = compute_30, code = \ "sm_30, compute_30 \"(하위 버전 플래그 삭제). 세부

,

순수 C 코드

int main(int argc, char *argv[]){ 
clock_t begin, end; 
double elapsed_time; 

// some codes that prepare parameters from argc and argv 

begin = clock(); 
a_function_that_calls_a_cuda_kernel(parameters); 
end = clock(); 
elapsed_time = (double)(end - begin)/CLOCKS_PER_SEC; 
printf("elapsed time: %f seconds\n", elapsed_time); 

return 0; 
} 

의 MATLAB MEX 코드합니다 (mexGPUExample에 따라 (비주얼 Sutdio 2010 프로젝트 Nsight 3.1에서 만든이, compute_30하는 코드 생성, sm_30 변경) .CU는 MATLAB에 의해, http://www.mathworks.se/help/distcomp/create-and-run-mex-files-containing-cuda-code.html의 세부 사항, 약간 -gencode하는 설정을 수정 = 아치 = compute_30, 코드 = \ "sm_30, compute_30의 \")

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
clock_t begin, end; 
double elapsed_time; 

// some codes that prepare parameters from prhs 

begin = clock(); 
a_function_that_calls_a_cuda_kernel(parameters); 
end = clock(); 
elapsed_time = (double)(end - begin)/CLOCKS_PER_SEC; 
mexPrintf("elapsed time: %f seconds\n", elapsed_time);  
} 

mex 버전은 3 초가 걸리는 반면 순수 C는 0.5 초가 걸리는 이유는 무엇입니까? 어떤 힌트에도 매우 감사드립니다.

+2

나는 당신이 Stack Overflow를 처음 접했을 것으로 생각한다. 일반적으로 이와 같은 질문에 일부 코드가 포함될 것으로 예상됩니다. 코드가 실제로 동일하다면 GPU에서 천천히 실행됩니다. 많은 스레드를 실행하여 GPU를 활용해야합니다. –

+1

matlab 코드에서 행에 두 번 mex 함수를 호출하면 매번 3 초가 걸릴 수 있습니까? –

답변

1

귀하의 질문은 불분명하다. 나는 비교 다음과 같은 조건을 가정하고 있습니다 :

당신은 비주얼 스튜디오에서 독립 실행 형 프로그램으로 컴파일 할 때의 mexFunction에 의해 인터페이스 및 matlab에에서 호출 할 컴파일 할 때보 다 더 빠른 CUDA 코드가 있습니다.

당신은 CUDA 컨텍스트 설정은 커널 드라이버에 의해 처리되고, 그리고 코드가 GPU에 업로드되어 있기 때문에 mexFunction에 대한 첫 번째 호출은 "느린"것을 알고 있어야합니다. 따라서

는, 실행 시간의 의미있는 평가를 위해, 하나는 첫 번째 후속 호출의 실행 후 시간을 한 번 호출하고, 커널을 "워밍업"한다. 코드는 매우 빠른 경우 많은 호출의 평균 시간으로 계산되어야합니다.

+0

@rozyang 로버트의 질문에 대답 할 수 있다면 좋을 것입니다. mexfile 코드는 매번 3 초가 걸리지 않습니까? 아니면 처음 느리게 만 느린가? 관찰 : C++ 타이머 ('clock_t')에 의한 함수 호출 타이밍입니다. 커널 시작은 비동기입니다. 따라서 함수'a_function_that_calls_a_cuda_kernel'에 커널 실행 만 포함되어 있다면 제대로 타이밍을 맞출 수 없을 것입니다. CUDA API로 커널 호출 시간을 정해 봤습니까? 누군가가 컴파일하고 실행할 수있는 문제를 재현하는 "최소 크기"의 컴파일 가능한 코드를 게시 할 수 있습니까? – JackOLantern