[英]In CUDA9, is “cudaMemcpyAsync()” both a device and a host function?
[英]calculating time execution for both device and host for CUDA programming
我需要計算GPU運行時代碼,以及總運行代碼(主機和設備)。 在我的代碼中,我有兩個gpu內核正在運行,並且在主機之間進行循環以復制數據,下面的示例可以顯示我的代碼是什么樣子
cuda event start
//FIRST kernel code call <<...>>
// cuda memory copy result back from device to host
CudadeviceSyncronize()
// copy host data to host array (CPU funtion loop)
// cuda memory copy from host to device
// SECOND Kernel call <<...>>
cuda event stop
//memory copy back from device to host
我所知道的是,我使用事件來計算內核,事件精確地衡量了內核在GPU上花費的實際時間。 所以我的問題和目標是:
1-我以上述方式顯示事件調用的方式是:僅記錄內核,而忽略主機函數嗎?
2-主機循環調用會影響cuda事件的計時嗎?
3-我的目標是僅計算GPU,以及GPU + CPU一起,以上將實現該目標,還是我應該使用clock_gettime(CLOCK_REALTIME,timer)來計算主機?
這樣的序列:
float et;
cudaEvent_t start, stop;
cudaEventCreate(&start); cudaEventCreate(&stop);
cudaEventRecord(start);
kernel1<<<...>>>(...);
cudaDeviceSynchronize();
host_code_routine(...);
kernel2<<<...>>>(...);
cudaEventRecord(stop);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&et, start, stop);
將返回et
的浮點經過時間(以毫秒為單位),該時間(大約)是以下各項的總和 :
kernel1
執行時間 host_code_routine
關聯的(主機)執行時間 kernel2
執行時間 如果您希望僅產生以上1和3的總和,則需要將每個內核(僅)用cudaEvent時序序列括起來,然后手動將主機代碼中的兩個值求和。
要回答您的問題,然后:
1-我以上述方式顯示事件調用的方式是:僅記錄內核,而忽略主機函數嗎?
不,您所描述的記錄將按順序捕獲主機和設備經過的時間。
2-主機循環調用會影響cuda事件的計時嗎?
是
3-我的目標是僅計算GPU,以及GPU + CPU一起,以上將實現該目標,還是我應該使用clock_gettime(CLOCK_REALTIME,timer)來計算主機?
如果您需要單獨的時間和各種金額,我建議您對內核分別進行計時,並使用一些基於主機的計時主機代碼的方法,然后以您希望的任何方式組合各種組件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.