2013-04-23 36 views

回答

3

一般而言,可以是異步的功能列舉here

- •Kernel launches; 
    - •Memory copies between two addresses to the same device memory; 
    - •Memory copies from host to device of a memory block of 64 KB or less; 
    - •Memory copies performed by functions that are suffixed with Async; 
    - •Memory set function calls. 

異步函數通常具有後綴Async,他們通常會接受一個stream參數。

不符合上述說明的函數應假定爲同步的。具體的例外情況(如cudaSetDevice())通常可以從他們的描述中看出來。

在單設備系統的上下文中,同步功能(具有特定流同步的功能,如cudaStreamSynchronizecudaStreamWaitEvent除外)將:

  1. 等待開始直到所有CUDA活動已經完成(即所有先前的cuda API調用和內核調用已完成)
  2. 執行其指定的活動(例如cudaMemcpy()將在步驟1完成後開始指定的複製操作
  3. 發佈第2步後調用(主機)線程完成

因此調用(主機)線程cudaMemcpy()調用時,直到所有以前的CUDA活動的時刻阻止完成cudaMemcpy()通話完成。我認爲大多數人會說這可能會「破壞」GPU-CPU併發性,因爲在上述序列的持續時間(步驟1-3)中,CPU線程實際上什麼都不做。

在你的應用程序中是否有很大的區別取決於有問題的同步調用之前和之後發生了什麼。

相關問題