本書系統講解了GPU體系結構和OpenCL編程。全書分為14章:第1~3章主要講解GPU的體系結構與編程;第4~7章主要講解OpenCL的語法與常用的API;第8~13章主要用實例的方式講解OpenCL編程;第14章則從案例出發,以項目的方式講解HSA的實現。
由AMD和清華大學專家聯袂推出的異構計算扛鼎之作。
本書結合了作者的*新科研成果,對于光線追蹤和稀疏矩陣算法的應用進行全面剖析。本書立足實戰和應用,案例豐富,可操作性強
這是一本關于圖形處理器計算的書,也是一本為圖形處理器程序員編寫的書,但不是一本關于圖形程序的書。圖形處理器本來是專門處理圖形顯示的處理器,所以GPU總是與圖形程序還有圖形編程語言OpenGL聯系在一起,但是本書提到的“計算”和“程序”就是每個程序設計初學者所說的“計算”和“程序”,與圖形完全沒有任何關系。
本書使用的語言是OpenCL,是使用GPU進行通用計算的編程語言。、這里所說的“通用”,其實就是“圖形之外”的意思。那么,為什么要使用圖形處理器做通用汁算呢?第1章會深入討論這個問題,這里我們只需要記住簡單答案:①圖形處理器可以同時支持大l并行任務,其峰值處理能力超過當前所有其他處理器;②如果應用程序具備足夠的并行性,則圖形處理器比當前所有其他處理器的計算速度都要快。
這里用到了“并行”的概念。計算機科學中的“并行處理”定義是:南若干處理單元協作完成某一計算任務,并且這些動作的完成過程一般在時間上有所重疊。并行處理其實是Fi然界最常見的現象。我們所生活的世界本質上就是并行的,大家只要想象高速公路-l -的車流就可以獲得直觀的感覺。如果從公路角度看,公路就是處理車流的裝置。苒‘先,公路分成多個車道,相當于提供了多個并行處理單元,這是空間的并行;其次,一條車道1-也可以同時行駛多輛汽車,只是這些車輛在空間上是順序分布的,這是時間上的并行,類似T CPU內部的流水線。公路上的汽車在統一行為協議(即交通駕駛規則)下以協作和競爭并存的方式分享資源。我們不僅擁有并行的外部世界,人腦也是并行_丁作的。人類思維和意識的基本單元是神經元,它們能夠通過電化學反應對周圍的刺激產生響應。人腦中的100億N 150億個神經元細胞可聯結為異常復雜的網絡,思維活動被映射到這個網絡并進行高度并行處理。
雖然并行現象無處不在,人類制造的計算機卻從順序處理機制起步。在計算機技術的甲.期發展階段,硬件成本昂貴,沒有足夠資源去采用并行結構。隨著集成電路技術的發展,硬件資源越來越多,從20世紀八九十年代開始發展起來的流水線、超標量計算機和超長指令字等技術為CPU引入了并行執行硬件,但是在編程上仍然沿用順序語言,由硬件或編譯器尋找指令間的并行性。這種隱含并行模型其實是絕好的硬件“封裝”方法,程序無需任何修改就可以在更新一代的處理器上獲得更好的性能。2000年以后,隨著指令間并行性的逐漸飽和,計算機體系結構發生了重大轉變,普遍的做法是在處理器芯片上部署多個指令執行內核,從而利用仍在不斷增長的集成電路資源。換言之,未來不會有更快的處理器內核,但是能夠使用的內核數量會越來越多。這一趨勢的意義極為深遠:首先,我們并不了解兼顧性能、功耗和可編程性的最佳并行處理器體系結構,因此未來的并行處理器必然會出現一個群雄并起的階段;其次,目前的處理器能夠提供任務級、數據級、線程級等多種并行方式,然而,自動并行化技術遠未成熟,只能由程序員指定具體的并行方式,以最大限度地發揮并行處理器的能力,所以眾多嶄新的并行編程語言必然應運而生;最后,主流計算平臺要求從算法設計到代碼執行的全面并行化,這還是人類文明史上的第一次,我們將不可逆轉地走向并行計算之路。
在當前眾多的新興并行處理器和編程模型中,GPU通用計算具有獨到的特色和優勢。經歷30年的發展,GPU已經擁有成熟的體系結構、完備的工具鏈和龐大的用戶規模。GPU的最初設計目的是高速圖形顯示,該任務具有先天的高度并行性,因此GPU體系結構始終是為支持海量并行處理而設計的,而人類對視覺效果的無盡追求使得GPU發展成為高度優化的硬件平臺。隨著眾多研究人員意識到GPU在通用計算方面的潛力,NVIDIA首先推出了圖形處理器通用編程技術,從而在高性能計算領域占據了一定的市場份額。隨著眾多GPU制造商的紛紛跟進,大家開始意識到兼容性問題。GPU市場仍然處于“戰國”時代,桌面GPU市場由Intel、NVIDIA和AMD三家公司分享,后兩者主導高端GPU。而移動GPU的競爭者更多,Imagination、ARM、NVIDIA、Qualcomm、Samsung等公司也都有自己的產品。
為了借鑒OpenGL的成功經驗,使得基于不同硬件體系結構的GPU能夠在源代碼級實現兼容,各大GPU及其下游產品制造商合作制定了OpenCL圖形處理器通用計算語言標準,并由Khronos集團發布和維護。作為OpenGL的姊妹語言,OpenCL也是跨平臺兼容的標準化語言。實際上,任何處理器只要提供相應編譯器、驅動和動態運行時( runtime)環境,就可以執行OpenCL程序,著名的可編程芯片制造商Altera甚至可以將OpenCL編譯到硬件上執行。當然,OpenCL的語法和語義是針對圖形處理器硬件設計的,只有具有相應結構的硬件才能高效執行OpenCL代碼。
OpenCL和CUDA也經常被稱為異構編程語言,這是因為相應代碼總是使用CPU和GPU這兩種在硬件體系結構和代碼執行方式上有很大區別的計算資源。一方面,目前的GPU還不能運行操作系統,所以GPU通用計算程序總是在CPU上啟動;另一方面,在GPU通用計算程序中也允許使用C/C++語言編寫在CPU上執行的代碼。從目前的技術看,CPU和GPU分別適應不同的計算結構,雙方在應用角度上的互補關系遠大于競爭關系,這種定位在可預見的未來并不會發生改變,因此異構計算代表了未來的方向。大部分異構平臺一般采用CPU處理器芯片+GPU處理器芯片的形式,而對于在軟件層面整合兩種計算資源,唯有AMD公司邁出了關鍵一步,通過定義異構系統體系結構(Heterogeneous SystemArchitecture,HSA)實現了CPU和GPU的緊密耦合,使兩種處理器集成在同一芯片上并共享片外存儲器。
介紹到這里,本書的舞臺就已經搭建好了。本書共有14章,第1~3章從圖形處理器的歷史開始,依次討論GPU硬件體系結構和HSA,以及具有代表性的HSA處理器。
第4~7章介紹OpenCL編程,包括基本語法、并行組織方式、事件和任務隊列,以及OpenCL 2.0引入的高級特征。第8~13章用一組實例由淺人深地講述并行程序設計和編程技巧。第14章介紹了一個比較復雜的應用實例——光線追蹤圖形渲染,總結了OpenCL程序設計技術。
設計簡潔、高效的代碼從而最大限度地發揮并行硬件的能力,是每一位嚴肅對待工作的程序員發自心底的愿望。謹以此書獻給嚴肅的程序員們。
鄧仰東 2006年獲得卡內基·梅隆大學計算機工程博士學位,現在是清華大學軟件學院副教授,知名集成電路計算機輔助設計和圖形處理器通用計算專家,被譽為“GPU通用計算技術的先行者”。
朱茂華 加州大學圣塔芭芭拉分校計算機科學系博士候選人,研究方向包括計算機體系結構和機器學習算法。
劉春峰 慕尼黑工業大學電機和計算機工程系博士候選人,研究方向包括生物芯片和計算機輔助設計。
推薦序
前言
第1章GPU計算的發展歷程 l
1.1計算機圖形學的發展 2
1.2圖形流水線 6
1.3 GPU的發展過程 8
1.4 GPU通用計算的發展歷程 15
參考文獻 18
第2章現代圖形處理器的體系結構 20
2.1計算機體系結構基礎 2l
2.2 GPU的設計思想 23
2.3 NVIDIA圖形處理器 25
2.3.1總體體系結構 _26
2.3.2流多處理器 29
2.3.3流多處理器的擴展 31
2.3.4存儲器 34
2-4 AMD Graphics Core Next圖形
處理器體系結構 37
2.4.1 GCN計算單元 38
2.4.2 GCN緩存 40
2.4.3 GCN GPU 41
2.5 ImaginationPowerVR移動圖形
處理器體系結構 一42
參考文獻 _44
第3章異構系統體系結構和
融合處理器 45
3.1 HSA基本概念 47
3.2異構系統體系結構存儲器
模型 50
3.2.1虛擬存儲器的地址空間 ‘51
3.2.2緩存一致性 52
3.2.3內存一致性 53
3.3異構任務隊列式調度
機制 54
3.4任務搶占和內容切換 57
3.5 HSA中間語言 57
3.6 AMD的HSA硬件 一60
習題 62
參考文獻 63
第4章OpenCL基本概念 64
4.1 0penCL程序的工作流程 64
4.2 0penCL平臺與設備 65
4.3上下文、命令隊列、kernel
函數 70
4.4存儲對象 72
4.5 Hello World例程 73
習題 82
參考文獻 82
第5章0penCL并行編程基礎83
第6章0penCL事件和隊列108
第7章0penCL2.0高級特征119
第8章并行程序設計方法134
第9章N體問題152
第10章歸約問題165
第11章快速傅里葉變換178
第12章稀疏矩陣---向量積191
第13章直方圖208
第14章光線追蹤算法的0penCL實現214
參考文獻237