CUDA 概念匯總


簡介

最近接觸到了 cudaStream,對於一個沒寫過 CUDA 的人來說,一時有點難理解。於是網上找了幾篇文章,快速入門了一下。其實說白了 cudaStream 就是一個執行流,用以提高並行度。

下面是學習過程中見到的概念。概念真的太重要了。

核函數:CUDA 的執行單元。核函數用 __global__ 符號聲明,在調用時需要用 <<<grid, block>>> 來指定kernel要執行的線程數量

線程層次結構:grid -> block -> thread。一個 grid,多個 block,一個網格上的線程共享相同的全局內存。一個 block,多個 thread,一個 block 上的 thread 使用共享內存來通信。grid 和 block 都是三維的,在核函數中可以使用 blockDimgridDim 來獲取維度大小。

流式處理器:一個 block 上的所有線程在一個 SM 上執行,多個線程對應多個 core,每個 core 有寄存器、局部內存(local memory),每個 SM 上又有內存(shared memory),整個 GPU 上又有另一個內存(global memory)。

線程束:SM 采用了 SIMT 架構,基本的執行單元是線程束,一個線程束 32 個線程,這些線程執行相同的指令。遇到分支情況,需要等待,因為單指令多線程,即每個線程上的指令都是一樣的,所以分支情況性能會差。

顯存的使用:設備上使用的內存和主機上使用的內存不是一個東西,所以如果要在設備上進行計算,需要將數據拷貝到設備上后計算。

統一內存:CUDA 6.0 引入的概念,使用一個托管內存共同管理 host 和 device 的內存,函數調用 cudaMallocManaged

Stream:利用 Stream 將內存讀取和數值運算並行,從而提升數據的吞吐量。默認情況下,CUDA 使用一個 Default Stream 來進行數據拷貝。通常采用將數據分塊的做法,將不同數據塊分配給不同的 Stream 做數據傳輸和計算,這樣多個數據塊就並行起來了,提高了並行度,從而提升數據的吞吐量。相關的 API 有 cudaStreamCreate, cudaMemcpyAsync

Event:用以監視流的運行情況,或者精確計時。

總結

看了下面的參考資料,算是稍微認識了一下 CUDA。如何進一步學習呢?進一步 CUDA 做什么呢?我們用 CUDA 的目的無非就是利用並行計算來加速運算,本質就是算的更快。進一步學習 CUDA 的目的就是可以更快的計算,即性能優化,掌握各種 Trick,掌握硬件架構等。至於我,就不深入學習了... 我只不過是想知道 cudaStream 是干嘛的。

參考資料

[1] https://zhuanlan.zhihu.com/p/34587739

[2] https://zhuanlan.zhihu.com/p/51402722

[3] https://zhuanlan.zhihu.com/p/75720006

[4] https://zhuanlan.zhihu.com/p/53773183


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM