CUDA異步並行

異步函數使得主機端與設備端並行執行:控制在設備還沒有完成前就被返回給主機線程;

    包括:

      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)上使用;

發佈了48 篇原創文章 · 獲贊 81 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章