制御ハザードとその解決法 慶應義塾大学 理工学部 天野 2007/12/20 1 PICOのパイプライン構造 IF RF RFPC WB EX a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 2 レジスタファイルのフォワーディング IF RF RFPC EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 3 ALUからのフォワーディング IF RF RFPC EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 4 制御ハザード • 分岐命令によるハザード – 分岐先はALUで計算せざるを得ない – 次のクロックで飛び先をPCにセットする – NOPが三つ必要 理想のCPI+確率×ダメージクロックサイクル数 1+0.2×3=1.6 でかなりダメージが大きい • 回避方法 – 分岐先と飛ぶかどうかをRFステージで検出 • NOPが1つに減る – 遅延分岐 • 分岐が遅いと考えて、有効な命令でNOPを置き換える 2007/12/20 5 NOP2 BEQZ r3,-6 NOP1 IF RF RFPC EX WB a 2 regc ALU + rega IFPC 飛び先 regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 6 NOP3 NOP2 IF RF BEQZ r3,-6 NOP1 RFPC EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 7 RFステージで判断して 次のクロックで飛び先をセット BEQZ r3,-6 IF RF EX + NOP1 WB 2 ALU + regc rega a IFPC regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 8 Next Inst. RF EX + IF NOPが一つで 済む BEQZ r3,-6 NOP1 WB 2 ALU + regc rega a IFPC regb c b IFIR Instruction Memory 2007/12/20 Imm. wadr RFIR Data Memory 9 今回のverilog記述 ppico16_test.v テストベンチ memory.v メモリ ppico16.v CPU 変更 変更 if_stage.v 命令フェッチ rf_stage.v レジスタフェッチ 変更 ex_stagef.v (ex_stage.v) 実行 今回も変更はrf_stage, ex_stageのみ 2007/12/20 10 rf_stage.v 1 分岐先の計算準備 wire [DataBus-1:0] dout1; // Register File Output for Source A (Rd) wire [DataBus-1:0] fout1; // Forwarding Source A wire [DataBus-1:0] dout2; // Register File Output for Source B (Rs) wire [DataBus-1:0] fout2; // Forwarding Source B wire [RegNum-1:0] proc_dest, foll_dest; // Destination registers wire [RegNum-1:0] proc_src, foll_src; // Source registers wire [DataBus-1:0] badr; // Branch target address wire [DataBus-1:0] extend; // extension assign foll_dest = ifir[10:8]; assign proc_dest = reg_ir[10:8]; assign foll_src = ifir[7:5]; assign proc_src = reg_ir[7:5]; assign op = ifir[15:11]; assign extend = {{8{ifir[7]}},ifir[7:0]}; regfile regfile ( .clk( clk ), .adrA( foll_dest ), .adrB( foll_src), .adrC( rwadr ), .inc( c ), .outa( dout1 ), .outb( dout2 ), .rwe( rwe ) ); // Outputs assignrfir = reg_ir; assignrfpc = reg_pc; assigna = reg_a; assignb = reg_b; assignimm = reg_im; assign fout1 = rwen & (proc_dest == foll_dest) ? result : dout1; assign fout2 = rwen & (proc_dest == foll_src) ? result : dout2; 2007/12/20 11 rf_stage.v 2 分岐先の計算 assign pcset = ( op == BEQZ )& (fout1==16'h0000) | ( op == BNEZ )& (fout1!=16'h0000) ; assign badr = ifpc + extend; always @( posedge clk ) begin if ( reset_ == Enable_ ) begin reg_ir <= NULL; reg_pc <= NULL; reg_a <= NULL; reg_b <= NULL; end else begin reg_ir <= ifir; reg_pc <= ifpc; reg_a <= fout1; reg_b <= fout2; reg_im <= extend; end end 2007/12/20 12 ex_stage.v 分岐命令処理の削除 // Intermediate wires assign alu_ina = a; assign alu_inb = // Sign extended immediate ( rfir[15:13] == 3‘b001 ) | (op == LDLI) ? rfim: (op == ROP) ? b: (op == LDHI) ? {rfir[7:0],8'b0}: // LDHI {8'b0,rfir[7:0]}; // Sign unextended immediate assign aluope = (op == LDLI) | (op == LDHI) ? THB: // LDLI, LDHI (op == ROP) ? rfir[2:0]: rfir[13:11]; assign rwen = // Disable when Braches or ST ここだけは残しておく (op == BEQZ) | (op == BNEZ) | ((op == ROP) & (op2 == ST)) | ((op == ROP) & (op2 == NOP)) ? Disable : Enable; assign result = // when LD datain ((op == ROP) & (op2 == LD)) ? ddatain : aluout; 2007/12/20 13 ppico.v ステージ間接続 assign iaddr = ifpc; Memory // Fetch Addr to Instruction if_stage if_stage ( .clk( clk ), .reset_( reset_ ), .idata( idata ), .pcset( pcset ), .badr( badr ), .ifpc( ifpc ), .ifir( ifir ) ); rf_stage rf_stage ( .clk( clk ), .reset_( reset_ ), .ifir( ifir ), .ifpc( ifpc ), .rwe( rwe ), .rwen(rwen), .c( c ), .result(result), .rwadr( rwadr ), .rfpc( rfpc ), .rfir( rfir ), .a( a ), .b( b ), .imm( imm ), .pcset(pcset), .badr(badr) ); ex_stage ex_stage ( .clk( clk ) .reset_( reset_ ),.rfir( rfir ), .a( a ), .b( b ), .rfim( imm ), .ddatain( ddatain ), .rfpc(rfpc), .c( c ), .result(result), .ddataout( ddataout ), .address( daddr ), .rwadr( rwadr ), .dmwe( dmwe ), .rwe( rwe ), .rwen(rwen) ); 2007/12/20 14 残ったNOPをどうするか? • 遅延分岐:有効な命令と入れ替える 11100_001_00000000 00000_010_001_01000 00110_001_00000010 00000_011_001_01000 11100_100_00000000 00000_100_010_00110 00111_011_00000001 01001_011_11111010 00000_000_00000000 00000_001_100_01001 01010_011_11111110 00000_000_00000000 2007/12/20 // LDLI r1,#0 // LD r2,(r1) // ADDI r1,#2 // LD r3,(r1) // LDLI r4,#0 // ADD r4,r2 // SUBI r3,#1 // BNEZ r3,-6 // NOP // ST (r1),r4 // BEQZ r3,-2 // NOP 遅延スロット 15 遅延スロットに対するパイプライン スケジューリング • 有効な命令での置き換えが可能ならばロスはなくなる 11100_001_00000000 00000_010_001_01000 00110_001_00000010 00000_011_001_01000 11100_100_00000000 00111_011_00000001 01001_011_11111100 00000_100_010_00110 00000_001_100_01001 01010_011_11111110 00000_000_00000000 2007/12/20 // LDLI r1,#0 // LD r2,(r1) // ADDI r1,#2 // LD r3,(r1) // LDLI r4,#0 // SUBI r3,#1 // BNEZ r3,-4 // ADD r4,r2 // ST (r1),r4 // BEQZ r3,-2 // NOP 16 スーパスカラ方式 2命令同時発行の例 (3,4命令同時発行も実現さ れている) WB WB EX 命令コードの互換性がある 命令実行制御がたいへん EX 通常の命令 パイプライン RF RF IF IF 浮動小数点演算 パイプライン キャッシュ 通常の命令 浮動小数点演算命令 メモリシステム 2007/12/20 17 VLIW(Very Long Instruction Word)方式 WB EX EX EX EX RF IF 4つの命令分の長い命令 実行の制御はコンパイラがあらかじめ行うので制御は簡単 コードの互換性がない 2007/12/20 18 マルチコア化、マルチプロセッサ化 • ヘテロジーニアスなマルチプロセッサ – 目的別に専用プロセッサを接続 – 最も容易に性能価格比を上げることができる – それぞれのプロセッサのソフトウェア開発環境が異なり、 統合した動作検証が困難 • ホモジーニアスなマルチプロセッサ – 汎用プロセッサを複数接続 – サーバ系のマルチプロセッサの技術を導入可能 • 並列OS、並列プログラムの開発環境が良い – 電圧とクロック周波数を制御することで、必要とする性能 を最適な消費電力で得ることができる • 基本的に、それぞれのプロセッサで別々のタスクを 処理 ⇔ プロセッサアレイとの違い 2007/12/20 19 NEC MP211 タスクレベルの並列処理を指向: ヘテロジーニアス Sec. Acc. ARM926 PE0 DMAC USB OTG 3D Acc. Rotater. Camera Image Acc. TIM1 APB Bridge0 ARM926 PE2 2007/12/20 TIM2 Scheduler TIM3 SDRAM Controller WDT Async Bridge0 SPX-K602 DSP LCD I/F Multi-Layer AHB Bus Interface ARM926 PE1 Cam DTV I/F. LCD Async Bridge1 APB Bridge1 Mem. card FLASH Inst. RAM On-chip SRAM PMU (640KB) PLL OSC PCM IIC SRAM Interface SMU uWIRE UART INTC TIM0GPIO SIO DDR SDRAM 20 Cell(IBM/SONY/東芝)SPE: External DRAM SXU SXU SXU SXU LS LS LS LS DMA DMA DMA DMA Synergistic Processing Element (SIMD core) 128bitデータに対する同時 演算 (例:32bit X 4) 2命令同時発行 512KB Local Store MIC EIB: 2+2 Ring Bus 512KB L2 C 32KB+32KB L1 C Flex I/O SXU LS PPE PXU BIC DMA SXU SXU LS LS LS DMA DMA DMA SXU CPU Core IBM Power 2命令同時発行のスーパスカラ 2007/12/20 2スレッド同時実行 マルチメディア命令 DMAによりSPEの 各LSをPPEの主記憶 と同一メモリ空間に マップ可能 どちらかというとホモジーニアス 21 MPCore (ARM+NEC) Private FIQ Lines … 典型的なSMP構造 Interrupt Distributor Timer CPU Wdog interface Timer CPU Wdog interface IRQ IRQ Timer CPU Wdog interface IRQ Timer CPU Wdog interface IRQ CPU/VFP CPU/VFP CPU/VFP CPU/VFP L1 Memory L1 Memory L1 Memory L1 Memory Snoop Control Unit (SCU) Private Peripheral Bus 2007/12/20 Duplicated L1 Tag Private AXI R/W 64bit Bus L2 Cache Coherence Control Bus 22 演習 • 遅延分岐を用いたPICOのCPIを求めよ – 理想のCPIは1 – 分岐命令の確率は20% – 遅延スロットを有効な命令で埋めることので きる可能性が80% 2007/12/20 23 次回最終演習 • パイプライン化されたPICOにJMP命令を取り 付け、テストせよ • 制御ハザード対策をしたファイルはweb上に 掲示 2007/12/20 24
© Copyright 2024 ExpyDoc