亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言中對于循環結構優化的一些入門級方法簡介

2020-05-23 14:12:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C語言中對于循環結構優化的一些入門級方法,包括算法設計的改進來提高一些并行性等方法,要的朋友可以參考下
 

一.代碼移動

將在循環里面多次計算,但是結果不會改變的計算,移到循環外面去。

例子:

優化前:

void lower1(char *s){int i;for(i=0;i<strlen(s);++i)   if(s[i]>='A'&&s[i]<='Z')    s[i]-=('A'-'a');}優化后:void lower2(char *s){int i;int len=strlen(s);for(int i=0;i<len;++i)  if(s[i]>='A'&&s[i]<='Z')    s[i]-=('A'-'a');}

優化前的版本,由于每次循環都要調用strlen計算s的長度,實際上的復雜度成了O(n2)了,而優化后的版本只需計算一次s的長度,因此性能上比優化前版本要好。

二.減少函數調用

例子:

優化前:

void sum1(vec_ptr v,data_t *dest){int i;int len=vec_length(v);*dest=0;for(i=0;i<len;++i){  data_t val;  get_vec_element(v,i,&val);  *dest+=val;}}

優化后:

data_t get_vec_start(vec_ptr v){return v->data;}void sum2(vec_ptr v,data_t *dest){int i;int len=vec_length(v);data_t *data=get_vec_start(v);*dest=0;for(i=0;i<len;++i)  *dest+=data[i];}

優化前的版本在每次循環中都要調用一次get_vec_element獲得相應的項,而優化后的版本只需在循環外調用一次get_vec_start獲得開始的內存地址,循環內直接訪問內存,無需調用函數。

三.減少內存訪問

例子:

優化前:

void sum2(vec_ptr v,data_t *dest){int i;int len=vec_length(v);data_t *data=get_vec_start(v);*dest=0;for(i=0;i<len;++i)  *dest+=data[i];}

優化后:

void sum3(vec_ptr v,data_t *dest){int i;int len=vec_length(v);data_t *data=get_vec_start(v);data_t acc=0;for(i=0;i<len;++i)  acc+=data[i];*dest=acc;}

優化前的版本每次迭代都要從dest讀出值再加上data[i],再將結果寫回dest。這樣的讀寫很浪費,因此每次迭代開始從dest讀出的值就是上次迭代寫回dest的指。優化后的版本通過加入acc臨時變量,它循環中累積計算出的結果,循環結束后再寫回。

這里給出兩個版本相應的匯編結果就可以很清楚看出區別:

優化前:

C語言中對于循環結構優化的一些入門級方法簡介

優化前的版本每次迭代都要從dest讀出值再加上data[i],再將結果寫回dest。這樣的讀寫很浪費,因此每次迭代開始從dest讀出的值就是上次迭代寫回dest的指。優化后的版本通過加入acc臨時變量,它循環中累積計算出的結果,循環結束后再寫回。

第二行和第四行分別對dest進行了讀寫。

優化后:

C語言中對于循環結構優化的一些入門級方法簡介

從匯編結果可以看出編譯器將acc直接放在了寄存器里,循環中無需對內存進行讀寫。

四.循環展開

循環展開可以減少循環的次數,對程序的性能帶了兩方面的提高。一是減少了對循環沒有直接貢獻的計算,比如循環計數變量的計算,分支跳轉指令的執行等。二是提供了進一步利用機器特性進行的優化的機會。

例子:

優化前的代碼見前一篇博客里的sum3.

優化后:

void sum4(vec_ptr v,data_t *dest){int i;int len=vec_length(v);int limit=len-3;data_t *data=get_vec_start(v);data_t acc=0;for(i=0;i<limit;i+=4){  acc=acc+data[i]+data[i+1];  acc=acc+data[i+2]+data[i+3];}for(;i<len;++i)  acc+=data[i];*dest=acc;}

