CUDA学习小记
CUDA學習小記
標簽: cuda編譯器thread編程api存儲 2009-12-18 21:17 1815人閱讀 評論(0) 收藏 舉報 分類: CUDA(6)版權聲明:本文為博主原創文章,未經博主允許不得轉載。
斷斷續續看了一個星期cuda,然后就感冒了(cuda的魅力真是大==!),今天原地復活,復習一下,做下學習筆記。
?
CPU代碼作用:在kernel啟動前進行數據準備和設備初始化的工作,以及在kernel之間進行的一些串行運算。理想狀況下?,CPU串行代碼的作用只是清理上一個kernel函數,并啟動下一個kernel函數。
?
CUDA并行計算函數kernel:它是整個CUDA程序中的一個可以被并行執行的步驟。
?
kernel函數中存在兩個層面的并行:Grid中的block間并行;block中的thread間并行。
?
kernel:組織形式是grid;以block為單位執行。
?
Grid:表示一系列可以并行的block的集合;
???????? 各個block之間無法通信,沒有執行順序;
?????????目前一個kernel中只有一個grid,未來DX11中將采用MIMD架構,允許一個kernel中存在多個不同的grid。
?
block:同一個block的線程需要共享數據,必須在同一個sm中發射;(在同一個時刻,一個sm中可有多個活動block)
????????? block中的每一個thread被發射到一個sp上;
????????? block的數量是處理核心的數量的幾倍的時候,才能充分發揮GPU的運算能力:如果太少,無法體現其計算速度相較傳統方式的優勢。
?
Thread:有自己的私有寄存器和local memory;
???????????? 同一個block內的線程可以通過共享存儲器和同步機制進行通信。
?
實際運行單元:warp(線程束),大小由硬件能力決定。tesla架構的gpu中為32。劃分依據是block的ID,比如,0~31為一束。
??????????????????? 32的warp:每發射一條warp指令,sm中的8個sp會將這條指令執行4遍。
?
?
CUDA編程key:
??? 程序以及warp中盡量避免分支:
???? ???????????? warp中盡量避免使用分支:如果有分支,sm需要把每一個分支的指令發射到每一個sp上,再根據sp決定要不要執行,執行時間將
??????????????????是所有分支之和。
???? 優化存儲器訪問:理想狀態時所有存儲器僅此那個傳輸的同時,GPU的各個核心也始終在進行計算。這需要合理劃分程序。
?
?
CUDA軟件體系:
????????CUDA C:一種用c語言編寫設備端代碼的編程方式,包括對c的一些擴展和一個運行時庫。
???????? nvcc編譯器:分離源文件中的主機代碼和設備代碼;
????????????????????????? 主機代碼由c文件形式輸出,交流高性能編譯器,如ICC、GCC或者其他合適的高性能編譯器進行編譯。或者在編譯的最后階段交給其他編譯器生成.obj或者.o文件。
????????????????????????? 設備代碼由nvcc編譯成ptx代碼或者二進制代碼。
?????????????????????????
?????????ptx代碼:類似于匯編余元,是為動態編譯器jit設計的輸入指令序列。
????????????????????? jit可以在使用不同的機器語言的顯卡上運行同樣的ptx,保證兼容性。
????????????????????? jit的輸出受到硬件和其他一些因素影響,有不確定性。
????????????????????? 對于需要確定代碼的獨立軟件開發商,可以把代碼編譯成cuda二進制代碼cubin,避免jit過程的不確定性。
?
CUDA運行時api:在驅動程序api基礎上進行了封裝,編程方便。
??????????????????????? 放在CUDArt包中;
????????????????????????函數以CUDA前綴;
CUDA驅動程序API:基于句柄的底層接口。
????????????????????????? 放在nvCUDA包里;
??????????????????????????前綴為cu;
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 西湖大学生命学院章永登实验室 (超分辨成
- 下一篇: OpenCV中霍夫圆检测