第三篇:GPU 並行程式設計的運算架構

穆晨發表於2016-12-06

前言

      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. 根據待處理資料型別來組織執行緒結構是非常非常重要的,而這並不輕鬆,尤其是當出現了需要共享的資料時。

相關文章