プロセッサの高速化技術

このページでは、パイプラインとハザード、スーパスカラ・VLIW、Flynnの分類、マルチプロセッサとアムダールの法則、クロックを使った性能の計算がわかります。

  • 一言で言うと:
    • CPUをもっと速くする工夫の話。命令を流れ作業にする(パイプライン)、何本も並べる(スーパスカラ、VLIW)、CPUそのものを増やす(並列処理、マルチプロセッサ)、そして性能の測り方(クロック)。計算問題が出やすいテーマ。

流れ作業にする(パイプライン)→ データや命令を並列にする(並列処理)→ CPUを増やす(マルチプロセッサ)→ 速さを測る(プロセッサの性能)

覚え方の軸

  • 高速化は「1本を流れ作業にする」→「流れを何本も並べる」→「CPUを増やす」の順に大きくなる:
    • パイプライン → スーパスカラ・VLIW → マルチプロセッサ
  • ハザードは「分岐(制御)」「データの依存」「資源の取り合い(構造)」の3つ
  • 並列化の判断は「いつ決めるか」:
    • 実行時にハードウェアが決める(スーパスカラ)⇔ コンパイル時に決める(VLIW)
  • 公式は3つだけ:
    • パイプライン時間=(D+N−1)×P、アムダールの法則 E=1÷{(1−r)+r/n}、命令実行時間=クロックサイクル時間×CPI
  • Flynnの分類は「命令が1つか複数か × データが1つか複数か」の2×2

