2011-11-02 4 views
0

OpenCL 응용 프로그램 (특히 컴퓨팅 커널)의 성능을 나타내는 가장 적합한 방법은 무엇입니까? 몇 가지 알고리즘을 구현했으며 속도 향상 및 효율성 차트를 제시하려고 생각했지만 정의에 따르면 계산에 사용한 프로세서의 수를 알아야합니다. OpenCL의 경우에는 수행 할 수 없습니다.OpenCL 성능 측정

답변

0

일부 GPU는 정확하게 시간을 측정 할 수있는 하드웨어 장치가 없다고 생각합니다. 그래서 이것은 당신이 CPU로 돌아갈 필요가 있음을 의미합니다. 그러나 나는 틀릴 수도 있습니다.

+0

그래서, 계산 차원의 그래프를 작업 차원의 함수로 나타내야한다고 생각합니까? –

+0

아마 네, 그렇게 생각합니다 (그러나 나는 완전히 확신하지 못합니다). –

3

CL_QUEUE_PROFILING_ENABLE 플래그가 설정된 명령 대기열을 만든 다음 clGetEventProfilingInfo를 사용하여 타이밍 데이터를 추출하십시오. 자세한 내용은 "OpenCL 프로그래밍 안내서"의 9 장을 참조하십시오.

+0

Nvidia의 OpenCL 프로그래밍 가이드? 저기있는 책이 있니? 정밀도가 조금 더 좋을 것입니다. 감사. – BRabbit27

+0

예, Aaftab Munshi의 "OpenCL Programming Guide"라는 책이 있습니다. Google 검색의 첫 번째 링크입니다. – vocaro

1

나는 언어/런타임의 기능을 활용하여 vocaro의 제안이 가장 적합하다고 말할 수 있습니다. 그러나 플랫폼에 어떤 이유로 든 작동하지 않는다면 주어진 CL 작업의 월 클럭 실행 시간에만 관심이 있다면 다른 솔루션이 있습니다.

clFinish()로 작업을 래핑하고 시스템의 최고 해상도 타이머를 사용하여 경과 시간을 얻을 수 있습니다. 예를 들어 맥 OS X를 사용하여 이런 식으로 뭔가 :

uint64_t start, end; 

clFinish(command_queue); 
start = mach_absolute_time(); 
clEnqueueNDRangeKernel(command_queue, /* etc. */); 
clFinish(command_queue); 
end = mach_absolute_time(); 

당신은 나노초이 절대 시간을 변환하는 Apple QA1398의 정보를 사용할 수 있습니다. 이 메소드는 clEnqueuNDRangeKernel 및 clFinish의 오버 헤드를 포함하기 때문에 이벤트 프로파일 링을 사용하는 것만 큼 정확하지는 않습니다.

완료 대기로 인해 보류중인 모든 CL 명령이 계산 장치 에 모두 완료되었음을 보증합니다.

1

nVidia의 모범 사례 가이드에는 성능 측정에 대한 전체 장이 있습니다. 조만간이 문제로 귀결됩니다. (@James에서 제안한) 외부 타이머를 사용하거나 GPU 프로파일 링 메커니즘 (@vocaro에서 제안)을 사용할 수 있습니다. 비록 내가 개인적으로 단순화를 위해 CPU 타이머를 사용하는 것에 집중할지라도, 후자는 더 나은 정밀도를 제공해야한다. 내가 사용되는 프로세서의 수는 사용자가 직접 제어 계산

이 멀티 CPU 병렬화에 대한 사실에서 사용 얼마나 많은 프로세서를 알 필요가 정의에 따라

. GPU에서는 GPU를 사용할 수 있지만 장치 내에서 일정을 제어 할 수는 없습니다. 그래서 보통 (실제로는 모든 CPU-vs-GPU 차트에서 "SpeedUp (문제 차원)"("마케팅"프레젠테이션) 또는 "SpeedUp (커널 옵션)"(더 많은 "techie" 프리젠 테이션, 커널 옵션은 그리드 매개 변수 또는 일부 코드 특수성 일 수 있습니다) 또는 "SpeedUp (사용 된 GPU 수)"(물론 프로그램이 다중 GPU를 지원하는 경우).