我們拿一個(gè)算法的代碼實(shí)現(xiàn)來舉例子,首先我們寫一個(gè)求階乘的子函數(shù),這里我偷懶讓 ChatGPT 幫忙生成了一個(gè):
// 階乘函數(shù)intfactorial_iterative(int n) { int result = 1; // 從1乘到n for (int i = 1; i <= n; ++i) { result *= i; } return result;}
// 示例int main() { int result_iterative = factorial_iterative(5); printf("5的階乘是: %dn", result_iterative);
return 0;}這種簡單的迭代算法的優(yōu)點(diǎn)是比較容易理解,一眼就可以看出程序員想干什么。
但這樣寫出來的程序缺點(diǎn)也很大,就是運(yùn)行效率非常低,我們?cè)谒惴ň帉懼凶钆碌木褪莊or 循環(huán),因?yàn)檫@里面會(huì)存在大量的比較和跳轉(zhuǎn),同時(shí)最容易產(chǎn)生一些代碼被無效的循環(huán)執(zhí)行。

這些缺點(diǎn)有的會(huì)被編譯器的優(yōu)化措施給規(guī)避掉,比如編譯器可以把一些需要內(nèi)存訪問的變量先放到寄存器中,等計(jì)算完結(jié)果后,再把結(jié)果從寄存器中轉(zhuǎn)移到內(nèi)存中,因?yàn)?CPU 讀取寄存器比讀取內(nèi)存可快多了。
但是編譯器也不是萬能的,有些優(yōu)化他就做不到。比如,我們改成下面展開的樣子,超標(biāo)量的流水線就開始起作用了。
// 階乘函數(shù)intfactorial_iterative(int n) { int result0 = 1, result1 = 1, result2 = 1,result3 = 1; // 從1乘到n for (int i = 1; i < n; i += 4) {
result0 *= i; result1 *= i + 1; result2 *= i + 2; result3 *= i + 3;
} return (result0 * result1 * result2 * result3);}首先,我們假設(shè)開啟了編譯器優(yōu)化,編譯器已經(jīng)把所有內(nèi)存訪問的變量在函數(shù)開始都?xì)w置到了寄存器中,那么這時(shí)候我們可以看到,4 個(gè) result 的乘法語句是相互獨(dú)立的,他們的計(jì)算過程不依賴于其他 3 個(gè)語句的計(jì)算結(jié)果。
這就好比安排了四個(gè)人,給他們算 4 個(gè)單獨(dú)的式子,假設(shè)他們計(jì)算能力相同,于是他們會(huì)在同一段時(shí)間后跑到黑板上來互相乘一下算個(gè)總的結(jié)果。
而如果我們只是簡單的做循環(huán)展開,不增加新的寄存器變量,也就是不加人的情況下是怎么樣的呢?
// 階乘函數(shù)intfactorial_iterative(int n) { int result = 1; // 從1乘到n for (int i = 1; i < n; i += 4) {
result *= i; result *= i + 1; result *= i + 2; result *= i + 3;
} return (result * result * result * result);}這里只放了一個(gè)聰明的孩子做算式,不過你看他要做的 4 個(gè)算式,其中后一個(gè)算式總要用到前一個(gè)算式的結(jié)果,他即便再聰明也得一個(gè)一個(gè)的算。
這就是超標(biāo)量流水線的用處,當(dāng)然展開多少還需要我們自己衡量,本質(zhì)上也是用空間換時(shí)間,另外寄存器可是稀缺資源。
-
處理器
+關(guān)注
關(guān)注
68文章
20256瀏覽量
252484 -
mcu
+關(guān)注
關(guān)注
147文章
18938瀏覽量
398601 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
74009 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51664
發(fā)布評(píng)論請(qǐng)先 登錄
什么是超標(biāo)量處理器的流水線?超標(biāo)量處理器的特點(diǎn)有哪些?
FPGA中的流水線設(shè)計(jì)
現(xiàn)代RISC中的流水線技術(shù)
什么是超標(biāo)量技術(shù)/FADD?
流水線中的相關(guān)培訓(xùn)教程[4]
FPGA之流水線練習(xí)(3):設(shè)計(jì)思路
如何選擇合適的LED生產(chǎn)流水線輸送方式
嵌入式_流水線
什么是流水線 Jenkins的流水線詳解
首款Cortex-M7內(nèi)核超高性能MCU性能揭秘
H7的特點(diǎn) 什么是超標(biāo)量流水線
GD32H7系列MCU安全啟動(dòng)概述
GD32H7如何利用超標(biāo)量流水線
評(píng)論