intel 軟體優化學習筆記

2021-06-16 08:20:50 字數 2101 閱讀 2788

, by einsteininict。

軟體優化是一門藝術,需要從應用層演算法,作業系統,硬體體系結構等多方面來考慮。一般來說,應用層演算法和資料結構的設計對於提高程式的效能最為關鍵,但這也必須依賴於作業系統和體系結構所提供的計算模型。很多時候,人們會首先根據計算模型中的一些不變的東西,設計出應用層演算法和資料結構,然後再根據具體的硬體體系結構做些微調。然後有時,我們不得不在這三者之間做出取捨。但到底該怎麼做,我沒有資格妄下斷論。不過有一點可以肯定,越往底層走,技術要求越高,所花費的人力成本也越大,而收益則未必那麼明顯。不過,即便如此,對於乙個好奇的程式設計師來說,總是喜歡去通過自己的努力,來提高程式的效能,哪怕是那麼一點點(怎麼說的好像有點像黑客精神

廢話少說,下面的東西是我在看 intel 的《t

he software optimization cookbook》時的一點心得體會,跟大家分享一下。如果你想提高自己程式的效能,而又苦於沒學過計算機體系結構,更不想去讀intel的英文原版,那這篇文章不失為乙個不錯的選擇。

1,寫**時,注意cache(此時的cache是廣義上的,dram memory 是disk的cache,cpu 中的sram(也即常說的cpu中的cache,不過power7裡面的部分3級cache貌似用的是dram)是dram的cache)大小,盡量將工作集都集中在更加高速的cache裡面。在dram memory這一層,注意平台的physical memory的大小,估計可用的memory(物理記憶體減去作業系統所占用的記憶體)大小,在應用層選擇合適的演算法,預防頻繁的記憶體miss。

2,對於for迴圈裡面的**,考慮的優化方式有:

(1),迴圈不變數的外提。如果其涉及到函式呼叫,更要多加小心。總之不要在迴圈裡面做大量的重複性工作。

(2),c語言中,如果把臨時用到的迴圈計數變數放在for迴圈的**塊裡定義,則編譯器會「很輕鬆」的將其放入暫存器中,從而提高訪問效率,例如提倡for(int i ;.....)這種用法 。

(3),指令的流水,通過迴圈展開,減少load-to-use帶來的影響。 

(4),充分利用暫存器。

3,利用區域性性的方法

(1)   時間區域性性:對於載入到快取記憶體中的資料,要「充分」利用。

(2)   空間區域性性:資料引用的步長盡量為「1」。

4,奔4cache引數:

(1)   l1:總大小:8k,cache line:64b,4 waysassociative,2k aligned。

(2)   l2: 總大小:256k,cache line128b, 8ways associative,8k aligned。

5,軟體預取

(1),可以使用cpu提供的預取指令對於將來要用到的資料提前載入到cache(l1,l2,l3)中(預取的資料大小為cache line),另外還可設定要對資料進行的操作。在迴圈中對資料進行預取一般比較容易寫,但到底在何時將哪些資料預取到何處,要視具體應用、memory特性、memory controller特點和bus速度而定。

(2),預取的好處是可以減少coolmiss,將對程式設計師不可見的cache視覺化了,讓人興奮不已啊。

6,寫資料時不通過cache

在極少數情況下,cachewrites會有損效能和功能(比如適配卡上的控制暫存器以及其他的硬體緩衝區)因此,作業系統和裝置驅動可以在記憶體中定義一些不能被cache的部分。當cpu需要寫資料時,如果資料不在cache中,則cpu將向buffer中寫資料。當資料需要被寫回時,可以執行sfence指令,將資料立即寫回(lazy)。可以用彙編指令,intrinsics,或者有intel c++ compiler的c++庫包來實現。

(1)   強的資料相關性。

(2)   訪問過多不能被提前cache的記憶體。

8,vtune工具可以幫助分析哪些地方有cachemiss,以及他們引起的performance lose。

9,把工作集限制在乙個小的data set上,可以有效減少capacity帶來的損失,這種技術叫做stripmining或者blocking。

10,利用資料對齊來提高訪存效能。編譯器被要求對相應型別的資料進行對齊操作,只有在型別轉換或者使用union或者不同型別的資料混合使用的時候才可能出現對齊的問題,這時候要自己想辦法解決。

btw:  不成熟的優化非但不能帶來任何收益,反而有可能成為可怕的隱患。

mysql優化學習筆記

定位執行效率低的sql語句 通過explain分析效率低的sql 通過show profile分析sql 通過trace分析優化器如何選擇執行計畫 確定問題,採取措施優化 匹配全值,條件所有列都在索引中而且是等值匹配 匹配值的範圍查詢,字段必須在索引中 匹配最左字首,復合索引只會根據最左列進行查詢 ...

效能優化學習筆記

js css鬆散耦合盡量避免直接用js操作樣式,改為控制類名 element.classname edit 解耦應用邏輯和事件處理程式 使用常量優化效能,提公升 維護性 避免全域性查詢 優化迴圈效能乙個基本的for迴圈 for let i 0 i values.length i 乙個減值操作的for...

斜率優化學習筆記

目錄第二類斜率優化 注意事項 q a 例題 hnoi玩具裝箱 由題意我們可以馬上得到dp方程 dp i displaystyle min sum x 為字首和 很可惜,這個解法是 o n 2 的,無法ac 但是可以在當年騙很多分?接下來的文章中我們會用幾個簡稱 f i sum i i c 1 l 優...