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