《多核与GPU编程:工具、方法及实践》----1.3 现代计算机概览
本節書摘來自華章出版社《多核與GPU編程:工具、方法及實踐》一書中的第1章,第1.3節, 作 者 Multicore and GPU Programming: An Integrated Approach[阿聯酋]杰拉西莫斯·巴拉斯(Gerassimos Barlas) 著,張云泉 賈海鵬 李士剛 袁良 等譯, 更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。
1.3 現代計算機概覽
現代計算機模糊了Flynn分類的界限。為了獲取更高性能,根據其測試的層次,現代計算機既是MIMD也是SIMD。
通過小型化和改進半導體材料增加晶體管數目,現代計算機目前主要有兩種趨勢。
然而,為什么將CPU和GPU集成到同一塊芯片上有重要意義?在回答這個問題之前,我們先討論GPU究竟為我們帶來了什么。
GPU(Graphics Processing Unit,圖形處理器),也稱為圖形加速卡,是一種快速處理大規模圖形數據(在這些數據放入顯示緩沖區之前)的專用處理器。GPU芯片的設計和傳統CPU有很大的不同。CPU將芯片的大部分用于緩存(有時是多級緩存),只有小部分用于復雜算術和邏輯處理單元(Arithmetic and Logical Processing Unit,ALU)。其中,復雜的指令解碼和預測硬件設計避免在訪問內存數據時的掛起。
相反,GPU設計者選擇了不同的道路:少量片上緩存,大量能夠并行執行的簡單ALU。之所以采用這種設計,是因為圖形處理程序比較簡單,且數據重用率低。為了能夠充分利用多個計算內核,GPU配備了高性能的內存總線用于訪問GPU主存。
圖1-3顯示了兩者設計的不同。盡管圖1-3并沒有顯示出各部分所占芯片的真實比例,但卻非常清晰地顯示出:在CPU上緩存占絕大部分,GPU上計算邏輯單元占絕大部分。
圖1-3 NVIDIA Titan GPU和Intel i7-5960X八核CPU在硅芯片上的設計框圖。該框圖并沒有顯示各部分在芯片上的真正比例,只是顯示了計算邏輯所占的相對比例。每個SMX SIMD塊包含64KB的緩存/共享內存。每個i7計算內核包含32KB的數據緩存(L1)、32KB的指令緩存(L1)、256KB的L2緩存,以及20MB的 共享L3緩存
已經證明GPU可以提供前所未有的強大計算能力。然而,CPU和GPU通常使用性能非常低的總線(如PCIe)進行通信,這大大降低了異構計算系統的有效性。這主要是因為只有將數據從CPU內存傳遞到GPU內存后,GPU才能夠處理它們。這導致了數據規模閾值的產生,當數據規模小于這個閾值時,使用GPU并不是一個合適的方法。8.5.2節的案例研究對這個問題進行了詳細說明(見圖8-16中CPU和GPU平臺上的執行時間與數據規模)。
現在,將CPU和GPU集成到同一個芯片上的重要意義就非常明顯了。理論上,這種設計可以更好地整合計算資源,并獲得更高的性能。但這需要等待時間的檢驗。
本章下面的內容將回顧在現代多核計算機領域中一些頗具影響力的處理器設計。雖然它們不能領先很長時間,但是它們為以后處理器的設計提供了方向。
1.3.1 Cell BE處理器
Cell BE(寬帶引擎)處理器(著名的有索尼PS3的專用處理器)由索尼、東芝和IBM于2007年合作推出。Cell的設計超越時代:采用主/從、異構、MIMD架構。配備給PS3的Cell芯片具備如下特征。
主處理器(master)是一個64位的PowerPC計算內核(稱為PPE(Power Processing Element,Power處理單元)),可以運行兩個線程。主要負責運行操作系統并管理從處理器。
從處理器(worker)是8個128位的向量處理器(SPE(Synergistic Processing Element,協同處理單元))。每個SPE都有256KB的片上本地內存(不是緩存),稱為本地存儲(local store),用于存儲數據和代碼。
SPE計算內核和PPE并不兼容:二者都有自己專門的SIMD指令集。PPE負責進行初始化并調度任務開始執行。SPE間通過一條稱為EIB(Element Interconnect Bus,單元互聯總線)的高速環形互聯總線進行通信,如圖1-4所示。SPE不能直接訪問主存,但它可以在主存和本地存儲間進行DMA傳輸。
該硬件設計的目標是最大化計算效率,但降低了易編程性。
Cell是臭名遠揚的編程最困難的平臺之一。
Cell推出時,是市場上最強大的處理器,雙精度峰值性能可以達到102.4GFlops。Cell很快成為構建基于PS3集群的“預算超級計算機”的重要組件。運行在上面的應用包括天體物理模擬、衛星成像和生物醫學應用。這里需要注意的是,IBM建造的Roadrunner超級計算機(2008~2009年世界最快的計算機),配備了12 240個PowerXCell 8i處理器和6562個AMD皓龍處理器。PowerXCell 8i是原Cell處理器的增強版本:提高了雙精度浮點運算性能。
可能是因為其編程難度以及GPU的發展,Cell處理器已經逐漸退出歷史舞臺。
1.3.2 NVIDIA Kepler
Kepler是NVIDIA專門為計算應用設計的第三代GPU架構。同之前架構相比,新架構采用了全新設計。當程序員針對這個架構編寫程序時,與傳統SMP的差別非常明顯。本節將討論使GPU具有強大計算能力的架構特征。
Kepler GPU 的計算內核(CUDA Core)按組組織,稱為流多處理器(Kepler架構稱為SMX,之前架構中稱為SM,下一代Maxwell架構中稱為SMM)。每個Kepler SMX包含了可在SIMD模式下執行的192個計算內核。這些內核可以運行相同的指令序列但處理不同的數據。
然而,每個SMX可運行屬于自己的程序。SMX的總數量是區別同一系列中不同芯片的主要標志。Kepler系列中性能最高的GPU是GTX Titan,包含15個SMX。其中,為提高產品效益,一個SMX被禁用。所以GTX Titan GPU總共包含14 × 192 = 2688個計算內核。這個SMX在雙GPU芯片(GTX Titan Z)上啟用,使得該GPU的計算內核達到了驚人的5760個。AMD的雙GPU芯片:R9 295X2也包含了5632個計算內核,最大限度滿足高性能發燒友的需求。
GTX Titan GPU上的2688個計算內核可以提供高達4.5TFlops的單精浮點運算性能和1.5TFlops的雙精浮點運算性能。每個SMX只有64個雙精度計算單元(單精計算單元的三分之一)。圖1-5顯示了Kepler架構的框圖。
第5章詳細討論如何在這個架構上進行編程。簡單講,GPU用做協處理器,由CPU分配工作任務。CPU稱為主機(host)。為2688個計算內核的每一個都生成一個單獨的線程顯然是不合適的。相反,GPU編程環境允許調用稱為kernel的特殊函數,這些kernel運行時會有不同的內在/內置變量。事實上,每個kernel的調用可生成上萬個甚至百萬個線程,每個線程將會運行在GPU的一個計算內核上。
主機的執行順序可總結為:a)將數據發送到GPU上;b)調用kernel;c)等待接收GPU的執行結果。
為實現線程的快速執行,設計GPU片上內存以保持數據盡可能“接近”計算內核(每個計算內核可使用255個32位的寄存器)。為降低訪存延遲,Kepler架構增加了L2緩存。然而,相對于傳統CPU的每個計算內核,L1緩存/共享內存還是太小。傳統CPU每個計算內核的L1緩存已經達到兆字節數量級。共享內存是可尋址內存,對應用程序來說是不透明的,可以認為是可編程緩存。
這些新的架構特點表明GPU將會采用傳統CPU的設計特點。較早的GPU是沒有緩存的,每個SM的共享內存也限定在16KB。
另外一個新的架構特性是引入了動態并行概念。動態并行允許kernel生成額外的計算任務。為簡單起見,你可以認為這允許遞歸。但是動態并行顯然要深刻得多,因為它增加了GPU程序的復雜性。
NVIDIA宣稱與之前架構相比,Kepler架構可提供超過3倍GFlop/W的性能,但這僅僅是“蛋糕上的糖衣”。Kepler架構GPU是一款采用CPU設計特點、具有非常高性能的處理器,它通過使用更多、更好的計算內核大大提高了整體計算性能。
表1-1顯示了Kepler架構的功耗和能效。最高效的計算機(測量單位是TFlop/kW)是Piz Daint,一個配備了NVIDIA K20x(GK110架構)GPU的計算機。
在考慮了任務生成和共享后,GPU和CPU就是“平等”的嗎?下面的討論將會回答這個問題。
1.3.3 AMD APU
本章介紹的第三個處理器主要面向游戲機市場:索尼的PS4。AMD的APU處理器將CPU和GPU集成到同一個芯片上。盡管這不是什么大新聞,但是最引人注目的是CPU和GPU具有統一的內存空間。這也就意味著CPU將任務發送到GPU,并從GPU獲取任務結果時時沒有通信開銷。同時,它還消除了GPU編程中的主要困擾之一:顯式(或者隱式,基于中間件)數據傳輸。
AMD APU芯片實現了異構系統架構(Heterogeneous System Architecture ,HSA)。HSA由HAS基金會(HSA Foundation,HSAF)開發,并作為一個開放行業標準收到AMD、ARM、 Imagination Technologies、MediaTek、Texas Instruments、Samsung Electronics和Qualcomm等企業支持。
HSA架構定義了兩種類型的計算內核[31]。
面向延遲的處理單元(Latency Compute Unit,LCU),CPU的一般形式。LCU既支持CPU原有的指令集,也支持HSA中間語言(HSA intermediate language ,HSAIL)指令集。
面向吞吐量的處理單元(Throughput Compute Unit,TCU),GPU的一般形式。TCU只支持HASIL指令集。TCU的目標是實現高效并行執行。
使用HSAIL編寫的代碼在執行之前會首先轉化為目標計算單元的原有指令集。正是由于這種兼容性,CPU計算內核可以執行GPU代碼,并且HSA應用程序可以運行在任意計算平臺上(不用考慮該計算平臺是由LCU構成還是由TCU構成)。HSA還滿足如下特點。
共享虛擬內存。LCU和TCU共享頁表,簡化了操作系統的內存管理,并允許TCU使用虛擬內存。現代GPU并不支持虛擬內存,并受到物理內存大小的限制。TCU可能會產生頁表錯誤。
一致性內存。內存堆默認實現了完全一致性。這可以使開發者在LCU和TCU上使用軟件開發模式,如生產者–消費者模式。
用戶層次的作業隊列。每個應用程序都有一個作業調度隊列,用來存儲來自用戶空間的作業請求。這個過程操作系統kernel不需要干預。更重要的是,LCU和TCU不但可以將作業請求存儲到自己的隊列中,而且可以存儲到對方的隊列中。CPU和GPU完全是平等的。
硬件調度。TCU引擎硬件可以在不同應用程序的任務隊列中自動切換。這個過程不需要操作系統的干預,實現了TCU利用率的最大化。
同時,測試表明CPU計算內核和GPU計算內核的集成能提高計算的能效比。無論是對嵌入式領域還是對服務器領域這都是非常重要的。
圖1-6顯示了AMD Kaveri芯片的架構框圖。HSA可以說是未來的一個發展方向,它可以將任務分配給最合適的計算節點,而不用忍受性能非常低的外圍總線。串行任務更適合運行在LCU/CPU計算內核上,同時并行任務更適合運行在高帶寬、高計算吞吐量的TCU/GPU計算內核上。
AMD Kaveri家族的A10 7850 APU可以提供856 GFlops的峰值計算性能。然而,在本書寫作的時候,傳統軟件并沒有針對該硬件進行優化,從而不同充分發揮它的計算潛能。
1.3.4 從多核到眾核?:Tilera TILE-Gx8072和Intel Xeon Phi
十年來,GPU一直擁有數百個簡單計算內核,卻能夠高效完成圖像處理等特殊任務。對于一個能夠執行操作系統任務和應用軟件的通用CPU來說,要實現同樣的效果卻不容易。在過去的十年里,已經出現了由結合這兩種不同設計優勢的芯片并且通過良好的網絡配置構建的并行計算機。這是一個成功小型化的例子。
2007年8月發布的Tilera EILE74協處理器是CPU眾核模式的第一次嘗試。TILE64由二維網格形式的64個計算內核組成。同時,Tilera又推出了包含9、36和72個計算內核的不同版本。圖1-7顯示了包含72個計算內核的TILE-Gx8072。二維網格中,各個計算內核的通信信道稱為iMesh。iMesh由5條相互獨立的網狀網絡組成,可提供超過110Tbit/s的帶寬。計算內核可進行非阻塞通信,每個時鐘周期切換一次。每個計算內核有32KB的指令L1緩存、32KB的數據L1緩存、256KB的L2緩存。所有計算內核共享18MB的一致性L3緩存。所有計算內核通過4個DDR3控制器訪問主RAM。
TILE-Gx8072 CPU主要面向網絡(如濾波、限速)、多媒體(例如,轉碼)和云應用市場。其中重點是網絡市場,其芯片設計包含32個1Gbit/s的端口、8個10Gbit/s的XAUI 端口以及兩個專用壓縮加密與加速引擎(MiCA),證明了這一點。
在GPU模式下,Tilera芯片可以作為協處理器從主CPU/主機端減少(offload)繁重的計算任務。4個PCIe接口可用來加速協處理器和主機端的通信。同時,Tilera芯片可以運行Linux內核,因此可以作為獨立的計算平臺。Tilera為這個芯片提供了一個軟件開發平臺:多核開發環境(Multicore Development Environment ,MDE)。MDE基于開源軟件工具構建,如GNU C/C++編譯器、Elicpse IDE、Boost、TBB(Thread Building Block)以及其他庫。因此,它可以使用已有的工具進行多核開發,并保持對大量編程語言、編譯器和庫的兼容性。第3章和第4章討論的工具和技術對于針對Tilera 芯片開發軟件是非常合適的。
Intel踏入眾核領域的時間比較晚(2012年),但依然令人矚目。如2014年世界超級計算機Top 500排行榜的前十名,就有兩臺是用Intel Xeon Phi協處理器構建的。其中,中國天河二號超級計算機位列第一。
Intel Xeon Phi協處理器擁有61個x86計算內核,這些計算內核都是高度定制的Pentium內核。這些定制包括:為了隱藏流水線停滯或者訪存延遲,每個內核可同時運行4個線程;512位寬;在SIMD模式下每個時鐘周期可處理16個單精度浮點數和8個雙精度浮點數的向量處理單元(Vector Processing Unit,VPU)。同時,VPU還有一個擴展數學單元(Extended Math Unit,EMU),可用于處理復雜函數,如:倒數、平方根以及指數操作。每個計算內核有32KB的指令L1緩存、32KB的數據L1緩存、512KB的一致性L2緩存。
計算內核間的通信采用了一個知名的通信架構,這個架構曾經應用于Cell BE芯片上,稱為環狀架構(如圖1-8所示)。
這個環狀架構是雙向的,由6個獨立的環構成,每個方向上各有3個。這3個環分別是一個64字節寬的數據環和兩個窄環——一個地址環(Address Ring ,AD)和一個確認環(Acknowledgment Ring,AK)。AD環負責傳輸讀寫命令和內存地址,AK環用于確保L2 緩存的一致性。
L2緩存的一致性由分布式標記目錄(Tag Directory,TD)管理。TD含有芯片上所有L2緩存行的信息。
當一個計算內核發生L2緩存缺失時,通過AD環發送一個地址請求到TD。如果請求的數據塊在其他計算內核的L2緩存(假如為Core1)中,該計算內核通過AD環將一個轉發請求發送給Core1,隨后,所請求的數據塊通過數據環轉發。如果所請求的數據塊沒有在片上,TD將發送內存地址到內存控制器。
每種類型的環都有兩個,主要是為了保證可擴展性。測試表明:當只使用AK環和AD環中的一個時,只能維持30~35個計算內核的通信。
GDDR5內存控制器存在于計算內核之間,并通過這些環進行訪問。內存地址在這些控制器間均勻分配,以確保所有控制器都不會成為性能瓶頸。
硬件設計令人印象深刻。然而,如何對這61個計算內核進行編程呢?Intel Xeon Phi協處理器可作為一個PCIe卡,并能夠運行Linux操作系統。一個專門的設備驅動程序可使PCIe總線成為一種網絡接口。這就意味著,如同和主機通過網絡互聯的其他主機一樣,協處理器也可以作為一個主機。用戶可通過SSH登錄Intel Xeon Phi協處理器。
應用程序既可以運行在主機上,也可以將它們的一部分計算任務分配到Intel Xeon Phi協處理器上運行,甚至完全運行在協處理器上(這稱為native模式)。Intel Xeon Phi協處理器可用利用所有的已有共享內存或者分布式內存工具框架。程序員可以使用多線程、OpenMP、Intel TBB、MPI或者其他類似的工具構建程序。這同GPU相比是一個非常大的優勢,因為GPU’需要程序員掌握新的工具和技術。
最后,值得注意的是,所有眾核處理器架構都具有一個顯著的硬件特性:相對較低的時鐘頻率。如GPU(0.8~1.5 GHz),TILE-Gx8072(1.2 GHz),Intel Xeon Phi(1.2~1.3 GHz)。這是將數十億個晶體管集成到同一個芯片上所必須付出的代價,因為信號傳播延遲會增加。
總結
以上是生活随笔為你收集整理的《多核与GPU编程:工具、方法及实践》----1.3 现代计算机概览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电阻电位器位移电子尺信号隔离变送器
- 下一篇: 小白 mysql5.7 非安装版配置教程