0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GD32H7如何利用超標(biāo)量流水線

麥辣雞腿堡 ? 來(lái)源:軒哥談芯 ? 作者:義軒 ? 2023-11-29 17:15 ? 次閱讀

我們拿一個(gè)算法的代碼實(shí)現(xiàn)來(lái)舉例子,首先我們寫(xiě)一個(gè)求階乘的子函數(shù),這里我偷懶讓 ChatGPT 幫忙生成了一個(gè):

#include
// 階乘函數(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;}

這種簡(jiǎn)單的迭代算法的優(yōu)點(diǎn)是比較容易理解,一眼就可以看出程序員想干什么。

但這樣寫(xiě)出來(lái)的程序缺點(diǎn)也很大,就是運(yùn)行效率非常低,我們?cè)谒惴ň帉?xiě)中最怕的就是for 循環(huán),因?yàn)檫@里面會(huì)存在大量的比較和跳轉(zhuǎn),同時(shí)最容易產(chǎn)生一些代碼被無(wú)效的循環(huán)執(zhí)行。

圖片

這些缺點(diǎn)有的會(huì)被編譯器的優(yōu)化措施給規(guī)避掉,比如編譯器可以把一些需要內(nèi)存訪問(wèn)的變量先放到寄存器中,等計(jì)算完結(jié)果后,再把結(jié)果從寄存器中轉(zhuǎn)移到內(nèi)存中,因?yàn)?CPU 讀取寄存器比讀取內(nèi)存可快多了。

但是編譯器也不是萬(wàn)能的,有些優(yōu)化他就做不到。比如,我們改成下面展開(kāi)的樣子,超標(biāo)量的流水線就開(kāi)始起作用了。

// 階乘函數(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è)開(kāi)啟了編譯器優(yōu)化,編譯器已經(jīng)把所有內(nèi)存訪問(wèn)的變量在函數(shù)開(kāi)始都?xì)w置到了寄存器中,那么這時(shí)候我們可以看到,4 個(gè) result 的乘法語(yǔ)句是相互獨(dú)立的,他們的計(jì)算過(guò)程不依賴(lài)于其他 3 個(gè)語(yǔ)句的計(jì)算結(jié)果。

這就好比安排了四個(gè)人,給他們算 4 個(gè)單獨(dú)的式子,假設(shè)他們計(jì)算能力相同,于是他們會(huì)在同一段時(shí)間后跑到黑板上來(lái)互相乘一下算個(gè)總的結(jié)果。

而如果我們只是簡(jiǎn)單的做循環(huán)展開(kāi),不增加新的寄存器變量,也就是不加人的情況下是怎么樣的呢?

// 階乘函數(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è)聰明的孩子做算式,不過(guò)你看他要做的 4 個(gè)算式,其中后一個(gè)算式總要用到前一個(gè)算式的結(jié)果,他即便再聰明也得一個(gè)一個(gè)的算。

