2011-12-12 98 views
19

我讀到可以使用內核啓動來同步不同的塊,即如果我希望所有塊在操作2之前完成操作1,我應該將操作1放在一個內核中,操作2在另一個內核中。這樣,我可以實現塊之間的全局同步。但是,cuda c編程指南提到內核調用是異步的,即。 CPU不會等待第一個內核調用完成,因此CPU也可以在第一個內核完成之前調用第二個內核。但是,如果這是真的,那麼我們不能使用內核啓動來同步塊。請讓我知道我的錯在哪裏cuda內核調用是同步還是異步

回答

28

從CPU的角度看,內核調用是異步的,所以如果連續調用2個內核,第二個內核將被調用而不用等待第一個內核完成。它只意味着控制立即返回到CPU。

在GPU方面,如果你沒有指定不同的流來執行內核,它們將按照它們被調用的順序執行(如果你不指定流,它們都會進入默認流並執行連續)。只有在第一個內核完成後,第二個內核纔會執行。

此行爲適用於支持併發內核執行的計算能力爲2.x的設備。在其他設備上,即使內核調用仍然是異步的,內核執行總是順序的。

查看每個CUDA程序員應閱讀的3.2.5節中的CUDA C編程指南。

0

自2.0 CUDA功能版本開始支持併發內核執行。

此外,返回到CPU代碼可以比所有warp內核更早進行工作。

在這種情況下,您可以自己提供同步。

2

接受的答案並不總是正確的。

在大多數情況下,內核啓動是異步的。但在以下情況下,它是同步。他們很容易被人忽視。

  • 環境變量CUDA_LAUNCH_BLOCKING等於1.
  • 使用輪廓儀(nvprof),而無需啓用同時內核仿形
  • 的memcpy涉及主機存儲器這是不頁面鎖定。

程序員可以內核的全局關閉異步由CUDA_LAUNCH_BLOCKING環境變量設置爲1,提供此功能僅用於調試目的,不應該被用來作爲一種系統上運行的所有CUDA應用程序啓動使生產軟件可靠運行。

如果硬件計數器通過探查器(Nsight,Visual Profiler)收集,內核啓動是同步的,除非啓用併發內核分析。如果涉及非頁面鎖定的主機內存,則異步內存副本也將同步。

從NVIDIA CUDA編程指南(http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-execution-host-device)。

相關問題