天天看點

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

本節書摘來自華章計算機《高性能科學與工程計算》一書中的第3章,第3.1節,作者:(德)georg hager gerhard wellein 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

在高性能計算中,訪存是最重要的性能限制因素。如前所述,微處理器的理論峰值性能和訪存帶寬存在固有的“不平衡性”。因為很多科學和工程應用程式由需要大量資料傳輸的基于循環的代碼構成,是以相對較低的記憶體(甚至是硬碟)訪存帶寬,就會導緻片上資源的低效利用和程式性能的降低。

圖3-1綜合顯示了現代并行計算機系統的資料通路構成,以及在不同層次上的帶寬和延遲範圍。執行計算任務的功能部件位于該層次結構的頂部。在這些不同層次的資料通路中,訪存帶寬最大有3~4個數量級的差異,訪存延遲最高也有8個數量級的差異。為了獲得計算操作數,資料傳輸需要到達的資料通路層次越深,對性能的影響就越小。是以,任何優化首先要考慮減少在性能低的資料通路上的資料傳輸。當這不能實作時,至少要讓資料傳輸盡可能高效。

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

https://yqfile.alicdn.com/7c3acad83f4db5d79185697cc026ba0ce315416e.png" >

3.1.1 基于帶寬的性能模組化

許多程式員都會竭盡全力提高程式性能。為了确定這些努力是否有效或者确定目标程式是否已經得到了充分優化,程式員會使用簡單的經驗法則來評估這些基于循環且帶寬訪存受限的代碼的理論性能。這裡引入一個核心概念:平衡(balance)。例如,一個處理器晶片的“機器平衡”bm等于可能的訪存帶寬(gword/s,千兆字/秒)與峰值性能(gflop/s,千兆浮點運算次數/秒)的比值:

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

盡管“訪存帶寬”通常對真正訪存受限的代碼有用,但這個術語可被cache帶寬或者網絡帶寬代替。假定訪存延遲被預取和軟體流水這類技術隐藏,例如,一個時鐘頻率為3.0 ghz的雙核晶片,每核每個時鐘周期最多可執行4個浮點數計算,訪存帶寬為10.6gb/s,則這個處理器的機器平衡值為0.055w/f。在本書進行寫作的時候,bm值一般位于0.03w/f(标準的基于cache的微處理器)~0.5w/f(高端行向量處理器)之間。由于不斷增長的dram差距和不斷增加的處理器核數,未來标準架構的機器平衡值可能會降低。表3-1顯示了不同資料傳輸路徑的平衡值。

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

https://yqfile.alicdn.com/684863d7b192a35a2f5cc0891e883005e5d47701.png" >

圖3-2收集了1994~2010年間,英特爾處理器的峰值性能和訪存帶寬資訊(選取每年時鐘性能最高的桌面處理器作為代表)。盡管2005年之前峰值性能的增長速度要快于訪存帶寬,但第一款雙核晶片(pentium d)的推出才真正大幅增大了dram差距。雖然core i7為訪存帶寬赢回了一些顔面,但長期的發展趨勢顯然不會受到這個例外的影響。

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

為了量化運作在具有特定平衡值機器上的代碼需求,我們進一步定義了循環的代碼平衡值:

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

“資料傳輸量”表示通過資料通路(性能限制因素)傳輸的所有資料量(機關為字),這個術語在一定程度上依賴于硬體(見3.3節執行個體)。代碼平衡值的倒數稱為計算密度(computational intensity)。現在我們可以計算出代碼平衡值為bc的代碼在機器平衡值為bm的裝置上所能達到的峰值性能的最大期望:

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

我們将這個小數稱為循環的“lightspeed”。則所能達到的峰值性能(gflop/s)為:

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

https://yqfile.alicdn.com/01d6d0088ce2365cb497fbf3d01acf35e8818a26.png" >

如果l ≈ 1,則代碼性能的限制因素将在cpu或其他地方,訪存帶寬不再是代碼性能的限制因素。值得注意的是這個簡單的性能模型是基于以下幾點重要假設:

循環代碼應以最佳方式使用所有的算術單元(乘法和加法)。如沒有,則必須引入一個校正因子來反映有效峰值性能和絕對峰值性能的比值(例如,如果代碼隻使用了加法單元,則有效峰值性能為絕對峰值性能的一半)。當使用的核心數量少于晶片上的核心總數時,也要有類似的考慮。

雖然循環代碼基于雙精度浮點數運算。然而我們可以非常容易地得到更加适合其他代碼的相似術語(例如,32位字每整數算術運算指令)。

資料傳輸和運算完美重疊。

最慢的資料通路決定了循環代碼的性能。所有更快的資料通路都被認為是無限快的。

計算系統面向吞吐量,即忽略延遲對性能的影響。

完全有可能實作對記憶體帶寬的利用達到飽和,進而使機器平衡值的計算達到最大值。近年來的多核架構設計中如果隻使用其中一部分核,則對記憶體接口的使用是低效的。這使得性能預測更加困難,因為這需要一個單獨的“有效”機器平衡值,這個值不僅是簡單地使用核數與總核數的比值。3.1.2節和習題3.1對這點會有更加詳細的讨論。

