異步函數使得主機端與設備端並行執行:控制在設備還沒有完成前就被返回給主機線程;
包括:
kernel啓動; 以Async爲後綴的內存拷貝函數; device到device內存拷貝函數;存儲器初始化函數,比如cudaMemset(),cudaMemset2D(),cudaMemset3D();
一些設備能夠在kernel執行期間,執行pinned memory和顯存間的數據傳輸,可以通過調用cudaGetDeviceProperties()檢驗;
異步執行意義:一個流內的計算與數據拷貝時依次進行的;
不同流之間的這些操作可以同時執行;
當GPU傳輸數據時,主機線程不必等待可以進行一些運算,提高cpu與GPu並行工作;
如果調用了同步版本的GPU函數,只能在設備完成任務後才能返回主機線程,此時主機端進入yield,block或者spin狀態,可以由cudaSetDeviceFlags()或cuCtxCreate()來選擇主機端在進行GPU計算時進入的狀態;
流:程序通過流來管理併發,每個流是按順序執行的一系列操作;不同流之間亂序執行或者並行執行;定義是創建一個cudaStream_t對象;
當使用兩個流處理同一塊存儲時,必須使用pinned memory;
如果主機線程在來自不同流的兩個操作之間調用了pinned memory的分配,顯存分配,顯存設置,設備與設備間的雙向拷貝或0流的兩項操作,則這兩項操作無法並行執行;
可以設置CUDA_LAUNCH_BLOCKING = 1,禁用所有cuda應用程序異步執行;
cudaStreamSynchronize() 強制cuda運行時等待流中所有操作完成;函數沒有采取中斷,會進行輪詢,佔用大量CPU資源;
事件
運行時API可以通過事件管理密切監控設備進度並執行準確計時,可以異步的記錄下程序內任一點的事件,並可以查詢這些事件被記錄的時間;時間使用的GPU計時器,比CPU計時器更加準確;事件管理可以用於測量程序運行時間,或者管理CPU和GPU同時進行運算;
CUDA與圖形學API互操作
經過配置可以與OpenGL,Direct3D共同使用;
多設備與設備集羣:
主機端的線程數量可以多於設備數量,但是同一時刻一個設備上只能有一個線程;
多個設備可以通過C提供的多線程進行管理;
可以通過openMP管理多個設備;
cuda可以與MPI聯用;
OpenMP:用於共享內存並行系統的多線程程序設計的一套指導性註釋;提供並行算法的高層抽象描述,程序員在源代碼中加入專用pragama來知名自己的意圖,編譯器自動將程序並行化;非常適用於基於數據分級的多線程程序設計;不適合需要複雜線程同步和互斥的場合;不能在飛共享內存系統(如計算集羣常用mpi)上使用;