天天看點

為什麼處理器指令要搞成流水線?

作者:硬十

指令流水線是一種用于計算機和其他數字電子裝置設計以提高其指令吞吐量的技術,其基本思想是将計算機指令的處理分解為一系列獨立的步驟,每個步驟的末尾都有存儲。這允許計算機的控制電路以最慢步驟的處理速度發出指令,這比一次執行所有步驟所需的時間快得多。

為什麼處理器指令要搞成流水線?

流水線的含義:

與工廠生産線類似,将一件工作分成若幹個固定的工序進行。

為什麼處理器指令要搞成流水線?

cpu流水線技術是一種将指令分解為多步,并讓不同指令的各步操作重疊,進而實作幾條指令并行處理,以加速程式運作過程的技術。指令的每步有各自獨立的電路來處理,每完成一步,就進到下一步,而前一步則處理後續指令。(原理和生産流水線一樣)

為什麼處理器指令要搞成流水線?

CPU指令流水線

根據之前描述的基礎,指令進入流水線,通過流水線處理,從流水線出來的過程,對于我們程式員來說,是比較直覺的。

I486擁有五級流水線。分别是:取指(Fetch),譯碼(D1, main decode),轉址(D2, translate),執行(EX, execute),寫回(WB)。某個指令可以在流水線的任何一級。

為什麼處理器指令要搞成流水線?

但是這樣的流水線有一個明顯的缺陷。對于下面的指令代碼,它們的功能是将兩個變量的内容進行交換。

1

2

3

XOR a, b

XOR b, a

XOR a, b

從8086直到386處理器都沒有流水線。處理器一次隻能執行一條指令。再這樣的架構下,上面的代碼執行并不會存在問題。

但是i486處理器是首個擁有流水線的x86處理器,它執行上面的代碼會發生什麼呢?當你一下去觀察很多指令在流水線中運作,你會覺得混亂,是以你需要回頭參考上面的圖。

1、第一步是第一條指令進入取指階段;

2、然後在第二步第一條指令進入譯碼階段,同時第二條指令進入取指階段;

3、第三步第一條指令進入轉址階段,第二條指令進入譯碼階段,第三條指令進入取指階段。

4、但是在第四步會出現問題,第一條指令會進入執行階段,而其他指令卻不能繼續向前移動。

5、第二條xor指令需要第一條xor指令計算的結果a,但是直到第一條指令執行完成才會寫回。

是以流水線的其他指令就會在目前流水級等待直到第一條指令的執行和寫回階段完成。第二條指令會等待第一條指令完成才能進入流水線下一級,同樣第三條指令也要等待第二條指令完成。

這個現象被稱為流水線阻塞或者流水線氣泡。

常用概念:

1、流水線級數:流水線的節拍數。

2、吞吐率:機關時間内流水線能處理的任務數量。

3、最大吞吐率:流水線達到不間斷流水的穩定狀态後可獲得的吞吐率。

4、加速比:流水方式的工作速度與等效的順序工作方式時間的比值。

流水線名額:

1、流水技術無助于減少單個任務的處理延遲(latency),但有助于提高整體工作負載的吞吐率

2、多個不同任務同時操作, 使用不同資源

3、潛在加速比= 流水線級數

4、流水線的速率受限于最慢的流水段

5、流水段的執行時間如果不均衡,那麼加速比就會降低

6、開始填充流水線的時間和最後排放流水線的時間降低加速比

低功耗嵌入式領域的ARM7就是采用3級流水線結構。

為什麼處理器指令要搞成流水線?

MIPS架構的流水線

為什麼處理器指令要搞成流水線?

X86架構的流水線

為什麼處理器指令要搞成流水線?

流水線是處理器中用于執行指令的一種設計方式。它将指令的執行過程分解為多個階段,并允許在同一時間内處理多個指令。這種設計可以提高處理器的性能,但也可能帶來一些影響。

以下是流水線對處理器性能的一些影響:

  1. 提高指令吞吐量:流水線允許同時處理多個指令的不同階段,進而提高了指令的吞吐量。這意味着在同一時間内可以執行更多的指令,進而加快程式的執行速度。
  2. 增加延遲: 盡管流水線提高了吞吐量,但也引入了一定的延遲。由于指令被分解為多個階段,每個階段都需要一定的時間來執行。如果其中一個階段的執行時間較長,整個流水線的效率可能會受到影響。
  3. 資料冒險和控制冒險: 流水線執行過程中可能會遇到資料冒險和控制冒險。資料冒險發生在需要等待前一條指令結果的情況下,而控制冒險涉及到分支指令可能改變程式流程的情況。這些冒險可能導緻流水線中斷或延遲。
  4. 複雜的設計和管理: 流水線的設計和管理相對複雜,需要考慮各個階段的協同工作、錯誤處理、分支預測等。這使得處理器設計變得更加複雜,可能增加了成本和難度。

