5.4. 消除循環(huán)的低效率
-
代碼移動:將要執(zhí)行多次但是計算結(jié)果不會改變的計算,移動到到循環(huán)外面即寒。
image.png
5.5. 減少過程的調(diào)用
不判斷數(shù)組邊界減少過程調(diào)用姨蟋,對比如下:
就像stl中vector的成員函數(shù)和下標運算符at(),[]报辱,at進行范圍檢查与殃,而[]不進行范圍檢查。
5.6. 消除不必要的內(nèi)存引用
消除前:
消除后:
由于優(yōu)化前每次都要讀兩次內(nèi)存碍现,寫一次內(nèi)存幅疼,減少到讀一次內(nèi)存。主要是減少了讀寫內(nèi)存的次數(shù)昼接。
小結(jié)
對于以上三次優(yōu)化爽篷,達到的效果為:
原始代碼
消除循環(huán)的低效率
減少過程的調(diào)用
消除不必要的引用
可見消除不必要的引用能夠使得優(yōu)化的效果提升最明顯。
5.7.理解現(xiàn)代處理器
處理器能夠達到的最大優(yōu)化目標
已經(jīng)達到的優(yōu)化與目標值的對比:
5.8. 循環(huán)的展開
循環(huán)展開是達到延遲界限的手段:
循環(huán)展開后的效果如下;
展開次數(shù)與CPE的關(guān)系:
進一步優(yōu)化的瓶頸:
由于連續(xù)相乘或者相加等操作需要下次運算使用上一次的結(jié)果慢睡,使得兩個動作必須是順序化的逐工。這使得處理器無法使用流水線化的功能特性。 造成了最低只能達到延遲的界限漂辐。為了突破延遲界限泪喊,需要使得連續(xù)相乘也能并行化。
5.9. 提高并行性(利用流水線的特性)
5.9.1多個累計變量
類似于cuda中的延遲隱藏特性髓涯。使得更多的數(shù)據(jù)就位袒啼,充分利用流水線特性。
為了將相乘解偶,使用多個并聯(lián)相乘值:
這使得我們突破了延遲界限:
繼續(xù)增加多路并ixng行:
都幾乎達到了吞吐量的界限蚓再。
需要展開的數(shù)量
此數(shù)量與延遲L與容量C有關(guān)滑肉,即。則根據(jù)下圖:
取各個的最大值摘仅,k需要值為靶庙。從上圖可以看出,在等于10時实檀,乘法達到吞吐量界限。
5.9.2.重新結(jié)合變換
重新結(jié)合變換也是打破了連續(xù)相乘的依賴性:
關(guān)鍵路徑:
與combine5的對比:
結(jié)果少了一次按声。
5.9.3 使用向量化的并行:
以上都是標量的修改膳犹,使用向量,可以繼續(xù)提高:
再次小結(jié)
可以總結(jié)優(yōu)化的步驟如下:
- 消除循環(huán)的效率(1.x倍的提升);
- 減少過程的調(diào)用(很少的優(yōu)化);
- 消除不必要的內(nèi)存引用(減少訪問內(nèi)存签则,多用寄存器)(x倍的優(yōu)化);
- 循環(huán)的展開须床,(1.x倍的優(yōu)化),使得達到了延遲界限;
- 使用流水線的特性(兩種方式)達到延遲界限 (x倍的優(yōu)化);
- 使用向量并行;
- 注意重新的結(jié)合可能影響浮點數(shù)的準確性
可以看出對于優(yōu)化渐裂,最有效的是3豺旬、5項的優(yōu)化,即消除不必要的內(nèi)存引用與流水線特性提高并行性柒凉。
5.11. 一些限制因素
寄存器溢出:
當并行都p超出了可用寄存器數(shù)量時族阅,效率反而下降:
但是一般不會出現(xiàn),在寄存器溢出之前就達到了吞吐量界限膝捞。
--2021.04.04于清明節(jié)假期第二天
放風箏時狗子風箏上樹了坦刀,為了救它,我也跟著爬上去了