簡體   English   中英

計算設備和主機的時間執行以進行CUDA編程

[英]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的浮點經過時間(以毫秒為單位),該時間(大約)是以下各項的總和

  1. kernel1執行時間
  2. host_code_routine關聯的(主機)執行時間
  3. kernel2執行時間

如果您希望僅產生以上1和3的總和,則需要將每個內核(僅)用cudaEvent時序序列括起來,然后手動將主機代碼中的兩個值求和。

要回答您的問題,然后:

1-我以上述方式顯示事件調用的方式是:僅記錄內核,而忽略主機函數嗎?

不,您所描述的記錄將按順序捕獲主機和設備經過的時間。

2-主機循環調用會影響cuda事件的計時嗎?

3-我的目標是僅計算GPU,以及GPU + CPU一起,以上將實現該目標,還是我應該使用clock_gettime(CLOCK_REALTIME,timer)來計算主機?

如果您需要單獨的時間和各種金額,我建議您對內核分別進行計時,並使用一些基於主機的計時主機代碼的方法,然后以您希望的任何方式組合各種組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM