2012-01-21 4 views
3

다음 코드를 사용하여 cudaMalloc()으로 전화를 걸었습니다. 저는 궁금합니다. CUDA 이벤트는 우리 커널에만 시간을 내주 는가, 아니면 "내장 된 커널"에 시간을 둡니다. 즉, cudaMalloc()의 유효한 다음과 같은 방법이 있습니까?CUDA 이벤트 시간에 cudaMalloc 및 cudaMemcpy가 실행됩니까?

cudaEvent_t start, stop; 
cudaEventCreate(&start); 
cudaEventCreate(&stop); 
cudaEventRecord(start, 0); 
for(int t =0 ; t < 100 ; t++){ 
    float* test; 
    cudaMalloc((void**)&test, 3000000 * sizeof(float)); 
    cudaFree(test); 
} 
cudaEventRecord(stop, 0); 
cudaEventSynchronize(stop); 
float elapsedTime; 
cudaEventElapsedTime(&elapsedTime , start, stop); 
printf("time elapsed on the GPU: %f ms", elapsedTime/100); 

답변

2

CU (다) EventRecord()는 GPU가 명령을 처리 할 때 타임 스탬프를 작성하기 위해 GPU를 알려주는 GPU에 명령을 제출보다 더 아무것도하지 않습니다. 타임 스탬프는 온보드 고해상도 카운터 일뿐입니다. 따라서 CUDA 이벤트는 특정 커널이 실행되는 데 걸리는 시간과 같은 GPU 이벤트 타이밍을위한 비동기 메커니즘으로 사용될 때 가장 유용합니다. CUDA 메모리 관리는 주로 CPU에서 발생하기 때문에 CUDA 이벤트는 CUDA 할당 및 자유 작업 타이밍에 이상적이지 않습니다.

요약하면 gettimeofday()와 같은 CPU 기반 타이밍을 사용하는 것이 좋습니다.

+0

하지만 시간이 cudaMalloc입니까? 즉, 커널 실행 시간 만 필요할 때 cudaMalloc, cudaMemcpy 또는 cudaFree와 같은 다른 것이 첫 번째 cudaEventRecord와 두 번째 사이에 호출되지 않도록해야합니까? – user2023370

+0

비동기 CUDA memcpy는 공정한 게임이지만 드라이버가 페이지 테이블을 뒤지는 동안 cudaMalloc()/cudaFree()가 GPU를 멈출 수 있습니다. CUDA 이벤트는 여전히 해답을 설명하는대로 타이밍을 기록하지만 타이밍 정보는 유용하지 않습니다. – ArchaeaSoftware