計算機構成: トップダウンの解説

制御ハザードとその解決法
慶應義塾大学 理工学部
天野
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