1.runtime庫介紹
CUDA c++對c++語言的最小擴展集和一個runtime庫組成。它允許程序員將內核定義爲一個c++函數,並在每次調用該函數時使用一些新的語法來指定網格和塊維。
“runtime API”通過提供隱式初始化、上下文管理和模塊管理簡化了設備代碼管理。使得代碼更簡單,但它也缺乏“驅動程序API”所具有的控制級別。
2.GPU異構編程模式
以c語言爲例,GPU和CPU組成的異構編程模式如下圖所示:CPU成爲主機,GPU成爲設備。CPU爲核函數並行運行提供必要的變量定義、數據傳輸等工作,並行並行運算結果用於其他串行代碼,是函數的主體部分。GPU並行代碼負責執行某個特定功能,模塊式地嵌入到主體程序中。這種異構編程模式就涉及到主機與GPU設備之間的通訊等內容,在編程時有很多需要注意的地方:如設備內存開闢和釋放、數據傳輸、數據同步等。
3. runtime API的同步行爲
runtime API以同步和異步兩種形式提供memcpy/memset函數。
Memcpy
在參考文檔中,每個memcpy函數被歸類爲同步或異步,對應於下面的定義:
同步:
所有涉及統一內存區域的傳輸都是與主機完全同步的。
同步情況 |
---|
所有涉及統一內存區域的傳輸都是與主機完全同步的 |
對於從固定主機內存到設備內存的傳輸,該函數相對於主機是同步的 |
對於從設備到可分頁或固定主機內存的傳輸,函數只在複製完成後返回 |
對於從設備內存到設備內存的傳輸,不執行主機端同步 |
對於從任何主機內存到任何主機內存的傳輸,該函數對於主機是完全同步的 |
異步
異步情況 |
---|
對於從設備內存到可分頁主機內存的傳輸,函數只會在複製完成後返回 |
對於從任何主機內存到任何主機內存的傳輸,該函數對於主機是完全同步的 |
對於所有其他傳輸,函數是完全異步的。如果可分頁內存必須首先被暫存到固定的內存中,這將通過工作線程異步處理 |
核函數啓動
內核啓動相對於主機是異步的