通過循環展開,每次迭代將累加4個元素,減少了循環次數,從而減少了總的執行時間(單獨使用這種優化方法,對浮點數累乘幾乎沒有提高,但是整數累乘得益于編譯器的重關聯代碼變化會有大幅度提高)。

這種優化可以直接利用編譯器完成,將優化level設定到較高,編譯器會自動進行循環展開。使用gcc,可以顯式使用-funroll-loops選項。

五.提高并行性

現代處理器大多采用了流水線、超標量等技術,可以實現指令級并行。我們可以利用這個特性對代碼做進一步的優化。

2.1使用多個累積變量

優化代碼示例

void sum5(vec_ptr v,data_t *dest){int i;int len=vec_length(v);int limit=len-1;data_t *data=get_vec_start(v);data_t acc0=0;data_t acc1=0;for(i=0;i<limit;i+=2){  acc0+=data[i];  acc1+=data[i+1];}for(;i<len;++i)  acc0+=data[i];*dest=acc0+acc1;}

這里同時使用了循環展開和使用多個累加變量,一方面減少了循環次數,另一方面指令級并行的特性使得每次迭代的兩次加法可以并行執行?;谶@兩點可以顯著減少程序執行的時間。通過增加展開的次數和累加變量的個數,可以進一步提高程序的性能,直到機器指令執行的吞吐量的極限。

2.2重結合變換

除了使用多個累積變量顯式利用機器的指令級并行特性外,還可以對運算重新結合變換,打破順序相關性來享受指令級并行帶來的好處。

在sum4中,acc=acc+data[i]+data[i+1]的結合順序是acc=(acc+data[i])+data[i+1];

我們將之變成acc=acc+(data[i]+data[i+1]);

代碼如下:

void sum6(vec_ptr v,data_t *dest){int i;int len=vec_length(v);int limit=len-3;data_t *data=get_vec_start(v);data_t acc=0;for(i=0;i<limit;i+=4){  acc=acc+(data[i]+data[i+1]);  acc=acc+(data[i+2]+data[i+3]);}for(;i<len;++i)  acc+=data[i];*dest=acc;}

