前言
本文通過介紹 GPU 程式設計技術的發展歷程,讓大家初步地瞭解 GPU 程式設計,走進 GPU 程式設計的世界。
馮諾依曼計算機架構的瓶頸
曾經,幾乎所有的處理器都是以馮諾依曼計算機架構為基礎的。該系統架構簡單來說就是處理器從儲存器中不斷取指,解碼,執行。
但如今這種系統架構遇到了瓶頸:記憶體的讀寫速度跟不上 CPU 時脈頻率。具有此特徵的系統被稱為記憶體受限型系統,目前的絕大多數計算機系統都屬於此型別。
為了解決此問題,傳統解決方案是使用快取技術。通過給 CPU 設立多級快取,能大大地降低儲存系統的壓力:
然而隨著快取容量的增大,使用更大快取所帶來的收益增速會迅速下降,這也就意味著我們要尋找新的辦法了。
對 GPU 程式設計技術發展具有啟發意義的幾件事
1. 70年代末期,克雷系列超級計算機研製成功 (克雷1當年耗資800萬美元)。
此類計算機採用若干記憶體條的共享記憶體結構,即這些記憶體條可以與多個處理器相連線,從而發展成今天的對稱多處理器系統 (SMD)。
克雷2是向量機 - 一個操作處理多個運算元。
如今的 GPU 裝置的核心也正是向量處理器。
2. 80年代初期,一家公司設計並研製了一種被稱為連線機的計算機系統。
該系統具有16個 CPU 核,採用的是標準的單指令多資料 (SIMD) 並行處理。連線機通過這種設計能夠消除多餘的訪存操作,並將記憶體讀寫週期變為原來的 1/16 。
3. CELL 處理器的發明
這類處理器很有意思,其架構大致如下圖所示:
在此結構中,一個 PPC 處理器作為監管處理器,與大量的 SPE流處理器相連通,組成了一個工作流水線。
對於一個圖形處理過程來說,某個 SPE 可負責提取資料,另一個 SPE 負責變換,再另一個負責存回。這樣可構成一道完完整整的流水線,大大提高了處理速度。
順便提一句,2010年超級計算機排名第三的計算機就是基於這種設計理念實現的,佔地面積達560平方米,耗資 1.25 億美元。
多點計算模型
叢集計算是指通過將多個效能一般的計算機組成一個運算網路,達到高效能運算的目的。這是一種典型的多點計算模型。
而 GPU 的本質,也同樣是多點計算模型。其相對於當今比較火的Hadoop/Spark叢集來說:“點”由單個計算機變成了 單個SM (流處理器簇),通過網路互連變成了通過視訊記憶體互連 (多點計算模型中點之間的通訊永遠是要考慮的重要問題)。
GPU 解決方案
隨著 CPU "功耗牆" 問題的產生,GPU 解決方案開始正式走上舞臺。
GPU 特別適合用於平行計算浮點型別的情況,下圖展示了這種情況下 GPU 和 CPU 計算能力的差別:
但這可不能說明 GPU 比 CPU 更好,CPU應當被淘汰。 上圖的測試是在計算可完全並行的情況下進行的。
對於邏輯更靈活複雜的序列程式,GPU 執行起來則遠不如 CPU 高效 (沒有分支預測等高階機制)。
另外,GPU 的應用早已不侷限於影象處理。事實上 CUDA 目前的高階板卡 Tesla 系列就是專門用來進行科學計算的,它們連 VGA 介面都沒。
幾款新的顯示卡及其配置 (僅列 N 卡)
注:
1. 各引數的具體含義將在以後的文章中做細緻分析
2. 當前顯示卡的具體引數資訊可通過除錯工具獲取到 (方法略)
主流 GPU 程式設計介面
1. CUDA
是英偉達公司推出的,專門針對 N 卡進行 GPU 程式設計的介面。文件資料很齊全,幾乎適用於所有 N 卡。
本專欄講述的 GPU 程式設計技術均基於此介面。
2. Open CL
開源的 GPU 程式設計介面,使用範圍最廣,幾乎適用於所有的顯示卡。
但相對 CUDA,其掌握較難一些,建議先學 CUDA,在此基礎上進行 Open CL 的學習則會非常簡單輕鬆。
3. DirectCompute
微軟開發出來的 GPU 程式設計介面。功能很強大,學習起來也最為簡單,但只能用於 Windows 系統,在許多高階伺服器都是 UNIX 系統無法使用。
總結,這幾種介面各有優劣,需要根據實際情況選用。但它們使用起來方法非常相近,掌握了其中一種再學習其他兩種會很容易。
學習 GPU 程式設計的意義
1. 不單能學會如何使用 GPU 解決問題,更讓我們更加深入地瞭解並行程式設計思想,為以後全面地掌握各種並行技術打下鋪墊。
2. 平行計算相關知識的研究與發展勢必會成為未來IT業界與學界的一大熱點。