コンピュータ工学基礎 パイプラインハザード テキスト9章 115~124 情報工学科 天野英晴 パイプラインハザードとは? • パイプラインがうまく流れなくなる危険、障害のこと – 構造ハザード • 資源が競合して片方のステージしか使えない場合に生じる – データハザード • データの依存性により生じる • 先に進んだ命令の結果を後の命令が利用するため、その結果がレジス タに書かれるまで、読むことができない – コントロールハザード • 分岐命令が原因で、次に実行する命令の確定ができない • パイプラインストール – ハザードが原因による性能の低下 – パイプライン処理は理想的に動くとCPIが1 • ストールによりCPIが大きくなってしまう IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 rd_id 10 alu_bsel daddr ddataout st_op_id 命令メモリ creg dreg S Y B 01 ext ext0 imm 7:0 PC breg 00 + rd_ex A rwe_ex rs 7:5 com_id areg ‘1’ ADD 00 01 10 ir rwe_ex st_op_id ld_op_id THB rd 10:8 WB we データ メモリ ddatain 0 1 IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 ir ADD rd_id 10 alu_bsel dataout datain addr st_op_id we 命令/ データ メモリ creg dreg S Y B 01 imm 7:0 ext ext0 PC breg 00 + rd_ex A rwe_ex rs 7:5 com_id areg ‘1’ funct 2:0 THB rd 10:8 rwe_ex st_op_id ld_op_id 00 01 10 命令/データの 共有メモリを使う 場合 WB 0 1 メモリの共通化による構造ハザード LD命令 命令1 IF ID IF 命令2 IF時にメモリが 使えない EX ID Bubble WB EX WB IF ID IF 1クロック分終了が遅れる EX ID WB EX WB 命令3 LD命令の次の次の命令フェッチを1クロック遅らせる。 ストール付きCPI=理想のCPI+ストールの確率×ストールのダメージ 1 + 0.25×1 (LD/ST命令が合わせて25%とする) 構造ハザード • 資源の複製により解決可能 • コストと性能のトレードオフを考えて決める – メモリの共有化→コスト減を取るか? – CPI 1→1.25の性能低下を取るか? データハザード • 直前の命令の結果がレジスタファイルに書き込まれないうちに、後続の 命令が読み出しを行ってしまう – データの依存性により生じるハザード • 一つ前、さらに一つ前まで問題に • 複数命令を時間的に重ねて実行する場合には常に問題になる – Read After Write (RAW)ハザードと呼ばれる – Write After Read(WAR)はPOCOでは生じない – Write After Write(WAW)は通常あまり問題にならない • 回避手法 → NOPを入れて命令の間隔を保持する → フォワーディング(Forwarding) 最新のデータを横流しにする 条件:1.後続の命令とレジスタ番号が一致 2.結果を書き込む命令 ADDI r0,#1 LDI r0,#0 LD r1, (r0) IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 rd_id 10 alu_bsel daddr ddataout 命令メモリ 0 creg dreg S Y B 01 breg 00 imm 7:0 ext ext0 rs 7:5 r0 rd_ex A rwe_ex + PC com_id areg ‘1’ ADD 00 01 10 ir rwe_ex st_op_id ld_op_id THB rd 10:8 WB st_op_id we データ メモリ ddatain 0 1 LD r3,(r0) ADDI r0,#1 IF EX ID rwe decorder st_op ld_op funct 3:0 funct 2:0 rd_id 10 creg dreg S Y B 01 古いデータ alu_bsel 次のクロックの立上り で格納 命令メモリ breg 00 ext ext0 imm 7:0 PC rd_ex A 古いデータ + rs 7:5 com_id areg rwe_ex ADD 00 01 10 ‘1’ rwe_ex st_op_id ld_op_id THB ir WB rwe_id opcode 15:11 rd 10:8 LDI r0,#0 LD r1,(r0) daddr ddataout st_op_id we データ メモリ ddatain r0=0 0 1 NOP LD r1,(r0) IF EX ID rwe decorder st_op ld_op funct 3:0 funct 2:0 rd_id creg dreg S Y 10 alu_bsel 次のクロックの立上り でデータを格納 命令メモリ B 01 ext ext0 imm 7:0 PC breg 00 + rd_ex A rwe_ex rs 7:5 com_id areg ‘1’ ADD 00 01 10 ir rwe_ex st_op_id ld_op_id THB rd 10:8 WB rwe_id opcode 15:11 NOPを入れて 命令の間隔を確保 LDI r0,#0 NOP daddr ddataout st_op_id we データ メモリ ddatain r0=0 0 1 NOPを入れる方法 • NOPを2つ入れて命令間隔を確保 ハザード付きCPI= 理想のCPI+ストールの確率×ストールのダ メージ 1 + 後続の命令が利用する確率×2= 1+ 0.8×2くらいはあるか?? 2.6は悪化のしすぎ LD r3,(r0) ADDI r0,#1 IF EX ID rwe decorder st_op ld_op funct 3:0 funct 2:0 rd_id 新しいデータ creg dreg S Y B 10 命令メモリ 読み出しレジスタ 番号=書き込み レジスタ番号 01 imm 7:0 PC ext ext0 rs 7:5 breg 00 + rd_ex A rwe_ex com_id areg ‘1’ ADD 00 01 10 ir rwe_ex st_op_id ld_op_id THB rd 10:8 WB rwe_id opcode 15:11 レジスタファイルの フォワーディング LDI r0,#0 LD r1,(r0) alu_bsel daddr ddataout st_op_id we データ メモリ ddatain r0=0 0 1 演習1 • レジスタファイルにフォワーディングを付けた ことで、NOPを一つ入れればデータハザード を回避できる。 – 後続の命令が前の命令の結果を利用する可能 性:0.8 とすると、CPIはどのようになるか? ADDI r0,#1 LDI r0,#0 LD r1, (r0) IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 THB ir ADD com_id rd_id 最新の値と入 alu_bsel れ替える daddr ddataout 命令メモリ st_op_id we データ メモリ 0 creg dreg 10 0 1 breg 01 imm 7:0 PC ext ext0 rs 7:5 B 00 + S Y 古いr0 0 1 rd_ex A rwe_ex areg ‘1’ rd 10:8 rwe_ex st_op_id ld_op_id 00 01 10 EXステージの フォワーディング 案その1 WB 0 1 0 1 r0 ddatain LD r3,(r0) ADDI r0,#1 IF LDI r0,#0 EX WB ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 THB ir rd 10:8 ADD com_id rd_id creg dreg S Y B 10 breg 01 ext ext0 imm 7:0 PC 0 1 rd_ex A 00 + areg 0 1 rwe_ex rs 7:5 rwe_ex st_op_id ld_op_id 00 01 10 EXステージの フォワーディング 案その1 ‘1’ LD r1, (r0) 0 1 alu_bsel r0 daddr ddataout 命令メモリ 0 1 st_op_id we データ メモリ ddatain 0 ADDI r0,#1 LDI r0,#0 LD r1, (r0) IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 THB ir ADD com_id rd_id 0 1 0 creg dreg 10 breg 01 imm 7:0 PC ext ext0 rs 7:5 B 00 + S Y 古いr0 0 1 rd_ex A rwe_ex areg ‘1’ rd 10:8 rwe_ex st_op_id ld_op_id 00 01 10 EXステージの フォワーディング 案その2 WB 0 1 alu_bsel r0 daddr ddataout ここで入れ替え 命令メモリ 0 1 st_op_id we データ メモリ ddatain パイプラインハザードとは? • パイプラインがうまく流れなくなる危険、障害のこと – 構造ハザード • 資源が競合して片方のステージしか使えない場合に生じる – データハザード • データの依存性により生じる • 先に進んだ命令の結果を後の命令が利用するため、その結果がレジス タに書かれるまで、読むことができない – コントロールハザード • 分岐命令が原因で、次に実行する命令の確定ができない • パイプラインストール – ハザードが原因による性能の低下 – パイプライン処理は理想的に動くとCPIが1 • ストールによりCPIが大きくなってしまう IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 ir ADD com_id rd_id creg dreg 10 0 1 breg 01 imm 7:0 PC ext ext0 rs 7:5 B 00 + S Y 古いr0 0 1 rd_ex A rwe_ex areg ‘1’ funct 2:0 THB rd 10:8 rwe_ex st_op_id ld_op_id 00 01 10 そもそも分岐 命令はサ ポートされて いない WB 0 1 alu_bsel r0 daddr ddataout 命令メモリ 0 1 st_op_id we データ メモリ ddatain ALUで分岐先を計算すると、、、 3クロック分終了が遅れる Branch命令 次の命令 IF ID Bubble EX Bubble WB Bubble IF ID IF EX ID IF WB EX ID Branchの次の命令フェッチを3クロック遅らせる。 ストール付きCPI=理想のCPI+ストールの確率×ストールのダメージ 1 + 0.25×3 =1.75 (Branch/JMP/JAL命令を合わせて25%とする) ダメージが大きい! WB EX WB IFで加算を行う IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 THB 0 1 ir ADD com_id rd_id 0 1 0 1 alu_bsel r0 判定 daddr ddataout 命令メモリ creg dreg S Y 10 0 1 breg 01 imm 7:0 PC ext ext0 rs 7:5 B 00 + rd_ex A 0 1 rwe_ex areg ‘1’ rd 10:8 rwe_ex st_op_id ld_op_id 00 01 10 ext ‘0’ WB st_op_id we データ メモリ ddatain IFで加算を行う IF EX ID rwe decorder st_op ld_op funct 3:0 rwe_id opcode 15:11 funct 2:0 THB 0 1 ir ADD com_id rd_id alu_bsel r0 クリティカルパスが 伸びる 0 1 0 1 判定 命令メモリ creg dreg S Y 10 0 1 breg 01 imm 7:0 PC ext ext0 rs 7:5 B 00 + rd_ex A 0 1 rwe_ex areg ‘1’ rd 10:8 rwe_ex st_op_id ld_op_id 00 01 10 ext ‘0’ WB daddr ddataout st_op_id we データ メモリ ddatain IFステージで分岐先を計算すると、、、 1クロック分終了が遅れる Branch命令 次の命令 IF ID Bubble EX WB IF ID IF EX WB ID IF EX ID WB EX WB Branchの次の命令フェッチを1クロック遅らせる。 ストール付きCPI=理想のCPI+ストールの確率×ストールのダメージ 1 + 0.25×1 = 1.25 (Branch/JMP/JAL命令を合わせて25%とする) これ以上はどうにもならない predict not-taken IF 分岐すれば 1クロック 待たす ID Bubble EX WB IF ID IF 1クロック分終了が遅れる EX ID IF IF 分岐しなければ フェッチした 命令をそのまま 使う ID IF EX ID IF WB EX ID WB EX WB WB EX ID IF WB EX ID WB EX WB ストール付きCPI=理想のCPI+ストールの確率×分岐する確率×ストールのダメージ 1 + 0.25×1×0.7 =1.175 (Branch/JMP/JAL命令を合わせて25%とする) 分岐する方が確率が高いため、効果はイマイチ 遅延分岐 • 分岐命令の次の命令(遅延スロット)をパイプ ラインに入れてしまう。 – 遅延スロットの命令は必ず実行される →POCOの場合は遅延スロットは1 – つまり、遅延の効き目が遅い – 有効な命令を入れてやる必要がある → パイプラインスケジューリング パイプラインスケジューリング LDIU r0,#2 LD r1,(r0) LDIU r0,#3 LD r2,(r0) LDIU r3,#0 loop: ADD r3,r1 ADDI r2,#-1 BNZ r2,loop NOP LDIU r0,#0 ST r3,(r0) end: BEZ r2, end NOP LDIU r0,#2 LD r1,(r0) LDIU r0,#3 LD r2,(r0) LDIU r3,#0 loop: ADDI r2,#-1 BNZ r2,loop ADD r3,r1 LDIU r0,#0 ST r3,(r0) end: BEZ r2, end NOP 演習2 下のプログラムは0番地から並ぶ8個のデータ の総和を取る。これをパイプラインスケジュー ルしてストールをなくせ。 loop: LDI r0,#8 LDI r1,#0 ADDI r0,#-1 LD r2,(r0) ADD r1,r2 BNZ r1,loop NOP 高速化の流れ スレッドレベルの 高速化 Simultaneous Multithreading 複数命令の同時発行 (スーパースカラ) 命令レベルの 高速化 RISCの登場 パイプライン化 マルチコア化 パイプラインを細かく (スーパーパイプライン) 周波数の向上 命令の動的スケジュール マルチコア 革命 2003-2004 1980 1990 2000 マルチコア、メニーコア • 動作周波数の向上が限界に達する – 消費電力の増大、発熱の限界 – 半導体プロセスの速度向上が配線遅延により限界に達する • 命令レベル並列処理が限界に達する • メモリのスピードとのギャップが埋まらない → マルチコア、メニーコアの急速な発達 マルチコア革命 2003-2004年 • プログラマが並列化しないと単一プログラムの性能が上 がらない クロック周波数の向上 周波数 Pentium4 3.2GHz 高速プロセッサのクロック周波数 Nehalem 3.3GHz 1GHz 年間40% Alpha21064 150MHz プロセッサの動作周波数は 2003年で限界に達した 消費電力、発熱が限界に 100MHz 1992 2000 2008 年 Flynnの分類 • 命令流(Instruction Stream)の数: M(Multiple)/S(Single) • データ流(Data Stream)の数:M/S – SISD • ユニプロセッサ(スーパスカラ、VLIWも入る) – MISD:存在しない(Analog Computer) – SIMD – MIMD 一人の命令で皆同じことをする SIMD 命令メモリ 命令 演算装置 Data memory 半導体チップ内でたくさんの 演算装置を動かすには良い 方法 アクセラレータ(普通のCPU にくっつけて計算能力を加速 する加速装置)の多くは この方式 安くて高いピーク性能が 得られる →パソコン、ゲーム機と 共用 GPGPU:PC用 グラフィックプロセッサ – TSUBAME2.0(Xeon+Tesla,Top500 2010/11 4th ) – 天河一号(Xeon+FireStream,2009/11 5th ) ※()内は開発環境 GeForce GTX280 240 cores Host Input Assembler Thread Execution Manager Thread Processors Thread Processors Thread Processors Thread Processors Thread Processors … PBSM PBSM PBSM PBSM PBSM PBSM Load/Store Global Memory PBSM PBSM PBSM PBSM GPU (NVIDIA’s GTX580) 128 Cores 128 Cores L2 Cache 128 Cores 128個のコアは SIMD動作をする 4つのグループは 独立動作をする 128 Cores もちろん、このチップを たくさん使う 512 GPU cores ( 128 X 4 ) 768 KB L2 cache 40nm CMOS 550 mm^2 MIMD(Multipe-Instruction Streams/ Multiple-Data Streams)の特徴 • 自分のプログラムで動けるプロセッサ(コア)を多数使う – 同期:足並みを揃える – データ交信:共通に使うメモリを持つなど • • • • 最近のPC用のプロセッサは全部この形を取っている 最近はスマートフォン用のCPUもマルチコア化 集中メモリ型 UMA(Uniform Memory Access Model) 分散メモリ型 NUMA(Non-Uniform Memory Access Model) • 共有メモリを持たない型 NORMA(No Remote Memory Access Model) Private FIQ Lines SMP for Embedded MPCore (ARM+Renesas) application … 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 Duplicated L1 Tag Private AXI R/W 64bit Bus L2 Cache Coherence Control Bus SUN T1 L2 Cache bank Directory Core Core Core Core Crossbar Switch Core L2 Cache bank Directory Memory L2 Cache bank Directory Core Core Core FPU Single issue six-stage pipeline RISC with 16KB Instruction cache/ 8KB Data cache for L1 L2 Cache bank Directory Total 3MB, 64byte Interleaved SUN Niagara 2 Niagara 2 Multi-Core (Intel’s Nehalem-EX) CPU CPU L3 Cache CPU CPU CPU CPU L3 Cache CPU CPU 8 CPU cores 24MB L3 cache 45nm CMOS 600 mm^2 分散共有メモリ型 Node 0 0 Node 1 1 2 Interconnection Network Node 2 3 Node 3 メモリ空間 独立して動けるプロセッサ を複数使う Cell Broadband Engine PS3 PPE L2 C SPE L1 C SXU SXU SXU SXU IBM Roadrunner Common platform for supercomputers and games PXU LS LS LS LS IOIF1 DMA DMA DMA DMA 1.6GHz / 4 X 16B data rings BIF/ MIC SXU SXU SXU SXU IOIF0 LS LS LS LS DMA DMA DMA DMA Supercomputer 「K」 L2 C Memory Core Core Core Core Core Core Core Core Tofu Interconnect 6-D Torus/Mesh Inter Connect Controller SPARC64 VIIIfx Chip 4 nodes/board 96nodes/Lack 24boards/Lack RDMA mechanism NUMA or UMA+NORMA
© Copyright 2024 ExpyDoc