2012-01-20 4 views
1

좋아요, 그래서 CPU에서 계산을하고 GPU로 번호를 전송하고 거기에서 몇 가지 작업을 수행합니다. CPU + GPU에서 계산을 수행하는 데 걸리는 총 시간을 계산하고 싶습니다. 어떻게해야합니까?CPU + GPU의 총 시간을 계산하는 방법

답변

0

프로그램이 시작되면 main()에서 시스템 타이머를 사용하여 시간을 기록하십시오. 프로그램이 main()의 맨 끝에서 끝나면 같은 시스템 타이머를 사용하여 시간을 기록하십시오. time2와 time1의 차이를 확인하십시오. 너 거기 간다!

사용할 수있는 시스템 타이머가 있습니다. 일부는 다른 시스템 타이머보다 해상도가 높습니다. 여기에있는 내용을 논의하기보다는 SO 사이트에서 "시스템 타이머"를 검색하는 것이 좋습니다. 어떤 시스템 타이머를 원한다면, gettimeofday()는 리눅스 시스템에서 작동하지만보다 새로운 최신 기능으로 대체되었습니다. 그대로, gettimeofday()는 마이크로 초 단위로 시간을 측정하기 때문에 사용자의 필요에 따라 충분합니다.

충분히 좋은 해상도의 타이머를 얻을 수 없다면 루프를 여러 번 실행하고 루프 실행을 타이밍 한 다음 측정 된 시간을 루프 반복 횟수로 나누십시오.

편집 :

시스템 타이머는 GPU 계산시 사용 시간을 포함하여 전체 응용 프로그램의 성능을 측정하는 데 사용할 수 있습니다. 이 방법으로 시스템 타이머를 사용하는 것은 프로세스 시간이 아닌 실제 또는 벽 시계 시간에만 적용된다는 점에 유의하십시오. 벽시계에 기반한 측정에는 GPU 작업이 완료되기를 기다리는 데 소요 된 시간이 포함되어야합니다.

GPU 커널이 ​​걸리는 시간을 측정하려면 몇 가지 옵션이 있습니다. 첫째, Compute Visual Profiler를 사용하여 다양한 프로파일 링 정보를 수집 할 수 있습니다.하지만 시간을 알려주지는 못하지만 (기본 프로파일 링 기능)이를 수행 할 수 있어야합니다. 다른 프로파일 러인 PAPI는 CUDA 커널을 지원합니다.

또 다른 옵션은 CUDA 이벤트를 사용하여 시간을 기록하는 것입니다. CUDA 4.0 프로그래밍 가이드에서 CUDA 이벤트를 사용하여 시간을 측정하는 방법을 설명합니다.

또 다른 옵션은 GPU 커널 호출을 감싸는 시스템 타이머를 사용하는 것입니다. 커널 호출의 비동기 적 특성을 감안할 때이 메소드를 적용하려면 cudaThreadSynchronize()와 같은 호스트 측 GPU 동기화 호출을 사용하여 커널 호출을 따라야합니다. 이 옵션을 사용한다면, 루프 내에서 커널을 호출하고, 루프에서 + 하나의 동기화 타이밍을 맞출 것을 권장합니다 (다른 스트림에서 실행되지 않는 커널 호출간에 동기화가 일어나기 때문에 루프 내에서 cudaThreadSynchronize()가 필요하지 않습니다). 반복 횟수로 나눕니다.

+0

또한이 시스템 타이머는 GPU에서 계산을 수행하는 데 걸린 시간을 고려합니까? 나는 그렇게 생각하지 않는다 ... 사이에, 나는 코드의 한 부분을 시간을 내고 싶다. 따라서, 메인을 시작하는 것이 도움이되지 않습니다. – Programmer

+0

@Programmer 제 편집을 확인하십시오. – Patrick87

0

GPU가 작동하는지 여부에 관계없이 C 타이머가 계속 이동합니다. 만약 당신이 나를 믿지 않는다면이 작은 실험을 해보십시오 : 루프에 대해 을 GPU_Function_Call에 1000 번 반복하십시오. C 타이머를 루프 주위에 두십시오. 이제 프로그램을 실행할 때 (GPU 함수가 20ms와 같이 상당한 시간이 소요된다고 가정), 돌아 오기 전에 육안으로 몇 초 동안 실행되는 것을 볼 수 있습니다. 하지만 C 시간을 인쇄하면 몇 밀리 초가 걸리는 것처럼 보일 것입니다. 이것은 C 타이머가 1000 MemcpyHtoD 및 1000 MemcpyfromDtoH 및 1000 커널 호출을 기다리지 않았기 때문입니다.

은 내가 제안하는 것은 CUDA 이벤트 타이머 또는 더 나은 NVIDIA 비주얼 프로파일을 사용하는 것입니다 시간 GPU 및 사용 중지 시계 전체 시간을 측정 (인간의 오류를 줄이기 위해 반복을 증가)에. 그런 다음 총 시간에서 GPU 시간을 빼면 CPU 시간이 표시됩니다.

+0

첫 번째 요점은 사실이 아닙니다. 예, 커널 시작은 비동기이지만 표준 mempcpy API가 차단되므로 호스트 타이머가 올바른 월계관 시간을 기록합니다. – talonmies

관련 문제