πŸ“Œ Pipeline

Pipeline (ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€) β€” Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ процСссора, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ инструкции разбиваСтся Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ этапов (стадий), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ нСсколько инструкций ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, каТдая Π½Π° своём этапС. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ процСссора, увСличивая количСство инструкций, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π·Π° Ρ‚Π°ΠΊΡ‚ (IPC).


🧠 Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Основная идСя

ВмСсто ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ выполнСния инструкции, процСссор раздСляСт Π΅Ρ‘ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° нСсколько стадий (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Fetch, Decode, Execute, Memory, Writeback). КаТдая стадия выполняСт свою Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ инструкциСй. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ‚Π°ΠΊΡ‚Π΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ смСщаСт инструкции Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап, позволяя ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с нСсколькими инструкциями Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… стадиях.

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ 5-ступСнчатая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° MIPS

  1. IF (Instruction Fetch) β€” Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° инструкции ΠΈΠ· памяти ΠΏΠΎ адрСсу Π² PC.
  2. ID (Instruction Decode & Register Fetch) β€” Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ инструкции ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ рСгистров.
  3. EX (Execute) β€” Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ арифмСтичСской/логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ вычислСниС адрСса.
  4. MEM (Memory access) β€” ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ памяти (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅/запись Π΄Π°Π½Π½Ρ‹Ρ…).
  5. WB (Write Back) β€” запись Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² рСгистры.

Π‘Ρ…Π΅ΠΌΠ° простого ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°

flowchart LR
    IF["IF: Instruction Fetch"]
    ID["ID: Instruction Decode"]
    EX["EX: Execute"]
    MEM["MEM: Memory Access"]
    WB["WB: Write Back"]

    IF --> ID --> EX --> MEM --> WB

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹

  • На Ρ‚Π°ΠΊΡ‚Π΅ 1: инструкция 1 β€” Π½Π° IF

  • На Ρ‚Π°ΠΊΡ‚Π΅ 2: инструкция 1 β€” Π½Π° ID, инструкция 2 β€” Π½Π° IF

  • На Ρ‚Π°ΠΊΡ‚Π΅ 3: инструкция 1 β€” EX, инструкция 2 β€” ID, инструкция 3 β€” IF
    … ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

  • Hazards (ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹): ситуации, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° инструкция зависит ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΈΠ»ΠΈ происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ памяти/рСсурсам, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ.

    • Data hazard: Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ инструкциями.

    • Control hazard: Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (вСтвлСния).

    • Structural hazard: ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π·Π° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ рСсурсы.

  • Π’Π΅Ρ…Π½ΠΈΠΊΠ° прСодолСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²:

    • Forwarding (Data bypassing): ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ стадиями.

    • Stalls (Bubble insertion): врСмСнная приостановка ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°.

    • Branch prediction: прСдсказаниС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ.

    • Out-of-order execution: Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ инструкций Π²Π½Π΅ исходного порядка с сохранСниСм сСмантики.

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ схСма с нСсколькими инструкциями

gantt
    title Pipeline execution timeline
    dateFormat  X
    axisFormat  %d
    section IF
    Inst1 :done, 1, 1
    Inst2 :done, 2, 1
    Inst3 :done, 3, 1
    Inst4 :done, 4, 1
    Inst5 :done, 5, 1
    section ID
    Inst1 :done, 2, 1
    Inst2 :done, 3, 1
    Inst3 :done, 4, 1
    Inst4 :done, 5, 1
    Inst5 :done, 6, 1
    section EX
    Inst1 :done, 3, 1
    Inst2 :done, 4, 1
    Inst3 :done, 5, 1
    Inst4 :done, 6, 1
    Inst5 :done, 7, 1
    section MEM
    Inst1 :done, 4, 1
    Inst2 :done, 5, 1
    Inst3 :done, 6, 1
    Inst4 :done, 7, 1
    Inst5 :done, 8, 1
    section WB
    Inst1 :done, 5, 1
    Inst2 :done, 6, 1
    Inst3 :done, 7, 1
    Inst4 :done, 8, 1
    Inst5 :done, 9, 1