パイプライン:命令を流れ作業にする

  • 高速化の考え方:
    • CPUのクロックアップやハードディスクの高速化といった部品の性能のほか、単位時間あたりの処理量(スループット)を上げる考え方や、マルチCPUで処理する考え方がある
  • パイプライン処理:
    • 1つの命令をステージ(段)という複数のステップに分け、各ステージをオーバーラップ(並列に)して処理する方式。1つの命令が終わる前に、次の命令を始められる
    • 逐次処理では1つの命令が終わるまで次の命令を始めないので効率が悪い → 命令の実行を分業化する(洗濯機・乾燥機・たたみ係が順に回す流れ作業のイメージ)
    • 後続の命令を先読みし、ステージを少しずつずらしながら複数の命令を同時に実行する
    • 各命令の実行時間が均一である必要がある → RISCが向いている
  • スーパパイプライン方式:
    • パイプラインをさらに細かく分けて高速化する方式。ステージ数が多いので、命令間の依存関係が起きやすい
  • パイプラインハザード:
    • 先読みした命令が無駄になったり、待合せが起きたりして、パイプライン処理が乱れる状態、またはその原因
  • 制御ハザード(分岐ハザード):
    • 分岐命令があると、先読みした命令ではなく分岐先の別の命令を実行することがあり、先読みした命令が無駄(無効)になる
    • 分岐は完全にはなくせない(forやwhileの繰返しも条件付き分岐になる)
    • 対策:
      • 投機実行、遅延分岐
  • 投機実行:
    • 分岐するかどうかが決まる前に、分岐先を予測して命令を実行しておく。予測が当たれば処理を続けられ、性能が上がる
  • 遅延分岐:
    • 分岐命令の前にある命令のうち、分岐命令の後ろに移しても結果が変わらない命令を分岐命令の後ろに移し、それを無条件に実行してから実際に分岐する
    • 遅延スロット:
      • 分岐命令のすぐ後ろの命令。分岐命令の直前の命令を遅延スロットに置けば、パイプラインの乱れを抑えられる
  • データハザード:
    • データの依存関係が原因のハザード。命令1がデータを書き換える前に命令2がそのデータを読むと、つじつまが合わなくなる → 命令2の読込みに待合せが起きる
  • 構造ハザード:
    • ハードウェア資源の競合によって起きるハザード
  • パイプラインを深くすると:
    • クロック数を上げやすくなるが、ハザードが起きたときの無駄な処理が大きくなる
  • パイプラインの深さ:
    • 1つの命令を分けたステージの数
  • パイプラインピッチ:
    • 1ステージの実行にかかる時間
  • パイプライン処理時間(★計算問題)=
    • (D + N − 1) × P(D:パイプラインの深さ、N:命令数、P:パイプラインピッチ。ハザードは考えない)
    • 考え方:
      • 最初の命令が終わるまでにDステージかかり、そのあとは1ピッチごとに1命令ずつ終わる
    • 例:
      • 深さ5、命令3、ピッチ2ナノ秒 → (5+3−1)×2=14ナノ秒。パイプラインなしなら5×3×2=30ナノ秒なので、半分以下になる
    • ★試験では「1ステージの実行」を「1サイクル」ということがある。そのときはP=1で計算する
      • 例:
        • ステージ数6で15命令 → (6+15−1)×1=20サイクル
    • 例題:
      • 深さ4、命令10、ピッチ2ナノ秒 → (4+10−1)×2=26ナノ秒(パイプラインなしなら4×10×2=80ナノ秒)
  • スーパスカラ:
    • CPUの中に複数のパイプラインを用意して、並列に動かす技術。同じステージも並列に実行できる
    • パイプライン数(スーパスカラ度):
      • 並べたパイプラインの数
    • どの命令を同時に実行するかは、実行時にハードウェアが動的に決める。命令間の依存関係を調べる必要があり、そのオーバヘッドがかかる
  • VLIW(Very Long Instruction Word):
    • コンパイルの段階で、依存関係のない複数の命令を並べて1つの複合命令にし、同時に実行させる手法。実行(演算)ステージが多重化される
    • 同時に実行する命令の数をそろえるため、足りないときはNOP命令を入れる
    • 実行時の判断が要らないので、CPUのオーバヘッドが減って速くなるが、コンパイラの設計が難しくなる
  • NOP命令(No OPeration):
    • 「何もしない」命令
  • アウトオブオーダ実行:
    • 依存関係のない命令を、プログラムに書かれた順番に関係なく実行する方式。順序を守らないことで性能を上げる
  • インオーダ実行:
    • 命令の順番を守る方式
  • CPI(Cycles Per Instruction):
    • 1命令の実行に必要なクロック数。クロックサイクル数ともいう
    • 例:
      • 5ステージで、各ステージを1クロックで実行するなら、CPIは5クロック
    • 通常のパイプラインでは、ステージを増やしても平均CPIは1より小さくできない
    • スーパスカラやVLIWは1クロックサイクルで複数の命令を実行するので、平均CPIを1より小さくできる

並列処理:命令とデータを並列にする

  • 並列処理:
    • プロセッサ単独の性能向上には限界があるので、複数のプロセッサを協調して動かす技術。行列演算や流体計算など、大規模で複雑な演算を支える
  • マルチコア:
    • 1つのプロセッサの中に複数の処理機能(コア:プロセッサの中核)を持たせて並列処理し、プロセッサ全体の性能を上げる形態
  • Flynnの分類:
    • 並列に実行できる命令の数とデータの数の関係で、4つのアーキテクチャに分ける。このうちSIMDとMIMDが並列コンピュータ
データ1つ データ複数
命令1つ SISD(1つの命令で1つのデータ) SIMD(1つの命令で複数のデータ)
命令複数 MISD(複数の命令で1つのデータ) MIMD(複数の命令で複数のデータ)
  • SIMD(Single Instruction stream Multiple Data stream):
    • 複数の演算装置が、それぞれ違うデータに同じ演算を同時並列に行う
    • 従来のベクトル型スーパコンピュータのアレイプロセッサが該当。最近は音声・画像・動画などのマルチメディアを扱うプロセッサ(GPUなど)にも使われる
  • MIMD(Multiple Instruction stream Multiple Data stream):
    • 複数のプロセッサが、それぞれ違う命令を、違うデータに対して並列に実行する。MPPなどが該当
  • MPP(Massively Parallel Processor):
    • 安いマイクロプロセッサを並列につないで、ベクトル型スーパコンピュータ並みの演算能力を持たせた超並列コンピュータ
  • スーパコンピュータの2つの型
    • ベクトル型:
      • アレイプロセッサ(ベクトルプロセッサ)を載せたもの
    • スカラ型:
      • マイクロプロセッサを多数並列につないだもの
  • ベクトルプロセッサ:
    • 配列の中の複数のデータを同時に演算できるベクトル演算機能を持つプロセッサ

