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

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

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

GD32H7如何利用超標量流水線

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

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

#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;}

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

但這樣寫出來的程序缺點也很大,就是運行效率非常低,我們在算法編寫中最怕的就是for 循環(huán),因為這里面會存在大量的比較和跳轉(zhuǎn),同時最容易產(chǎn)生一些代碼被無效的循環(huán)執(zhí)行。

圖片

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

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

// 階乘函數(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ù)開始都歸置到了寄存器中,那么這時候我們可以看到,4 個 result 的乘法語句是相互獨立的,他們的計算過程不依賴于其他 3 個語句的計算結(jié)果。

這就好比安排了四個人,給他們算 4 個單獨的式子,假設(shè)他們計算能力相同,于是他們會在同一段時間后跑到黑板上來互相乘一下算個總的結(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);}


這里只放了一個聰明的孩子做算式,不過你看他要做的 4 個算式,其中后一個算式總要用到前一個算式的結(jié)果,他即便再聰明也得一個一個的算。

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

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

    關(guān)注

    68

    文章

    19384

    瀏覽量

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

    關(guān)注

    146

    文章

    17227

    瀏覽量

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

    關(guān)注

    30

    文章

    4808

    瀏覽量

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

    關(guān)注

    1

    文章

    1639

    瀏覽量

    49198
收藏 人收藏

    評論

    相關(guān)推薦

    什么是超標量處理器的流水線超標量處理器的特點有哪些?

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

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

    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ù)是當前指令集處理器設(shè)計中廣泛采用的技術(shù)。在這里我們將重點放在(標量流水線處理器的設(shè)計。流水線處理器設(shè)計中的許多方法和技術(shù),例如用于檢測和化解相關(guān)的
    發(fā)表于 03-01 17:52

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

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

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

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

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

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

    電鍍流水線的PLC控制

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

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

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

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

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

    各種流水線特點及常見流水線設(shè)計方式

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

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

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

    嵌入式_流水線

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

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

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

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

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

    H7的特點 什么是超標量流水線

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