2012-01-21 98 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

立方米(DA)EventRecord()什麼都不做多提交一份命令,告訴GPU時,GPU處理命令寫一個時間戳的GPU。時間戳只是一個機載高分辨率計數器。因此,CUDA事件在用作定時on-GPU事件的異步機制時非常有用,例如特定內核需要運行多長時間。 CUDA內存管理主要發生在CPU上,因此CUDA事件不適合定時CUDA分配和自由操作。

總之:您最好使用基於CPU的時間,比如gettimeofday()。

+0

但是它的時間cudaMalloc?換句話說,如果只需要執行內核執行的時間,是否應該確保在第一個cudaEventRecord和第二個cudaEventRecord之間不會調用其他任何內容,如cudaMalloc,cudaMemcpy或cudaFree? – user2023370

+0

異步CUDA memcpy是公平的遊戲,但cudaMalloc()/ cudaFree()可能會導致圖形處理器停頓,而驅動程序則會使用頁表亂動。 CUDA事件仍然會按照答案中所描述的那樣愉快地記錄時間,但是他們的時間信息將不會有用。 – ArchaeaSoftware