24.10.2007 数理情報科学特別演習 1 パイプライン構造 • パイプラインの考え方 • MIPS • 命令セット(アセンブリ言語の考え方) • ハザード対策 • パイプラインのスムーズな展開を阻止する要因 • その主な起因 • 構造的(ストラクチャル) • データアクセス • コントロール(分岐命令による次実行アドレス予測) • ループ展開とソフトウェアパイプライン
24.10.2007 数理情報科学特別演習 1
パイプライン構造
• パイプラインの考え方• MIPS• 命令セット(アセンブリ言語の考え方)• ハザード対策
• パイプラインのスムーズな展開を阻止する要因• その主な起因
• 構造的(ストラクチャル)• データアクセス• コントロール(分岐命令による次実行アドレス予測)
• ループ展開とソフトウェアパイプライン
24.10.2007 数理情報科学特別演習 2
パイプラインの考え方
• 1命令の実行をいくつか(n)の工程に分解し異なる工程を並列に動作させる.
• 結果的に数個の命令が並列動作しているようにみせかけ1命令あたりの消費クロック数を少なくみせるしかけ.
24.10.2007 数理情報科学特別演習 3
命令処理・実行の工程• 命令の処理工程を(例えば)5段階に分解• 各工程は1クロック単位で動作するようにする
24.10.2007 数理情報科学特別演習 4
パイプライン制御
• パイプラインにより制御がない場合,3命令で15クロック
• (理想的)パイプラインによる制御• 9クロックで5命令• CPI(Clock per Instruction)=1.8
24.10.2007 数理情報科学特別演習 5
MIPS値
• MIPS(Million Instruction per Second)定義:MIPS=周波数(MHz)÷CPI• 100MHz• CPI:1.8ではMIPS=55.55
ちなみにPentium(初期)はCPI平均0.7(といわれている),クロック100MHzでMIPS=140
24.10.2007 数理情報科学特別演習 6
スムーズなパイプライン処理の乱れ
• さまざまな制約によりパイプライン処理は理想的に動かない→ハザード(hazard)あるいはコンフリクト(conflict)
• 今まで工夫をこらしてさまざまな(後述の)ハザード対策を行ってきた.しかしその対策が新たなハザードを生むと行った具合で大変むずかしい問題が存在する.
• パイプライン処理技術の発展とはH/W,S/Wともにこのハザード対策といってよい
24.10.2007 数理情報科学特別演習 7
ハザード
• 構造的ハザード(ユニットコンフリクト)• Cacheの各ステージでの取り合い
• I-cacheとD-cacheを分ける• ALUの取り合い
• メモリアドレス計算ユニットと算術演算ユニットの分離• 算術演算(整数と浮動小数点で異なるユニット利用)
• データハザード• とりあえずRAW(Read After Write)• WAR,WAWは通常起きないと考えられる.
• コントロールハザード• 分岐命令での次の分岐先決定までのもたつき
• パイプラインがハザードでステージ進行がもたつくことをストールあるいはインターロックという.
24.10.2007 数理情報科学特別演習 8
アセンブリプログラム例 Collatz数列• 初項の値をnとする(プログラムでは値123をr1に入れている)• 次項はもしnが奇数なら3*n+1,偶数ならn/2で与える
la r27,endla r30,$$$la r29,$$la r28,$$$$la r1,123 ; set initial value
$$: addi r2,r1,-1 ; r1-1=0?brzr r27,r2 ; yes, then end
$$$$: addi r10,r10,1 ; r10=r10+1(count up)muli r11,r10,4 ; r11=r10*4andi r2,r1,1 ; mod(r1,2)=0 ?brzr r30,r2 ; if so,then $$$muli r1,r1,3 ; r1=3*r1addi r1,r1,1 ; r1=r1+1st r1,end(r11) ; store resultbr r28
$$$: shr r1,r1,1 ; r1=r1/2 st r1,end(r11) ; store r1 in addr.(end+r11)
br r29end: stop
タグ(アドレスに名前付け)
命令(インストラクション)
オペランド
コメント
•命令は論理四則演算,分岐,メモリロード,ストア,特殊レジスタアクセスなどよりなる.
•オペランドはレジスタを指定し高速計算をめざす
•オペランドの数は命令ごとに違う
•各命令は32ビットでコード化される
•書き方はタグ(オプショナル),命令,オペランドの順であれば形式は自由
24.10.2007 数理情報科学特別演習 9
データおよび構造的ハザードa[i]=a[i]+b[i]+c[i+1]の計算(0≤i<lengthの繰り返し)
24.10.2007 数理情報科学特別演習 10
データハザードの回避策
• 上手にプログラムを書く• コンパイラのオプティミゼーションを磨く
24.10.2007 数理情報科学特別演習 11
データフォワーディング(先送り)
• E→DあるいはM→Dといったバイパスを作りレジスタデータをD-ステージにさっさとすいあげる
24.10.2007 数理情報科学特別演習 12
コントロールハザード• 分岐(branch)命令により引き起こされる
• 条件分岐,無条件分岐がある• 条件分岐では条件成立で分岐(taken),不成立(not-
taken)で引き続く命令が実行される
la r27,endla r30,$$$la r29,$$la r28,$$$$la r1,123 ; set initial value
$$: addi r2,r1,-1 ; r1-1=0?brzr r27,r2 ; yes, then end
$$$$: addi r1,r1,1 ; r1=r1+1(count up)muli r11,r10,4 ; r10=r10*4andi r2,r1,1 ; mod(r1,2)=0 ?brzr r30,r2 ; if so,then $$$muli r1,r1,3 ; r1=3*r1addi r1,r1,1 ; r1=r1+1st r1,end(r11) ; store resultbr r28
$$$: shr r1,r1,1 ; r1=r1/2
24.10.2007 数理情報科学特別演習 13
分岐命令によるストール例
• brzr分岐命令でとび先判明はEステージ• それまでパイプラインはストールされる
24.10.2007 数理情報科学特別演習 14
分岐命令によるストール対策
• 単純な命令先読み(プリフェッチ)• 予測プリフェッチ(TakenあるいはNot-taken)• プリフェッチ(両ケースとも)ハードウェア資源の限界,ストールは除去できない
• プログラムの特質を考慮した分岐の予測を行う• 一般にプログラムは11-17%の条件分岐,2-8%の無条件分岐を含む
• 条件分岐のtaken確率~50%• loop構成の条件分岐のtaken確率>90%• bit testの条件分岐のほとんどはnot-taken
24.10.2007 数理情報科学特別演習 15
スムーズなパイプライン処理のための分岐予測の原則
• 分岐のtaken/not-taken判定を早くする• 分岐先アドレス(PC)を早く求めておく• 分岐予測をする場合,予測的中(ヒット)率を高める工夫をする
• 予測失敗でのストール(ペナルティ)をできるだけ小さくする
• 予測のもとに(分岐,非分岐が未確定なのに)分岐先アドレスを設定し実行を行っていくことを投機的実行(Speculative Execution)という.
24.10.2007 数理情報科学特別演習 16
静的予測
• 静的予測:• あらかじめ条件分岐がループの場合(分岐先が現在番地より手前)は
taken,そうでない場合はnot-taken• If a… then b… elseの場合,a…のほうがメジャーなのではとの憶測
24.10.2007 数理情報科学特別演習 17
遅延分岐• 遅延分岐:分岐先判明までの時間を有効に使うためその次に数スロット命令を追加するし,分岐先判明後に分岐先命令実行
• takenでは1ステージのストール,not-takenではストールなし• 遅延スロットの命令は必ず実行
24.10.2007 数理情報科学特別演習 18
動的分岐予測1(BPB)• 分岐予測バッファ(Branch Prediction Buffer; BPB)
• D-ステージ上での次回分岐予測アルゴリズム. 分岐命令と判明したら,命令アドレスからBPBを参照して次回予測T/Nを得る,そしてそれをもとに分岐先をすみやかに決定する.
• BPBの更新は実行中,動的に• もし今回の結果がT/Nと一致なら,次回予測もそのT/Nとする.
• 今回の結果がT/Nの反対の場合,次回予測ははずれの回数による.
• 例えばD/S=1にもかかわらずT/N=0としたが実際は1だったら(not-taken),次回(2度裏切られられないように) T/Nは1
• T/N=0,D/S=1で実際は0(taken)のときは,次回T/N=0
• しかしD/S=1でT/N=0と予測し実際0であれば次回予測T/N=0とする
• Branch History Table(DHT)とも呼ぶ
24.10.2007 数理情報科学特別演習 19
動的分岐予測2(BTB)• 分岐標的バッファ(Branch Target Buffer; BTB)
• 分岐のtaken/not-takenのみならず,分岐先予測も行う.BTBに分岐履歴を保持しておく.
• I-ステージで命令アドレスを常に(どの命令でも)BTBで検索し• 一致があればそれは分岐命令であり,predicted address fieldに登録されているアドレスにすみやかに移動.そのアドレスでのI-ステージ実行(ストールなし)
• 一致なければ通常パイプラインフロー
24.10.2007 数理情報科学特別演習 20
SAXPY計算• Z[i]=a*X[i]+Y[i]という計算(SAXPY;Single precision AX Plus Y計算)を考える.
• データハザード(RAW)によるパイプラインのストールが発生• 5ステージパイプラインでループ1回に17サイクル
24.10.2007 数理情報科学特別演習 21
ループ展開(Loop Unrolling)• RISCスタイルのCPUでは数多くの汎用レジスタがあるので1回のループをレジスタを豊富に使い以下のように書き直す
• 3回分の繰り返しを1回のループに展開(unroll)する.• 各繰り返し用に使われるレジスタを異なるものとする,これによりデータハザード解消• 結果として23サイクル/3ループ→1回のループが8サイクル程度まで縮小
24.10.2007 数理情報科学特別演習 22
ソフトウェアパイプライン• 1つのループをいくつかのステージに分ける.• 1つのループ内でステージごとに異なるデータ領域への操作を行う• ステージの数を(4サイクル分)減らせる
24.10.2007 数理情報科学特別演習 23
ソフトウェアパイプライン-考え方(1)• AXPYのような処理ループで同じレジスタの取り合いがRAWデータハザードとなる.
• 処理をパイプライン的に捉え直す• 各ストリームでは違う処理用レジスタを異なるものにする.結果的にハザードを減らせる
24.10.2007 数理情報科学特別演習 24
ソフトウェアパイプライン-考え方(2)• 先のプログラムをCで書いてみよう:• 機械語プログラムでは主ループの前(プロローグ)と後(エピローグ)の記述を抜かしてあった.