www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]日常開發(fā)最容易被忽視的就是性能優(yōu)化,除了類似cache的性能刺客,還有分支預(yù)測(cè)這種不容易被察覺的優(yōu)化!


【導(dǎo)讀】:日常開發(fā)最容易被忽視的就是性能優(yōu)化,除了類似cache的性能刺客,還有分支預(yù)測(cè)這種不容易被察覺的優(yōu)化!


以下是正文


為什么處理有序數(shù)組比無(wú)序數(shù)組快?


由于某些怪異的原因,下面這段C++代碼表現(xiàn)的異乎尋?!?當(dāng)這段代碼作用于有序數(shù)據(jù)時(shí)其速度可以提高將近6倍,這真是令人驚奇。

#include #include #include 
int _tmain (int argc , _TCHAR * argv []){ //Generate data const unsigned arraySize = 32768; int data[arraySize];
for ( unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256;
//!!! With this, the next loop runs faster std::sort(data, data + arraySize);
//Test clock_t start = clock(); long long sum = 0; for ( unsigned i = 0; i < 100000; ++i){ //Primary loop for ( unsigned c = 0; c < arraySize; ++c){ if (data[c] >= 128) sum += data[c]; } }???????double?eclapsedTime?=?static_cast<double?>(clock()?-?start)?/?CLOCKS_PER_SEC;
std::cout << eclapsedTime << std::endl; std::cout << "sum = " << sum << std::endl;???????return?0;}
  • 如果把 std::sort(data, data+arraySize) 去掉,這段代碼耗時(shí)11.54秒。


  • 對(duì)于有序數(shù)據(jù),這段代碼耗時(shí)1.93秒


起初我以為這可能是某一種語(yǔ)言或某一個(gè)編譯器發(fā)生的異常的事件,后來我在java語(yǔ)言寫了個(gè)例子,如下:

import java.util.Arrays;import java.util.Random; public class Test_Sorted_UnSorted_Array { public static void main(String[] args) { //Generate data int arraySize = 32768; int data[] = new int[arraySize];  Random rnd = new Random(0); for( int c = 0; cc) data[c] = rnd.nextInt()%256;  //!!! With this, the next loop runs faster Arrays. sort(data);  //Test long start = System. nanoTime(); long sum = 0;  for( int i=0; i<100000; ++i){ //Primary loop for( int c = 0; cc){ if(data[c] >=128) sum += data[c]; } }  System. out.println((System. nanoTime() - start) / 1000000000.0); System. out.println( "sum = " + sum); }}

上述例子運(yùn)行結(jié)果和前面C++例子運(yùn)行的結(jié)果差異,雖然沒有C++中那么大,但是也有幾分相似。


對(duì)于上面的問題,我首先想的原因是排序可能會(huì)導(dǎo)致數(shù)據(jù)有緩存,但是轉(zhuǎn)念一想之前原因有點(diǎn)不切實(shí)際,因?yàn)樯厦娴臄?shù)組都是剛剛生成的,所以我的問題是:


  • 上述代碼運(yùn)行時(shí)到底發(fā)生了什么?


  • 為什么運(yùn)行排好序的數(shù)組會(huì)比亂序數(shù)組快?


  • 上述代碼求和都是獨(dú)立的,而順序不應(yīng)該會(huì)產(chǎn)生影響。

?

來自?Mysticial?的最佳回復(fù)


你是分支預(yù)測(cè)(branch prediction )失敗的受害者。


什么是分支預(yù)測(cè)?


考慮一個(gè)鐵路樞紐:

Imageby Mecanismo, via Wikimedia Commons. Used under theCC-By-SA 3.0license.


為了便于討論,假設(shè)現(xiàn)在是1800年,這時(shí)候還沒有出現(xiàn)遠(yuǎn)程或廣播通訊工具。


你是一個(gè)鐵路樞紐的工人。當(dāng)你聽到火車開來時(shí),你不知道這個(gè)火車要走哪一條路,只有讓火車停下來詢問列車長(zhǎng)火車要開往哪,最后你將軌道切換到相應(yīng)的方向。


火車的質(zhì)量非常大,固慣性很大,因此火車需要經(jīng)常性的加速減速。


有沒有更好的方法喃?可以猜火車將行駛的方向應(yīng)該是可行的!


  • 如果猜對(duì)了,火車?yán)^續(xù)往前走;


  • 如果猜錯(cuò)了,列車長(zhǎng)會(huì)讓火車停下來,并后退,然后告訴你正確的方向,然后火車重新啟動(dòng)開往正確的方向。


