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();
발사/측정 코드를 제공 할 수 있습니까? 5ms 이후로 매우 높은 가치입니다. 예를 들어, 제 설정에서 오버 헤드를 실행하는 것과 같습니다. – DarkZeros
예제를 추가합니다. 필자는 커널 실행과 인수 설정을 측정합니다. 내 빈 커널의 경우, 필자는 커널을 나의 차이점에 가깝게하기 위해서 오직 하나의 인수와 컴파일 옵션을 가지고있다. 하지만 내 설정은 다소 불만족 스럽습니다. 로컬 메모리가없는 상황에서 (CPU 4 코어 @ 1GHz 및 GPU 64 코어 4CU @ 500MHz) – baptiste