マルチプロセッサ:CPUを増やす

  • マルチプロセッサ方式:
    • 複数のプロセッサ(CPU)を並列に動かして処理能力を上げる方式
  • 結合方式による分類:
    • 主記憶を共有するかどうかで、密結合型と疎結合型に分ける
  • 密結合マルチプロセッサ:
    • 複数のプロセッサが主記憶を共有し、単一のOSで制御する。複数のCPUが共通バスで1つの主記憶につながる
    • 各タスクはどのプロセッサでも実行でき、負荷分散で処理能力が上がる。タスク間で同期をとる機能(OS)が必要
    • 同じ主記憶を使うので、プロセッサが増えると競合が起きやすい
  • 共通バス:
    • CPUと周辺デバイスを汎用的に結ぶ通信路。競合する可能性があるので、専用のものよりスループットが落ちる傾向がある
  • 疎結合マルチプロセッサ:
    • 各プロセッサが自分専用の主記憶を持つ。プロセッサどうしは通信リンクでつながる
    • 独立性が高いので競合が起きにくく、プロセッサの数を増やせるが、プロセッサごとにOSが必要で構成が複雑になる
  • 通信リンク:
    • 論理的な通信路、または通信が確保されている状態
  • 対称性による分類
    • SMP(Symmetric Multi Processing:対称型マルチプロセッシング):
      • すべてのプロセッサを同等に扱う
    • AMP(Asymmetric Multi Processing:非対称型マルチプロセッシング):
      • プロセッサごとに役割が決められている
  • アムダールの法則(★計算問題):
    • 「並列化できない部分がある場合、高速化率は並列化できる部分の割合で決まり、プロセッサをいくら増やしてもある値以上には速くならない」
    • 依存関係があって同時に実行できない命令があるので、プロセッサ数と性能は比例しない
    • 式:
      • E = 1 ÷ {(1 − r) + r ÷ n}
      • E:高速化率(1台のときの何倍か)、n:プロセッサ台数(1≦n)、r:並列化できる部分の割合(0≦r≦1)
    • 式の意味:
      • 1台での処理時間を1とすると、並列化後の時間は「並列化できない部分(1−r)」+「並列化できる部分r を n台で分けた r/n」。その逆数が高速化率
    • 例(n=8):
      • r=0.5 → 1÷(0.5+0.0625)=1÷0.5625 ≒ 1.78倍
      • r=0.75 → 1÷(0.25+0.09375)=1÷0.34375 ≒ 2.91倍(8台でも8倍にはならない)
    • 台数を増やす(r=0.75):
      • n=16 → 1÷(0.25+0.046875) ≒ 3.37倍
      • n=64 → 1÷(0.25+0.0117) ≒ 3.82倍
    • 上限:
      • nを大きくするとr/nが0に近づくので、Eは 1÷(1−r) に近づく。r=0.75なら最大4倍、r=0.5なら最大2倍
    • 例題:
      • r=0.8、n=4 → 1÷(0.2+0.2)=2.5倍。どれだけ増やしても最大1÷0.2=5倍