考慮一個(gè)if語(yǔ)句:在處理器級(jí)別上,他是一個(gè)分支指令:


你來扮演處理器,當(dāng)你遇到一個(gè)分支,你不知道它要走哪條路,該怎么辦?你可以停止執(zhí)行并等待直到之前的指令執(zhí)行完。然后繼續(xù)執(zhí)行正確路徑的指令。


有沒有更好的方法喃?可以猜測(cè)哪個(gè)分支將要被執(zhí)行!


  • 如果猜對(duì)了,繼續(xù)執(zhí)行;


  • 如果猜錯(cuò)了,你需要刷新管道并且回退到該分支,重新啟動(dòng)執(zhí)行正確的方向。


如果每次都能猜對(duì),整個(gè)執(zhí)行過程就不會(huì)停止。


如果經(jīng)常猜錯(cuò),就需要在停止、回退、重新執(zhí)行上花費(fèi)非常多的時(shí)間。


這就是分支預(yù)測(cè)。不得不承認(rèn)這不是一個(gè)最好的比喻因?yàn)榛疖嚳梢詢H僅使用一個(gè)標(biāo)志表示其前進(jìn)的方向。但是對(duì)于計(jì)算機(jī),直到最后時(shí)刻,處理器是不知道哪條分支被執(zhí)行。


想想可以使用什么預(yù)測(cè)策略使得火車回退的次數(shù)最少?哈哈,可以利用歷史數(shù)據(jù)!如果火車100次有99次都是向左,那么下次預(yù)測(cè)結(jié)果仍向左。如果過去數(shù)據(jù)是交替的,那么預(yù)測(cè)結(jié)果也是交替的。如果它每3次都換一個(gè)方向,那么預(yù)測(cè)也采用相同的方法。


簡(jiǎn)而言之,你需要嘗試尋找出一個(gè)規(guī)則(模式)然后按照它進(jìn)行預(yù)測(cè)就可以了。分支預(yù)測(cè)基本上就是這樣工作的。


大部分應(yīng)用程序的分支是很規(guī)律的。這也是為什么現(xiàn)代的分支預(yù)測(cè)的準(zhǔn)確率基本上都在90%以上。但是當(dāng)沒有規(guī)律、不可預(yù)測(cè)的分支時(shí)候,分支預(yù)測(cè)就顯得比較拙雞了。


從上面可以得到啟發(fā),這個(gè)問題的“罪魁禍?zhǔn)住本褪?if 語(yǔ)句

if (data[c] >= 128) um += data[c];

注意到數(shù)據(jù)是在0到255均勻分布的。當(dāng)排好序后,小于等于128的前半部分是不會(huì)執(zhí)行if語(yǔ)句的,大于128的后半部分都會(huì)進(jìn)入if語(yǔ)句。


這是非常有好的分支預(yù)測(cè)因?yàn)榉种?huì)連續(xù)多次執(zhí)行相同的分支。即使是一個(gè)簡(jiǎn)單的飽和計(jì)數(shù)器也會(huì)預(yù)測(cè)正確除去當(dāng)變換方向后的少數(shù)幾個(gè)。


快速可視化

T = branch takenN = branch not taken data[] = 0, 1, 2, 3, 4, ... 126, 127, 128, 129, 130, ... 250, 251, 252, ...branch = N N N N N ... N N T T T ... T T T ...  = NNNNNNNNNNNN ... NNNNNNNTTTTTTTTT ... TTTTTTTTTT (easy to predict)