進一步增加循環展開的次數,可以進一步提高程序性能,最終也可以達到機器指令執行的吞吐量的極限。(在循環展示提到的整數乘法的性能提高就在于編譯器隱式采取了這種變換,但是由于浮點數不具備結合性,所以編譯器沒有采用,但是程序員在保證程序結果正確性的情況下,可以顯式使用這一點)。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品免费电影| 国产亚洲成精品久久| 久久精品国产2020观看福利| 国产精品亚洲欧美导航| 韩国19禁主播vip福利视频| 精品五月天久久| 欧美人成在线视频| 精品国产电影一区| 欧美电影免费观看网站| 久久精品国产99国产精品澳门| 久久精品2019中文字幕| 欧美国产一区二区三区| 日韩亚洲欧美中文在线| 色中色综合影院手机版在线观看| 亚洲成人性视频| 欧美激情免费在线| 中文字幕在线看视频国产欧美| 亚洲伊人成综合成人网| 久久99青青精品免费观看| 亚洲国产天堂网精品网站| 中文字幕成人精品久久不卡| 日韩黄色av网站| 欧美日韩一区二区精品| 性色av一区二区三区在线观看| 成人97在线观看视频| 欧美夫妻性生活xx| 国产日韩欧美在线视频观看| 国产精品免费福利| 国内成人精品一区| 性欧美暴力猛交69hd| 亚洲欧美日韩一区二区三区在线| 日韩成人av在线播放| 青草青草久热精品视频在线网站| 欧美激情精品久久久久久| 日本在线观看天堂男亚洲| 亚洲欧洲激情在线| 国内精品小视频在线观看| 欧美成人免费在线视频| 日本韩国欧美精品大片卡二| 国产在线观看91精品一区| 伊人av综合网| 欧美日韩裸体免费视频| 91午夜理伦私人影院| 精品中文字幕视频| 日韩视频免费大全中文字幕| 欧美在线一级视频| 国产日产亚洲精品| 国产精品久久久久久久久久小说| 亚洲精品一区二三区不卡| 538国产精品一区二区免费视频| 国产亚洲精品美女久久久久| 久久久999国产精品| 美女999久久久精品视频| 国产一级揄自揄精品视频| 亚洲伊人久久综合| 亚洲精品国产精品久久清纯直播| 精品一区二区三区四区| 欧美日韩国产综合视频在线观看中文| 国产91免费看片| 日本a级片电影一区二区| 成人黄色av免费在线观看| 日韩视频中文字幕| 色无极影院亚洲| 另类少妇人与禽zozz0性伦| 国产精品劲爆视频| 国产欧美一区二区三区在线| 亚洲天堂av女优| 欧美一级视频在线观看| 国产美女91呻吟求| 2020久久国产精品| 亚洲在线www| 精品国产老师黑色丝袜高跟鞋| 久久久久久久色| 国产福利精品av综合导导航| 91成品人片a无限观看| 色www亚洲国产张柏芝| 超碰97人人做人人爱少妇| 欧美最猛黑人xxxx黑人猛叫黄| 欧美猛男性生活免费| 国产精品久久久久久久久久久久久| 成人黄色影片在线| 日韩中文字在线| 中文字幕精品www乱入免费视频| 91av在线视频观看| 日韩视频在线免费| 亚洲精品综合久久中文字幕| 亚洲肉体裸体xxxx137| 欧洲中文字幕国产精品| 国产精品一区二区av影院萌芽| 日韩欧美亚洲范冰冰与中字| 欧美成年人视频| 国产日韩中文字幕| 久久久免费观看| 黑人巨大精品欧美一区二区| 国产a级全部精品| 成人欧美一区二区三区在线| 日韩av在线网| 成人欧美一区二区三区黑人| 欧美日韩在线一区| 国产国产精品人在线视| 亚洲男女自偷自拍图片另类| 国产免费亚洲高清| 91夜夜未满十八勿入爽爽影院| 中文字幕在线国产精品| 亚洲欧美日韩视频一区| 亚洲精品aⅴ中文字幕乱码| 成人久久久久久久| 97久久精品在线| 欧美专区在线播放| 国产精品自拍视频| 韩国欧美亚洲国产| 九九九热精品免费视频观看网站| 亚洲精品国偷自产在线99热| 欧美激情视频网址| 亚洲男人天堂九九视频| 九九视频直播综合网| 日韩在线观看免费高清完整版| 亚洲精品免费在线视频| 成人午夜在线视频一区| 亚洲欧洲视频在线| 亚洲天堂av网| 亚洲精品欧美一区二区三区| 中日韩美女免费视频网站在线观看| 国产亚洲一区二区精品| 一夜七次郎国产精品亚洲| 亚洲免费av片| 国产精品久久一区主播| 国产美女精彩久久| 日韩成人高清在线| 国内精品视频在线| 国外日韩电影在线观看| 国产欧美日韩中文| 亚洲激情自拍图| 日韩精品www| 国产剧情久久久久久| 日韩中文字幕网址| 色婷婷综合成人| 欧美最近摘花xxxx摘花| 91精品视频免费看| 国产成人精品a视频一区www| 97视频人免费观看| 国产99视频精品免视看7| 成人有码在线视频| 亚洲欧美国产精品va在线观看| 欧美人与性动交| 97不卡在线视频| 色播久久人人爽人人爽人人片视av| 91精品视频专区| 亚洲精品国产欧美| 亚洲午夜小视频| 欧美高清视频一区二区| 日本人成精品视频在线| 亚洲在线视频观看| 国产精品一久久香蕉国产线看观看| 一个人看的www欧美| 欧美国产视频一区二区| 欧美乱人伦中文字幕在线| 伊人伊人伊人久久| 国产午夜精品美女视频明星a级| 国产精品一区久久久| 91成人在线观看国产| 国内精品在线一区| 最近2019年好看中文字幕视频| 欧美日韩激情网|