前言
GPU 是如何實現並行的?它實現的方式較之 CPU 的多線程又有什么分別?
本文將做一個較為細致的分析。
GPU 並行計算架構
GPU 並行編程的核心在於線程,一個線程就是程序中的一個單一指令流,一個個線程組合在一起就構成了並行計算網格,成為了並行的程序,下圖展示了多核 CPU 與 GPU 的計算網格:
二者的區別將在后面探討。
下圖展示了一個更為細致的 GPU 並行計算架構:
該圖表示,計算網格由多個流處理器構成,每個流處理器又包含 n 多塊。
下面進一步對 GPU 計算網格中的一些概念做細致分析。
1. 線程
線程是 GPU 運算中的最小執行單元,線程能夠完成一個最小的邏輯意義操作。
2. 線程束
線程束是 GPU 中的基本執行單元。GPU 是一組 SIMD 處理器的集合,因此每個線程束中的線程是同時執行的。這個概念是為了隱藏對顯存進行讀寫帶來的延遲所引入的。
目前英偉達公司的顯卡此值為 32,不可改動,也不應該對其進行改動。
3. 線程塊
一個線程塊包含多個線程束,在一個線程塊內的所有線程,都可以使用共享內存來進行通信、同步。但一個線程塊能擁有的最大線程/線程束,和顯卡型號有關。
4. 流多處理器
流多處理器就相當於 CPU 中的核,負責線程束的執行。同一時刻只能有一個線程束執行。
5. 流處理器
流處理器只負責執行線程,結構相對簡單。
GPU 和 CPU 在並行計算方面的不同
1. 任務數量
CPU 適合比較少量的任務,而 GPU 則適合做大量的任務。
2. 任務復雜度
CPU 適合邏輯比較復雜的任務,而 GPU 則適合處理邏輯上相對簡單的任務 (可用比較少的語句描述)。
3. 線程支持方式
由於 CPU 中線程的寄存器組是公用的,因此CPU 在切換線程的時候,會將線程的寄存器內容保存在 RAM 中,當線程再次啟動的時候則會從 RAM 中恢復數據到寄存器。
而 GPU 中的各個線程則各自擁有其自身的寄存器組,因此其切換速度會快上不少。
當然,對於單個的線程處理能力來說,CPU 更強。
4. 處理器分配原則
CPU 一般是基於時間片輪轉調度原則,每個線程固定地執行單個時間片;而 GPU 的策略則是在線程阻塞的時候迅速換入換出。
5. 數據吞吐量
GPU 中的每個流處理器就相當於一個 CPU 核,一個 GPU 一般具有 16 個流處理器,而且每個流處理器一次能計算 32 個數。
總結
1. 了解 CUDA 的線程模型是 GPU 並行編程的基礎。
2. 根據待處理數據類型來組織線程結構是非常非常重要的,而這並不輕松,尤其是當出現了需要共享的數據時。