天天看點

《高性能科學與工程計算》——3.7 習題

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

3.1 非連續訪存。如果一個或者多個數組以不定間隔方式讀寫,3.1節中介紹的代碼平衡值和lightspeed應如何修改?對于一個間隔為s的向量操作,可以期望什麼樣的性能特征?

《高性能科學與工程計算》——3.7 習題

https://yqfile.alicdn.com/f4d46bc43e1aa78377925fe95132f34f23f08b1b.png" >

3.2 平衡值的樂趣。計算下面循環核心的代碼平衡值,假定所有數組都需要從記憶體中加載,并且忽略訪存延遲的影響(超過計數變量i和j的循環行為是預設的)。

(a) Y(j) = Y(j) + A(i,j) * B(i) (矩陣向量乘)

(b) s = s + A(i) * A(i) (向量範數)

(c) s = s + A(i) * B(i) (标量乘)

(d) s = s + A(i) * B(K(i)) (帶間接通路的标量乘)

除數組K存儲4位元組的整型數外,所有數組都是雙精度浮點類型。s是一個雙精度标量。根據理論峰值帶寬和STREAM實測帶寬(MFlop/s),計算這些核心在Xeon 5160處理器單核和1.6節描述的原型向量處理器上的期望性能。Xeon CPU的cache行長度為64個位元組。可以假設N足夠大進而使數組不能全部加在到cache中。對于(d),請給出在Xeon處理器上最好和最壞的情形。

3.3 性能預測。未來主流微處理器架構的SIMD能力将會得到極大增強。其中一個可能的特征是x86處理器将能夠在長度為256位(而不是128位)的寄存器上執行乘法和加法指令,也就是說可同時執行4個雙精度浮點數的運算。這将會有效提高峰性能至兩倍,如果L1 cache帶寬也提高兩倍,那麼每個時鐘周期執行的操作數将從4次提高到8次。假定其他參數如記憶體帶寬和時鐘性能保持不變,那麼與目前英特爾“Core i7”(有效基于STREAM的機器平衡值為0.12W/F)單核性能相比,評估可以得到的性能提升。假定一個完美的SIMD向量應用程式,其60%的計算時間代碼平衡值為0.04 W/F,40%的計算時間代碼平衡值為0.5 W/F。如果廠商選擇大力提升CPU的SIMD能力,例如,引進更長長度的向量。在這種情況下,什麼會成為限制性能的絕對因素。

3.4 優化三維Jacobi算法。概括3.3節介紹的二維Jacobi算法,并考慮三維算法。變換記憶體循環的長度,你會期望性能特征的哪些改變(圖3-6)?參考3.4節介紹的稠密矩陣轉置算法的優化,你能否得出消除性能下降的方法?

3.5 重新審視記憶體循環展開。到目前為止,我們遇到記憶體循環展開的可能性僅存在于軟體流水和SIMD優化中(參見第2章)。記憶體循環展開在很多情況下是否也能夠改進代碼平衡值?通過内層循環展開提升Jacobi算子性能需要考慮哪些方面?

3.6 不能循環展開?考慮下面的下三角矩陣向量乘代碼:

《高性能科學與工程計算》——3.7 習題

能否用展開并合并技術作用于外層循環(參見3.5.2節)來減少代碼平衡值?嘗試編寫上面代碼的四路展開版本。N沒有特定的假設(除了N取值為正),矩陣A下三角(包括對角線)之外的所有元素都不能通路。

3.7 應用程式優化。對于下面的代碼,你建議用什麼優化政策?嘗試修改下面代碼,使其能夠達到最高性能。

《高性能科學與工程計算》——3.7 習題

https://yqfile.alicdn.com/b1c2d26bdb021f7e721220c6bfcae049bee87b12.png" >

對于N沒有任何假設。然而,你可以假設這是一段會被頻繁調用的子程式,s和v在不同的調用中可能會發生變化,且v的所有元素都為正值。

3.8 TLB的影響。即使最現代的處理器,也沒有足夠大的快表可以存儲駐留在外層cache上所有記憶體頁面的映射。為什麼TLB會如此小?這難道不是一個設計中的性能瓶頸嗎?使用大頁有什麼好處?

繼續閱讀