プロセッサの性能:速さを測る

  • クロック(Clock):
    • コンピュータの中の動作のタイミングをとるための、一定の周波数の信号(クロック信号、クロックパルス)、またはそれを出す装置
  • クロック周波数:
    • クロック信号の速さ。1秒間に出るクロック信号の数。単位はMHz(10⁶)、GHz(10⁹)
    • CPUの各ステージはクロック信号に合わせて進むので、周波数が高いほど速い
  • 内部クロック:
    • CPUのクロック周波数
  • 外部クロック:
    • 周辺回路のクロック周波数。FSB、バスクロックともいう
  • クロックサイクル時間:
    • 1クロックにかかる時間。クロック周期ともいう。クロック周波数の逆数
  • 命令によって必要なクロック数(CPI)が違うので、命令実行時間はクロックサイクル時間とCPIで求める
  • 命令実行時間(★計算問題)=
    • クロックサイクル時間 × CPI = クロック周波数の逆数 × CPI
    • 例:
      • 500MHzのCPUで、3クロックかかる命令 → クロックサイクル時間=1÷(500×10⁶)=2ナノ秒 → 2×3=6ナノ秒
    • 例題:
      • 2GHzのCPUで、CPI=4の命令 → クロックサイクル時間=1÷(2×10⁹)=0.5ナノ秒 → 0.5×4=2ナノ秒
  • CPUの性能評価に使うMIPS、FLOPSは、システムの性能評価のところで扱う
  • システム全体の性能:
    • メモリ、ハードディスク、ネットワークなどの性能も加わって決まる。CPUだけ速くしても、システム全体はそれに比例して速くならない
  • SI単位系の接頭語:
    • 10⁻³=ミリ、10⁻⁶=マイクロ、10⁻⁹=ナノ

クロックの逓倍と分周

  • ワンチップマイコンの内部クロック発生器の例
    • 10MHzの発振器 → PLL1(6逓倍)で 10×6=60MHz → PLL2(4逓倍)で 60×4=240MHzをCPUへ
    • 60MHzを分周器で2⁹分の1にして、シリアル通信に約115.2kHzを供給したい(シリアル通信のクロック精度は±5%に収まればよいとする)
  • PLL(Phase Locked Loop:位相同期回路):
    • 入力クロック周波数のN倍の周波数を作る回路。6逓倍なら6倍、4逓倍なら4倍(逓倍=ていばい)
  • 分周器:
    • 入力クロック周波数を1/Nに下げる回路
  • 検算:
    • 60MHz ÷ 512 ≒ 117.2kHz。115.2kHzとの差は約1.7%なので、±5%に収まる

混同しやすいペア

  • パイプライン(1本を流れ作業に)/スーパパイプライン(さらに細かく分ける)/スーパスカラ(パイプラインを複数並べる)
  • スーパスカラ(実行時にハードウェアが同時実行を決める)/VLIW(コンパイル時に複合命令にまとめる。NOPで埋める)
  • 制御ハザード(分岐で先読みが無駄になる)/データハザード(データの依存で待たされる)/構造ハザード(ハードウェア資源の競合)
  • 投機実行(分岐先を予測して先に実行)/遅延分岐(分岐の前の命令を後ろに移す)
  • アウトオブオーダ(順番に関係なく実行)/インオーダ(順番を守る)
  • SIMD(同じ命令を複数データに。GPU、アレイプロセッサ)/MIMD(違う命令を違うデータに。MPP)
  • 密結合(主記憶を共有、OSは1つ、競合しやすい)/疎結合(主記憶は専用、OSはプロセッサごと、増やしやすい)
  • SMP(対称型、全プロセッサが同等)/AMP(非対称型、役割分担)
  • 内部クロック(CPU)/外部クロック(周辺回路。FSB、バスクロック)
  • PLL(周波数をN倍に)/分周器(周波数を1/Nに)
  • CPIを1より小さくできるのはスーパスカラとVLIW(通常のパイプラインはできない)

← 03 コンピュータ構成要素・ハードウェアの目次に戻る

タイトルとURLをコピーしました