2013-12-13 2 views
1

OpenCL 용 Freescale i.MX6.Q 플랫폼을 열었습니다. 완전히 설명 할 수없는 흥미로운 결과가 있습니다. 내 알고리즘은 4 개의 커널을 실행하여 이루어지며 마지막 하나는 흥미로운 것입니다. 고전적인 이미지 차이입니다.OpenCL 병렬화 비용

저는 벡터화 된 것과 벡터화 된 두 가지 버전을 테스트했습니다 (벡터화 없음). 처음에는 병렬화 된 차이점에 대한 결과에 놀랐습니다.이 플랫폼에서 OpenCL은 처리 할 이미지 만 선택해야합니다 (알고리즘에서 이미지는 버퍼로 처리됩니다).

그러나 OpenCL 구현의 경우 처음에는 작은 이미지의 경우 상수 실행 시간 (약 5ms)이있었습니다. 빈 커널의 실행 시간을 확인한 결과 테스트 된 모든 이미지 (32x32에서 1920x1024까지)에 대해이 플랫폼에서 항상 약 5ms가 소요되었습니다.

OpenCL의 차이점에 대한 병렬화 비용으로 빈 커널에 대한 이러한 시간이 표시되며 그 비용에 무엇이 들어 있는지 알고 싶습니다.

내 커널 컴파일은 벤치 외부에서 수행되며 어떤 단계가 5ms가 걸리는지 알지 못합니다. GPU가 처리하는 NDRange 해석 만입니까?

누군가가 설명을하면, 받아들입니다.

티스트

편집 :

내 시간 측정 및 커널 출시 :

start_time = time_now(); 

cl_mem_flags mem_device_host; 
if (device.getInfo<CL_DEVICE_HOST_UNIFIED_MEMORY>()==CL_TRUE) 
    mem_device_host = CL_MEM_USE_HOST_PTR; 
else 
    mem_device_host = CL_MEM_COPY_HOST_PTR; 

cl_status = kernel.setArg(0, input_image); 
oclReturnOnError(cl_status, "Passage de l'argument 0 du kernel 'morph'") 

cl_status = kernel.setArg(1, output_image); 
oclReturnOnError(cl_status, "Passage de l'argument 1 du kernel 'morph'") 

cl_status = kernel.setArg(2, input_SE); 
oclReturnOnError(cl_status, "Passage de l'argument 2 du kernel 'morph'") 

cl::Event eventMorph; 
cl_status = commandQueue.enqueueNDRangeKernel(kernel, 
    cl::NullRange, 
    global_range, 
    local_range 
    NULL , &eventMorph); 
oclReturnOnError(cl_status, "Ajout du kernel 'morph' à la queue de commande") 

cl_status = eventMorph.wait(); 
oclReturnOnError(cl_status, "Attende d'exécution du kernel 'morph'") 

end_time = time_now(); 
+0

발사/측정 코드를 제공 할 수 있습니까? 5ms 이후로 매우 높은 가치입니다. 예를 들어, 제 설정에서 오버 헤드를 실행하는 것과 같습니다. – DarkZeros

+0

예제를 추가합니다. 필자는 커널 실행과 인수 설정을 측정합니다. 내 빈 커널의 경우, 필자는 커널을 나의 차이점에 가깝게하기 위해서 오직 하나의 인수와 컴파일 옵션을 가지고있다. 하지만 내 설정은 다소 불만족 스럽습니다. 로컬 메모리가없는 상황에서 (CPU 4 코어 @ 1GHz 및 GPU 64 코어 4CU @ 500MHz) – baptiste

답변

1

당신이 당신의 커널 실행을 meassuring하는 방법을 귀하의 문제가 주로. OS time_now()를 사용하면 해상도가 떨어지고 OpenCL 성능을 테스트하는 방법이 아닙니다.

또한 호스트의 GPU 작업 부하가 느립니다. 따라서 대기열에 넣고 실행을 강제하지 않고 (), 완료 될 때까지 수동적으로 기다리지 않으면 성능이 매우 저하됩니다. 모든 대기열과 전송을 기다려야하므로 호출과 실제 실행 사이에 많은 오버 헤드가 발생합니다.

run + wait 모델은 예제와 데모에서는 유효하지만 실제 시스템이나 성능 측정에는 사용하지 마십시오.

은 성능을 측정하기 위해event을 사용하고 있습니다. cl::Event.getProfilingInfo<CL_PROFILING_COMMAND_START>()cl::Event.getProfilingInfo<CL_PROFILING_COMMAND_END>()을 사용하여 커널의 시작 및 종료 시간을 측정 할 수 있습니다.

을 실행하는 적절한 방법은 데이터를 추출해야 할 때 (일반적으로 EnqueueReadBuffer()) 차단 호출 만 수행하는 것입니다. 이런 방식으로 일련의 커널을 대기열에 넣으면 커널 사이에 유휴 시간이 거의 없으며 차례대로 실행됩니다.

+0

그래도 이벤트로 GPU 시간 실행을 측정하는 방법을 알았습니다.하지만 문제가되지 않는 경우 같은 시간 측정 참조 (나는 OpenCL 하나의 C 구현을 비교)? 차이점을보기 위해 어쨌든 시도해 보겠습니다. – baptiste