然而,如果數(shù)據(jù)是完全隨機(jī)的,分支預(yù)測(cè)則毫無(wú)用處因?yàn)樗荒茴A(yù)測(cè)隨機(jī)數(shù)據(jù)。這種情況下可能會(huì)有50%的錯(cuò)誤預(yù)測(cè)。

data[]= 226, 185, 125, 158, 198, 144, 217, 79, 202, 118, 14, 150, 177, 182, 133, ...branch= T, T, N, T, T, T, T, N, T, N, N, T, T, T, N ... = TTNTTTTNTNNTTTN ... (completely random - hard to predict)

那這種情況下該怎么做呢?


如果編譯器不能將分支優(yōu)化為有條件的移動(dòng),這時(shí)候可以嘗試一些 Hacks ,如果能夠可以犧牲可讀性的表現(xiàn)。


將下面代碼

if (data[c] >= 128) sum += data[c];

替換為:

int t = (data[c] - 128) >> 31; sum += ~t & data[c];

用一些按位操作取代分支判斷,這樣就去除了分支。(注意:這個(gè) hacks 并不是和if語(yǔ)句嚴(yán)格相等,但是在我們這個(gè)例子里,對(duì)輸入數(shù)組data的所有值都是正確的)


Benchmarks: Core i7 920 @ 3.5 GHz


C++ – Visual Studio 2010 – x64 Release

// Branch - Randomseconds = 11.777 // Branch - Sortedseconds = 2.352 // Branchless - Randomseconds = 2.564 // Branchless - Sortedseconds = 2.587

Java – Netbeans 7.1.1 JDK 7 – x64

// Branch - Randomseconds = 10.93293813 // Branch - Sortedseconds = 5.643797077 // Branchless - Randomseconds = 3.113581453 // Branchless - Sortedseconds = 3.186068823

觀察可得:


  • 在分支情況下:排序數(shù)組和亂序數(shù)組之間的結(jié)果有著巨大的差異。

  • 在 Hack 方式下:對(duì)于排序和亂序的結(jié)果則沒有差異。

  • 在C++中,對(duì)于排序數(shù)組,Hack 會(huì)比分支有一點(diǎn)點(diǎn)慢。


一般的經(jīng)驗(yàn)法則是避免數(shù)據(jù)依賴分支在一些特殊的循環(huán)中。


64位機(jī)器下,GCC 4.6.1附帶選項(xiàng)-O3或者-ftree-vectorize可以產(chǎn)生一個(gè)條件移動(dòng)。因此對(duì)于有序和亂序數(shù)據(jù)都是一樣快。


VC++2010不能夠產(chǎn)生條件移動(dòng)對(duì)于這樣的分支。


英特爾編譯器11同樣可以做一些神奇的事。它通過互換兩個(gè)循環(huán),從而提升了不可預(yù)測(cè)的分支外循環(huán)。因此,它不但能夠避免誤預(yù)測(cè),而且速度上可以達(dá)到VC++和GCC的兩個(gè)快。換句話說,ICC利用了測(cè)試回路打破了benchmark。


如果用英特爾編譯器執(zhí)行沒有分支的代碼,它僅僅出右向量化(out-right vectorizes it),并且和帶分支同樣快。


通過上面說明,即使比較成熟的現(xiàn)代編譯器在優(yōu)化代碼的上可以有很大的不同。


END

來源:CPP開發(fā)者,作者:CPP開發(fā)者

版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

推薦閱讀

樹莓派Pico:僅4美元的MCU

嵌入式Linux開發(fā)板裸機(jī)程序燒寫方法總結(jié)

國(guó)產(chǎn)16位MCU的痛點(diǎn),可以用這款物美價(jià)廉產(chǎn)品


→點(diǎn)關(guān)注,不迷路←

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