2013-10-15 2 views
2

CudaEvents를 사용하여 수행 한 타이밍을 해석하려고하는데 CudaEvents를 통한 커널 실행에 커널 시작 시간이 포함되어 있습니까?CudaEvent 커널 시작 타이밍

불행히도 Cuda 호환 GPU에 대한 액세스 권한이 없기 때문에 테스트를 수행 할 수 있습니다. 그것은 확실히 내 실험을 기반으로 오버 헤드의 일부 종류를 캡처

많은 감사

답변

2

.

cudaEventRecord(start); 
cudaMemcpy(...);   // cudaMemcpy 1 
my_kernel<<<...>>>(...); 
cudaMemcpy(...); 
cudaEventRecord(stop); 
: CPU 오버 헤드가 커널 출시의 이전 작업을 분리로

나는,이 커널이 다른 동기 활동에 의해 괄호 경우, 다음 CPU 오버 헤드 반드시 포함되어야 분명해야한다고 생각

는 물론 위에 묘사 된 타이밍이 cudaMemcpy 1 커널 호출 사이의 CPU 오버 헤드를 포착해야한다는 것을 나에게 분명한 것 같다 (커널 자체에 기인하지 다양한 시간의 기여와 함께합니다.) 그래서

빈 커널

cudaEventRecord(start); 
my_kernel<<<...>>>(...); 
cudaEventRecord(stop); 
cudaEventSynchronize(stop); 

을 위의 패턴의 내 테스트를 기반으로하고 :

__global__ void my_kernel(){ 
    } 

I가 타이밍을 관찰 커널이 단독으로 또는 다른 비동기 호출에 의해 괄호 때 덜 분명한 경우입니다 적어도 몇 마이크로 초 리눅스, 이것은 꽤 이상 내 빈 커널에서 두 개의 명령을 실행하는 데 필요한 시간보다 :

  Function : _Z8mykernelv 
    /*0000*/  /*0x00005de428004404*/  MOV R1, c [0x1] [0x100]; 
    /*0008*/  /*0x00001de780000000*/  EXIT; 

따라서 내가 어떤 종류의 O를 주장 f 실행 설정 오버 헤드가 cudaEvent 시스템에 캡처됩니다. 누군가가이 오버 헤드가 이 아니라고 주장하고 싶다면 CPU 오버 헤드가 아니라 다른 것입니다.

필자의 주장에 따르면 어떤 형태의 오버 헤드가 캡처되고 있으며, CPU 오버 헤드로 간주하지 않을 이유가 없습니다. 또한 마커 바로 다음에 cudaEventSynchronize()이 포함 된 일반적인 cudaEvent 타이밍의 경우 cudaEvent 시스템에서 캡처 한 지속 시간 동안 호스트 스레드가 차단되어 startstop 마커 사이에 있음을 알 수 있습니다. 따라서 그 이유는 알 수 없습니다. CPU 오버 헤드로 참조하지 않는 경우입니다.

+0

"오버 헤드 캡처"는 기본 스트림을 사용하는지 여부에 따라 다릅니다. – einpoklum