這就是超標(biāo)量流水線的用處,當(dāng)然展開(kāi)多少還需要我們自己衡量,本質(zhì)上也是用空間換時(shí)間,另外寄存器可是稀缺資源。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19048

    瀏覽量

    228525
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16812

    瀏覽量

    349444
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68108
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1608

    瀏覽量

    48979
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是超標(biāo)量處理器的流水線超標(biāo)量處理器的特點(diǎn)有哪些?

    如果每周期可取出多條指令(eg: 超過(guò)一條)送到流水線中執(zhí)行,并使用硬件來(lái)對(duì)指令進(jìn)行調(diào)度(eg: 靠硬件自身來(lái)決定哪些指令可以并行執(zhí)行)的處理器,就可稱(chēng)為超標(biāo)量處理器;
    的頭像 發(fā)表于 03-04 14:03 ?2530次閱讀

    FPGA中的流水線設(shè)計(jì)

    8bit 流水線加法器的小例子 module add8(a, b, c);input[7:0] a;input[7:0] b;output [8:0] c; assign c[8:0
    發(fā)表于 10-26 14:38

    現(xiàn)代RISC中的流水線技術(shù)

    取得了成功。流水線技術(shù)是當(dāng)前指令集處理器設(shè)計(jì)中廣泛采用的技術(shù)。在這里我們將重點(diǎn)放在(標(biāo)量流水線處理器的設(shè)計(jì)。流水線處理器設(shè)計(jì)中的許多方法和技術(shù),例如用于檢測(cè)和化解相關(guān)的
    發(fā)表于 03-01 17:52

    什么是流水線技術(shù)

    什么是流水線技術(shù) 流水線技術(shù)
    發(fā)表于 02-04 10:21 ?3907次閱讀

    什么是超標(biāo)量技術(shù)/FADD?

    什么是超標(biāo)量技術(shù)/FADD? 超標(biāo)量(superscalar)是指在CPU中有一條以上的流水線,并且每時(shí)鐘周期內(nèi)可以完成一條以上的指令,
    發(fā)表于 02-04 10:45 ?1552次閱讀

    流水線中的相關(guān)培訓(xùn)教程[4]

    流水線中的相關(guān)培訓(xùn)教程[4] 下面討論如何利用編譯器技術(shù)來(lái)減少這種必須的暫停,然后論述如何在流水線中實(shí)現(xiàn)數(shù)據(jù)相關(guān)檢測(cè)和定向。
    發(fā)表于 04-13 16:09 ?4689次閱讀

    電鍍流水線的PLC控制

    電鍍流水線的PLC控制電鍍流水線的PLC控制電鍍流水線的PLC控制
    發(fā)表于 02-17 17:13 ?36次下載

    FPGA之流水線練習(xí)(3):設(shè)計(jì)思路

    流水線的平面設(shè)計(jì)應(yīng)當(dāng)保證零件的運(yùn)輸路線最短,生產(chǎn)工人操作方便,輔助服務(wù)部門(mén)工作便利,最有效地利用生產(chǎn)面積,并考慮流水線安裝之間的相互銜接。為滿(mǎn)足這些要求,在流水線平面布置時(shí)應(yīng)考慮
    的頭像 發(fā)表于 11-28 07:07 ?2289次閱讀

    FPGA之為什么要進(jìn)行流水線的設(shè)計(jì)

    流水線又稱(chēng)為裝配線,一種工業(yè)上的生產(chǎn)方式,指每一個(gè)生產(chǎn)單位只專(zhuān)注處理某一個(gè)片段的工作。以提高工作效率及產(chǎn)量;按照流水線的輸送方式大體可以分為:皮帶流水裝配線、板鏈線、倍速鏈、插件線、網(wǎng)帶線、懸掛線及滾筒
    的頭像 發(fā)表于 11-28 07:04 ?3539次閱讀

    各種流水線特點(diǎn)及常見(jiàn)流水線設(shè)計(jì)方式

    按照流水線的輸送方式大體可以分為:皮帶流水裝配線、板鏈線、倍速鏈、插件線、網(wǎng)帶線、懸掛線及滾筒流水線這七類(lèi)流水線。
    的頭像 發(fā)表于 07-05 11:12 ?7151次閱讀
    各種<b class='flag-5'>流水線</b>特點(diǎn)及常見(jiàn)<b class='flag-5'>流水線</b>設(shè)計(jì)方式

    如何選擇合適的LED生產(chǎn)流水線輸送方式

    LED生產(chǎn)流水線輸送形式分為平面直線傳輸流水線、各種角度平面轉(zhuǎn)彎傳輸流水線、斜面上傳流水線、斜面下傳流水線這四種輸送方式,企業(yè)也是可以根據(jù)L
    發(fā)表于 08-06 11:53 ?981次閱讀

    嵌入式_流水線

    流水線一、定義流水線是指在程序執(zhí)行時(shí)多條指令重疊進(jìn)行操作的一種準(zhǔn)并行處理實(shí)現(xiàn)技術(shù)。各種部件同時(shí)處理是針對(duì)不同指令而言的,他們可同時(shí)為多條指令的不同部分進(jìn)行工作。? 把一個(gè)重復(fù)的過(guò)程分解為若干個(gè)子過(guò)程
    發(fā)表于 10-20 20:51 ?6次下載
    嵌入式_<b class='flag-5'>流水線</b>

    什么是流水線 Jenkins的流水線詳解

    jenkins 有 2 種流水線分為聲明式流水線與腳本化流水線,腳本化流水線是 jenkins 舊版本使用的流水線腳本,新版本 Jenkin
    發(fā)表于 05-17 16:57 ?1014次閱讀

    首款Cortex-M7內(nèi)核超高性能MCU性能揭秘

    GD32H7系列MCU采用基于Armv7E-M架構(gòu)的600MHz Arm Cortex-M7高性能內(nèi)核,憑借支持分支預(yù)測(cè)的6級(jí)超標(biāo)量流水線架構(gòu),以及支持高帶寬的AXI和AHB總線接口,
    發(fā)表于 05-25 11:36 ?1047次閱讀
    首款Cortex-M<b class='flag-5'>7</b>內(nèi)核超高性能MCU性能揭秘

    H7的特點(diǎn) 什么是超標(biāo)量流水線

    流水線,并且是超標(biāo)量的,并且支持分支預(yù)測(cè)。 內(nèi)置了高級(jí)DSP硬件加速器和雙精度浮點(diǎn)單元(FPU),以及硬件三角函數(shù)加速器(TMU)和濾波算法加速器(FAC)。 內(nèi)置了TFT LCD液晶驅(qū)動(dòng)器和圖形處理
    的頭像 發(fā)表于 11-29 16:52 ?699次閱讀
    <b class='flag-5'>H7</b>的特點(diǎn) 什么是<b class='flag-5'>超標(biāo)量流水線</b>