2011-04-27 3 views
5

cudaEvent_t의 사용법에 대해 다소 혼란 스럽습니다. 현재, 나는 커널 통화 시간을 찾기 위해이 같은 clock() 전화를 사용하고 있습니다 :CUDA : cudaEvent_t 및 cudaThreadSynchronize 사용량

cudaThreadSynchronize(); 
clock_t begin = clock(); 

fooKernel<<< x, y >>>(z, w); 

cudaThreadSynchronize(); 
clock_t end = clock(); 

// Print time difference: (end - begin) 

을 내가 cudaEvent_t 사용을 고려하고 높은 해상도의 타이머를 찾고. cudaEventRecord()을 사용하여 시간을 기록하기 전에 cudaThreadSynchronize()으로 전화해야합니까, 아니면 중복되어 있습니까?

이벤트가 기록 될 때까지 기다리는 것처럼 보이는 또 다른 호출 cudaEventSynchronize()이 있기 때문에 내가 묻는 이유가 있습니다. 레코딩이 지연되면 커널이 실행을 마친 후 계산 된 시간 차이가 약간의 추가 시간을 나타내지 않습니까?

답변

12

사실 더 많은 동기화 기능 (cudaStreamSynchronize)이 있습니다. 프로그래밍 가이드에는 각각의 기능에 대한 자세한 설명이 나와 있습니다. 타이머와 같은 이벤트를 사용하면 기본적으로이 내려 온다 : 당신은 시간을 계산하기 전에 실행있어 반드시 모든 것을 만들고 싶어하기 때문에

//create events 
cudaEvent_t event1, event2; 
cudaEventCreate(&event1); 
cudaEventCreate(&event2); 

//record events around kernel launch 
cudaEventRecord(event1, 0); //where 0 is the default stream 
kernel<<<grid,block>>>(...); //also using the default stream 
cudaEventRecord(event2, 0); 

//synchronize 
cudaEventSynchronize(event1); //optional 
cudaEventSynchronize(event2); //wait for the event to be executed! 

//calculate time 
float dt_ms; 
cudaEventElapsedTime(&dt_ms, event1, event2); 

그것은 event2에 동기화하는 것이 중요합니다. 이벤트와 커널이 같은 스트림 상에 있기 때문에 (순서가 유지됨) event1kernel도 실행되었습니다.

대신 cudaStreamSynchronize 또는 cudaThreadSynchronize으로 전화를 걸 수 있습니다.이 경우에는 둘 다 과도 함입니다.

+0

LumpN : 왜 이벤트가 곧 녹음되지 않는가? cudaEventRecord가 호출되는 이유는 무엇입니까? 해당 호출에 기록되지 않은 경우 해당 커널에서 걸리는 시간을 어떻게 나타낼 수 있습니까? –

+4

@Ashwin : 이벤트는 FIFO처럼 작동하는 스트림의 맨 위에 도달하면 기록됩니다. cudaEventRecord를 호출하면 이벤트를 스트림으로 푸시합니다. 이벤트보다 먼저 스트림에 작업이있는 경우, 이벤트는 앞선 모든 작업이 완료 될 때까지 스트림 FIFO에 처리되지 않은 상태로 저장됩니다. 이러한 모든 호출은 호출하는 호스트 스레드와 관련하여 비동기 적입니다. – talonmies