指令執行過程中可能遇到的一些冒險(Hazards)和解決方案:

  1. Structure Hazards(結構冒險):
  • More hardware(更多硬體): 在處理器中,結構冒險可能發生在多個指令試圖同時使用同一硬體資源的情況下。為了解決這個問題,可以增加硬體資源的數量,例如添加更多的功能單元或執行單元,以便同時處理更多的指令。
  • Register renaming(寄存器重命名): 通過在流水線中使用重命名技術,可以使得多個指令可以同時使用相同的寄存器,而不會發生沖突。這有助于避免因結構冒險而導緻的延遲。
  • Performed by compiler(由編譯器執行): 編譯器可以通過調整指令順序或插入适當的指令來最小化結構冒險。這可能包括對資料和操作的重新排列,以便更好地利用硬體資源。
  • Data Hazards(資料冒險):
    • Compiler Scheduling(編譯器排程): 編譯器可以通過重新安排指令的執行順序來最小化資料冒險。通過考慮指令之間的資料依賴關系,編譯器可以優化指令的排列,以減少因讀後寫(Read after Write)、寫後寫(Write after Write)、寫後讀(Write after Read)而導緻的冒險。
    • Out-of-order execution(亂序執行): 處理器可以在不按照指令順序執行的情況下,根據資料的可用性進行指令執行。這有助于減少資料冒險的影響,提高執行效率。
    • Register renaming(寄存器重命名): 同時也在這裡起到了減少資料冒險的作用,因為它允許多個指令同時使用相同的寄存器,而不會發生沖突。
  • Control Hazards(控制冒險):
    • Branch Prediction(分支預測): 處理器可以使用分支預測來猜測分支指令的執行路徑,進而避免由于分支導緻的控制冒險。正确的預測可以減少流水線的中斷,提高執行效率。
    • Speculative execution(猜測執行): 一些處理器可能采用猜測執行技術,在未确定分支結果的情況下繼續執行指令。如果猜測正确,執行效率會提高,否則,需要復原到正确的執行路徑。

    總體而言,這些技術和方法都是為了最大程度地提高處理器的性能,同時克服在指令執行過程中可能遇到的結構、資料和控制冒險。

    流水線級數太多有什麼問題?

    雖然流水線可以提高處理器的性能,但過多的流水線級數也可能引入一些問題,包括:

    1. 增加時鐘周期:每個流水線級别都需要一個時鐘周期來完成,而在流水線中的每個階段都要經過。過多的流水線級數可能導緻每個指令的總執行時間增加,因為時鐘周期的數量也會相應增加。
    2. 增加延遲:多級流水線可能導緻增加的流水線級别之間的資料傳輸和控制信号傳遞延遲。這些延遲可能會降低流水線的效率,因為在較高的流水線級别上等待的指令可能會阻塞後續指令的流動。
    3. 複雜的設計和控制:随着流水線級數的增加,處理器的設計和控制變得更加複雜。需要更多的硬體資源和更複雜的邏輯來確定各個流水線階段的協同工作。這可能增加了設計的複雜性和制造成本。
    4. 增加結構冒險:結構冒險是指多個指令試圖同時使用同一硬體資源的情況。過多的流水線級數可能導緻更多的結構冒險,因為硬體資源的競争可能會增加。
    5. 增加能耗:更多的流水線級數通常需要更多的功耗。每個流水線級别都需要電源,并且在切換時鐘周期時可能會有更多的電壓和電流波動。這可能導緻處理器的整體功耗增加。
    6. 對分支預測的挑戰:随着流水線級數的增加,分支指令的預測變得更為複雜。較長的流水線可能導緻更多的分支預測錯誤,因為在更晚的階段才能确定分支的執行路徑。

    在設計處理器時,需要權衡流水線級數和性能之間的關系,以確定在提高性能的同時,不引入過多的問題和複雜性。不同類型的應用和需求可能需要不同級别的流水線來實作最佳性能。

    流水線處理概述

    CPU主要工作方式:

    順序

    重疊

    流水

    和鋪地闆的原理相似…

    設指令工作方式分成取指令、分析、執行指令

    為什麼處理器指令要搞成流水線?

    若各階段執行時間相等,則共需3n t

    優點:控制簡單;

    缺點:速度慢,機器各部件的使用率很低。

    重疊(Overlap):在兩條相近指令的解釋過程中,某些不同解釋階段在時間上存在重疊部分。

    包括一次重疊、先行控制技術和多操作部件并行。

    将相鄰兩條指令的重疊時間再往前提前一個階段;T=3×t+(n-1)×t=(n+2)×t

    一次重疊:取指令操作隐含在分析、執行指令過程中,則在任何時候隻允許上條指令“執行”與下條指令“分析”相重疊。T=(n+1)×t

    若各段時間不等時,有實際執行時間:

    為什麼處理器指令要搞成流水線?

    先行控制:分析部件和執行部件能分别連續不斷地分析和執行指令,預取和緩沖相結合的技術 ,通過對指令流和資料流的先行控制,使指令分析器和執行部件能盡量連續并行工作。

    執行時間:

    為什麼處理器指令要搞成流水線?

    多操作部件并行:采用有多個功能部件的處理機,把ALU的多種功能分散到幾個具有專門功能的部件中,這些功能部件可以并行工作,使指令流出速度大大提高。

    為什麼處理器指令要搞成流水線?

    先行控制:現代計算機指令系統是複雜的,“分析”和“執行”所需要的時間往往相差很大,進而造成功能部件的浪費,是以,需要采用先行控制技術。

    為什麼處理器指令要搞成流水線?

    分析指令和執行指令時間不等時的一次重疊方式

    為什麼處理器指令要搞成流水線?

    采用先行緩沖棧是指令執行過程的一種表示方法

    先行控制:

    一般采用先行緩沖棧的方式實作:

    一般設定四種緩沖棧:

    先行指令緩沖棧

    當主存比較忙時,指令分析器能夠從先行指令緩沖棧中得到所需指令。

    先行操作棧

    對于條件轉移等使用。

    先行讀書棧

    主存儲器和運算器之間的緩沖存儲器,用來平緩運算器和主存儲器之間的工作。

    後行寫數棧

    目前沒有完全寫到主存的資料可以暫存到寫數棧

    先行控制的處理機結構:

    為什麼處理器指令要搞成流水線?

    先行控制中的緩沖深度設計:

    通過一種極端情況計算舉例:

    假設先行指令緩沖棧已經完全充滿,緩沖深度是D1。

    此時指令緩沖棧輸出端,指令流出速度最快,而輸入端,流入最慢

    假設指令序列的最大長度是L1,平均分析一條指令的時間是t1

    而此時更壞的是取指令很慢,平均取一條指令的時間是t2

    假設先行控制棧充滿到被取空的過程中指令分析條數是L1

    則此時有:L1t1 = (L1-D1)t2

    為什麼處理器指令要搞成流水線?

    1989年推出的i486處理器引入了五級流水線。這時,在CPU中不再僅運作一條指令,每一級流水線在同一時刻都運作着不同的指令。這個設計使得i486比同頻率的386處理器性能提升了不止一倍。五級流水線中的取指階段将指令從指令緩存中取出(i486中的指令緩存為8KB);第二級為譯碼階段,将取出的指令翻譯為具體的功能操作;第三級為轉址階段,用來将記憶體位址和偏移進行轉換;第四級為執行階段,指令在該階段真正執行運算;第五級為退出階段,運算的結果被寫回寄存器或者記憶體。由于處理器同時運作了多條指令,大大提升了程式運作的性能。

    處理器一般由如下功能單元組成:

    取指單元

    譯碼單元

    執行單元

    Load/store單元(load用于從記憶體中取資料,而STORE用與儲存資料到記憶體)

    例外/中斷單元

    電源管理單元

    流水線通常由取指、譯碼、執行及Load/Store等單元組成。各單元按圖所示的幾個步驟循環重複自身工作。

    超流水

    超流水線技術是通過細化的流水,提高主頻。使得機器在一個周期内完成一個甚至多個操作,其實質是用空間換取時間。

    超流水處理器是相對于基準處理器而言的,一般cpu的流水線是基本的指令預取,譯碼,執行和寫回結果四級。超流水線(superpiplined)是指某型CPU内部的流水線超過通常的5~6步以上,例如Pentium pro的流水線就長達14步。将流水線設計的步(級)數越多,其完成一條指令的速度越快,是以才能适應工作主頻更高的CPU。這一點我們可以用日常事例來說明,比如有5個人接力傳送木頭(對應一個5級的流水線),超流水是說細化該流水過程,即由10個人接力(此時為10級流水),顯然完成全部任務的速度會快。相當于毛主席的一句話:人多力量大(效率高)。

    為什麼處理器指令要搞成流水線?

    超标量

    超标量是指在CPU中有一條以上的流水線,并且每時鐘周期内可以完成一條以上的指令,這種設計就叫超标量技術。其實質是以空間換取時間。

    CPU架構是指在一顆處理器核心中實行了指令級并行的一類并行運算。這種技術能夠在相同的CPU主頻下實作更高的CPU吞吐率(throughput)。

    為什麼處理器指令要搞成流水線?

    CPU、SoC、MCU什麼差別

    為什麼MCU一般跑RTOS,SoC一般跑嵌入式Linux?

    為什麼會産生那麼多處理器的指令集?

    哈佛結構那麼好?為什麼馮諾依曼更流行?

    處理器為什麼需要多核?

    國産SoC廠家

    一陣腥風血雨的收購之後,MCU哪家強?

    進入硬十網站,可以下載下傳更多處理器資料,限時免費購買

    為什麼處理器指令要搞成流水線?

    繼續閱讀