閱讀目錄
本文通過介紹 GPU 編程技術的發展歷程,讓大家初步地了解 GPU 編程,走進 GPU 編程的世界。
曾經,幾乎所有的處理器都是以馮諾依曼計算機架構為基礎的。該系統架構簡單來說就是處理器從存儲器中不斷取指,解碼,執行。
但如今這種系統架構遇到了瓶頸:內存的讀寫速度跟不上 CPU 時鐘頻率。具有此特征的系統被稱為內存受限型系統,目前的絕大多數計算機系統都屬於此類型。
為了解決此問題,傳統解決方案是使用緩存技術。通過給 CPU 設立多級緩存,能大大地降低存儲系統的壓力:
然而隨著緩存容量的增大,使用更大緩存所帶來的收益增速會迅速下降,這也就意味著我們要尋找新的辦法了。
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 (流處理器簇),通過網絡互連變成了通過顯存互連 (多點計算模型中點之間的通信永遠是要考慮的重要問題)。
隨著 CPU "功耗牆" 問題的產生,GPU 解決方案開始正式走上舞台。
GPU 特別適合用於並行計算浮點類型的情況,下圖展示了這種情況下 GPU 和 CPU 計算能力的差別:
但這可不能說明 GPU 比 CPU 更好,CPU應當被淘汰。 上圖的測試是在計算可完全並行的情況下進行的。
對於邏輯更靈活復雜的串行程序,GPU 執行起來則遠不如 CPU 高效 (沒有分支預測等高級機制)。
另外,GPU 的應用早已不局限於圖像處理。事實上 CUDA 目前的高端板卡 Tesla 系列就是專門用來進行科學計算的,它們連 VGA 接口都沒。
注:
1. 各參數的具體含義將在以後的文章中做細致分析
2. 當前顯卡的具體參數信息可通過調試工具獲取到 (方法略)
1. CUDA
是英偉達公司推出的,專門針對 N 卡進行 GPU 編程的接口。文檔資料很齊全,幾乎適用於所有 N 卡。
本專欄講述的 GPU 編程技術均基於此接口。
2. Open CL
開源的 GPU 編程接口,使用范圍最廣,幾乎適用於所有的顯卡。
但相對 CUDA,其掌握較難一些,建議先學 CUDA,在此基礎上進行 Open CL 的學習則會非常簡單輕松。
3. DirectCompute
微軟開發出來的 GPU 編程接口。功能很強大,學習起來也最為簡單,但只能用於 Windows 系統,在許多高端服務器都是 UNIX 系統無法使用。
總結,這幾種接口各有優劣,需要根據實際情況選用。但它們使用起來方法非常相近,掌握了其中一種再學習其他兩種會很容易。
1. 不單能學會如何使用 GPU 解決問題,更讓我們更加深入地了解並行編程思想,為以後全面地掌握各種並行技術打下鋪墊。
2. 並行計算相關知識的研究與發展勢必會成為未來IT業界與學界的一大熱點。