βš™οΈ Π“Π΄Π΅ примСняСтся

  • Π’ΠΎ всСх соврСмСнных CPU ΠΈ MCU β€” ΠΎΡ‚ простых ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π΄ΠΎ многоядСрных процСссоров.

  • Π’ GPU для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ.

  • Π’ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сигналов (DSP) ΠΈ спСциализированных ускоритСлях.

  • Π’ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ…, сСтСвых устройствах, микросхСмах ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

  • Π’ ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° RISC ΠΈ CISC процСссоров (MIPS, ARM, x86, RISC-V).


βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • БущСствСнноС ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ пропускной способности процСссора Π±Π΅Π· роста Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частоты.

  • Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ IPC (инструкций Π½Π° Ρ‚Π°ΠΊΡ‚).

  • Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС рСсурсов процСссора, ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ (ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ числа стадий, ΡΡƒΠΏΠ΅Ρ€ΡΠΊΠ°Π»ΡΡ€Π½ΠΎΡΡ‚ΡŒ).

  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ энСргСтичСской эффСктивности Π·Π° счёт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° исполнСния.


❌ НСдостатки

  • УслоТнСниС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹: трСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ управлСния, Π±ΡƒΡ„Π΅Ρ€Ρ‹, прСдсказатСли Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ.

  • ПоявлСниС ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² (hazards), Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΈΡ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (stalls, forwarding).

  • ВозрастаниС латСнтности выполнСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… инструкций.

  • ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Ρ‹Π΅ трСбования ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

  • Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΈ ΠΈ энСргопотрСблСния микросхСмы.


πŸ”— БвязанныС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ

CPU, Microarchitecture, Hazard, Forwarding, Branch Prediction, Superscalar, Out-of-order Execution, Stages, Cache, ALU, Register File


РСзюмС

Pipeline β€” ΠΊΠ»ΡŽΡ‡Π΅Π²Π°Ρ микроархитСктурная тСхнология, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько инструкций ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… стадиях ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Она сущСствСнно ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ процСссоров ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… устройств, сниТая простой оборудования ΠΈ увСличивая throughput. Для эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся Π±ΠΎΡ€ΡŒΠ±Π° с ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌΠΈ, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСтвлСниями ΠΈ слоТный ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½ΠΎ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ростом ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.


ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ 5-ступСнчатого ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° (Π½Π° C)

#include <stdio.h>
 
typedef enum {IF, ID, EX, MEM, WB} Stage;
 
typedef struct {
    int instruction;
    Stage stage;
} PipelineRegister;
 
#define PIPELINE_DEPTH 5
 
int main() {
    PipelineRegister pipeline[PIPELINE_DEPTH] = {0};
    int instructions[] = {10, 20, 30, 40, 50};
    int cycle = 0, num_instructions = 5;
 
    while (cycle < num_instructions + PIPELINE_DEPTH - 1) {
        printf("Cycle %d: ", cycle + 1);
        for (int i = PIPELINE_DEPTH - 1; i > 0; i--) {
            pipeline[i] = pipeline[i - 1];
        }
        pipeline[0].instruction = (cycle < num_instructions) ? instructions[cycle] : 0;
        pipeline[0].stage = IF;
 
        for (int i = 0; i < PIPELINE_DEPTH; i++) {
            if (pipeline[i].instruction != 0)
                printf("[Instr %d @ stage %d] ", pipeline[i].instruction, i + 1);
        }
        printf("\n");
        cycle++;
    }
    return 0;
}

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ:
Hennessy & Patterson β€œComputer Architecture”, Intel SDM, ARM Architecture Reference Manual, osdev.org, habr.com, Wikipedia, IEEE papers, MIPS architecture manuals.