雖然平衡模型經常很有用,足夠評估循環代碼的性能,并能對性能優化提供指導(特别是同可視化結合起來,比如roofline模型[m42])。我們必須強調的是确實存在更加先進的性能模型政策,參見文獻[l76, m43, m41]。

我們以1.3節介紹的标準向量基準代碼為例:

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

https://yqfile.alicdn.com/583f9a483dc8801fe68d218765db7037a7b1816d.png" >

該核心每個疊代循環執行兩次浮點數運算、三次資料讀取指令(讀取資料b(i)、c(i)和d(i))和一次資料存儲指令(存儲a(i))。代碼平衡值為bc = (3+1)/2 = 2。如果該代碼運作在機器平衡值bm = 0.1的cpu上,那麼我們可以預期lightspeed比為0.05,即峰值的5%。

基于cache的标準微處理器,其最外層cache通常會具有回寫政策。如1.3節所述,如果延遲寫或者行0未被使用時,當一次寫操作未命中時,為保證cache –存儲器的一緻性,需要一次cache行的寫配置設定。在這樣的條件下,計算代碼平衡值時,數組a的存儲操作必須計算兩次,這樣我們計算出最終的lightspeed為lwa = 0.04。

3.1.2 stream 基準測試

mccalpin stream是用來評估處理器或者系統記憶體接口性能的基準測試,包含四個簡單的合成核心循環代碼。表3-2列出了它們的操作以及各自的代碼平衡值。有效記憶體帶寬(gb/s)通常作為其性能提供報告。注意不要将stream triad核心與上一節讨論的三元組向量操作混淆,它包含一個額外的資料讀取操作。

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

stream基準測試存在串行和openmp并行兩個版本(參見第6章)。這兩個版本通常都運作在足夠大的資料集上,以確定核心性能都是訪存受限的。是以,記憶體帶寬測試僅依賴于資料讀取和存儲操作的次數,copy和scale(add和triad同樣适用)核心代碼的性能結果往往類似。需要搞清楚的是,stream并不是僅通過表3-2列出的循環核心定義的,還包含fortran源代碼(也有可用的c語言版本)。這一點非常重要,因為經過優化的編譯器會識别出stream源代碼,進而使用手工優化的機器代碼代替核心代碼。是以,stream的性能結果可以真實地反映出硬體的實際性能。在stream網站上可以找到許多針對過去和現在的計算機系統的基準測試代碼[w119]。

遺憾的是,stream同三元組向量代碼一樣,達不到平衡分析所預測的性能水準,特别是在商業(基于pc的)硬體上。其中的原因是多方面的,這裡不進行詳細讨論,主要原因如下:

在讀和寫兩個方向上往往不能同時達到峰值帶寬。例如,存在這種情況,記憶體讀和記憶體寫的峰值帶寬的比例為2 : 1,在這種情況下,寫操作并不能充分利用記憶體帶寬。

協定開銷(參見4.2.1節)、晶片缺陷、記憶體晶片的錯誤校正,以及高延遲(不能完全被預取隐藏)都會降低有效帶寬。

處理器晶片上的資料通路(如l1 cache和寄存器間的資料通路),可以是單向的。如果代碼在讀和寫操作間沒有取得很好的平衡,那麼在一個方向上的記憶體帶寬可能不會得到充分利用。這是在cache上進行平衡分析時應該考慮的内容。

然而,stream結果所标記的最大記憶體帶寬依然是正确的。沒有具有類似特征(讀寫操作的數量)的實際應用代碼可以表現得更好。這樣,在lightspeed計算中應該引用stream所測得的帶寬bs,而不是硬體的理論值。式(3-4)可修正為:

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估

如果一個實際應用程式能夠達到基于stream預測帶寬的較大比值(如80%),往往意味着該程式沒有繼續改進記憶體接口使用率的餘地。當然,這并不意味着沒有進一步優化的空間(如下面章節的讨論)。

我們選擇一個使用英特爾xeon 5160 處理器(參見圖4-4)的系統作為測試平台。該處理器的每核理論記憶體帶寬為bmax = 10.66 gb/s,峰值性能為pmax = 12 gflop/s(3.0ghz,每個時鐘周期可執行4次浮點數運算),則單核機器平衡值為bm = 0.111 w/f(如果兩個核都運作訪存受限代碼,則該值需除以2。但是目前我們假定每個系統通路隻運作一個線程)。

表3-3顯示了stream在這個平台上,有無寫配置設定的比較測試結果。由于基準測試代碼并沒有考慮這個細節,是以當存在寫配置設定操作時,測試帶寬和實際記憶體傳輸不同。如

表3-3所示,實測性能和理論峰值性能的差距非常明顯,在這個平台上幾乎不可能超過峰值帶寬的40%。add與triad(兩次讀取操作而不是一次)核心的效率特别低。如果這個結果被用來做循環代碼的平衡分析,copy和scale應該運作在加載/存儲(寫入)平衡的情況下。3.3節将會讨論一個具體執行個體。

《高性能科學與工程計算》——第3章 資料訪存優化3.1 平衡分析與lightspeed評估