変更要約: 初版
2.1プロセッサと並列処理
FE/SGで学ぶ命令実行サイクルを踏まえ、パイプラインハザードの3分類(構造/データ/制御)と対処法、複数の命令を同時に発行するスーパースカラ、実行順序を入れ替えるアウトオブオーダー実行を学びます。さらにマルチコア・GPUによる並列処理の分類(SIMD/MIMD)、そしてパイプライン処理時間・MIPS・CPIの計算を扱います。
基本情報技術者レベルでは「パイプライン処理は各段階を並行実行して高速化する」という原則を押さえれば十分ですが、応用情報技術者ではさらに一歩踏み込み、ハザードがなぜ起こるのかを種類ごとに識別し、それを緩和する現代的なプロセッサ設計(スーパースカラ・アウトオブオーダー実行)まで理解する必要があります。また、性能を定量的に語るための計算(実行時間・MIPS・CPI)を正確にこなせることが、実務でも試験でも問われます。
2.1.1パイプラインハザードの3分類
| 分類 | 原因 | 代表的な対処 |
|---|---|---|
| 構造ハザード | 複数の命令が同じ回路資源(演算器やメモリポート)を同時に使おうとして競合する | 資源を複製する(回路を増設する) |
| データハザード | 後続の命令が、まだ結果が確定していない先行命令の値に依存する | 演算結果を先送りする==フォワーディング==、必要なら実行を一時停止 |
| 制御ハザード | 分岐命令の行き先が確定するまで、次にフェッチすべき命令が分からない | ==分岐予測==によって先読みし、外れた場合はパイプラインを破棄してやり直す |
- パイプラインハザードはFE/SGでは一括りに扱いますが、応用情報では構造ハザード(資源競合)・データハザード(値の依存関係)・制御ハザード(分岐の行き先未確定)の3種類に分けて原因と対処法を識別できることが求められます。データハザードは、先行命令の演算結果をレジスタへ書き戻す前に後続命令へ直接渡すフォワーディング(バイパス)で多くが緩和できます。
- 制御ハザードへの主な対策が分岐予測で、分岐が成立するかどうかを過去の実行履歴等から予測し、予測に従って先に命令をフェッチしておきます。予測が外れた場合は、先読みしていた命令を破棄してパイプラインをやり直す必要があり、その分だけペナルティ(無駄になった時間)が発生します。分岐予測の的中率が高いほど、制御ハザードによる性能低下は小さくなります。
2.1.2スーパースカラとアウトオブオーダー実行
- スーパースカラ=1つのクロックサイクルで複数の命令を同時に発行・実行できるように、演算器やパイプラインの実行系統を複数用意したプロセッサ設計。単純に段階を重ねるだけのパイプラインに対し、幅(同時に処理できる命令数)を広げることでさらなる高速化を図ります。
- アウトオブオーダー実行=プログラム上の記述順序ではなく、依存関係が満たされた命令から先に実行する方式。ある命令がデータハザードで実行を待たされている間、後続の(依存関係のない)命令を先に処理することで、パイプラインの遊びを減らします。実行結果は最終的にプログラム順に整合するよう調整(インオーダーでの完了・コミット)されます。
「パイプラインハザードは構造/データ/制御の3種類」「データハザードはフォワーディングで緩和」「制御ハザードは分岐予測で緩和し外れるとペナルティ」「スーパースカラ=1サイクルで複数命令を同時発行」「アウトオブオーダー実行=依存関係が満たされた命令から実行」が最頻出です。MIPS=クロック周波数(MHz)÷CPI、パイプライン処理時間=(段数+命令数−1)×1サイクル時間の計算パターンも頻出です。
パイプライン処理時間の計算を実際に検算してみましょう。5段のパイプライン(フェッチ/デコード/実行/メモリアクセス/ストア)を持つプロセッサで、1サイクル=1ナノ秒、ハザードが一切発生しない条件で100命令を連続実行する場合を考えます。パイプラインが満杯になるまでの最初の1命令に5サイクルかかった後は、以降1命令ごとに1サイクルずつ完了していくため、全体の所要サイクル数は(段数+命令数−1)=(5+100−1)=104サイクル、時間にして104×1ナノ秒=104ナノ秒です。これは、もしパイプライン化せず1命令ずつ5サイクルかけて逐次処理した場合の100×5=500サイクルと比べて、大幅な短縮です。ただし実際には分岐命令によるパイプラインハザードが発生するため、この理想値どおりにはなりません。次にCPI(Cycles Per Instruction、1命令あたりの平均クロックサイクル数)とMIPSの関係を確認します。あるCPUのクロック周波数が800MHz、平均CPIが4サイクルだとすると、1秒間に実行できる命令数は800×10^6÷4=200×10^6命令、すなわちMIPS=クロック周波数(MHz)÷CPI=800÷4=200MIPSとなります。もしパイプライン化やスーパースカラ化によってCPIを4から2へ半減できれば、クロック周波数を変えなくてもMIPSは800÷2=400MIPSへ倍増します。この関係から、クロック周波数の向上と同じくらい、CPIの削減(ハザードの緩和・命令の並列発行)が実効性能の向上に効くことが分かります。
2.1.3並列処理の分類とマルチコア/GPU
| 分類(フリンの分類) | 意味 | 代表例 |
|---|---|---|
| SISD | 単一の命令で単一のデータを処理(並列でない従来型) | 単純な1コアCPU |
| SIMD | 単一の命令で複数のデータへ同じ演算を同時に適用 | GPU、ベクトル演算命令 |
| MIMD | 複数の命令列が複数のデータに対しそれぞれ独立に処理を行う | マルチコアCPU |
- 並列処理は命令の流れとデータの流れがそれぞれ単一か複数かで分類(フリンの分類)できます。SIMD(Single Instruction Multiple Data)は同じ演算を大量のデータへ一斉に適用する方式でGPUに代表され、MIMD(Multiple Instruction Multiple Data)は独立した処理単位(コア)がそれぞれ別の命令列を実行する方式でマルチコアCPUに代表されます。
- マルチコアCPUで性能を引き出すには、処理が複数コアへ分割できる(並列化されている)ことが前提です。並列化の理論的な限界を表すのがアムダールの法則で、プログラム全体のうち並列化できない部分(逐次実行が必須の部分)の割合が大きいほど、コア数をいくら増やしても得られる高速化には頭打ちが生じます。
ひっかけ: 「アウトオブオーダー実行は命令の実行結果もプログラム順を無視して確定する」は誤りです。実行の順序は入れ替わっても、結果の完了(コミット)はプログラム順に整合するよう調整されます。また「コア数を2倍にすれば処理速度も必ず2倍になる」も誤り=アムダールの法則により、逐次実行が必須の部分が残る限り高速化には上限があります。「SIMDはMIMDより常に高性能である」も誤り=SIMDは同種データへの一様な演算に強い一方、MIMDは異なる処理を独立に行う汎用性で優るという得意分野の違いです。
2.1.4この節のまとめ
- パイプラインハザード=構造/データ/制御の3種。データハザードはフォワーディング、制御ハザードは分岐予測(外れるとペナルティ)で緩和
- スーパースカラ=1サイクルで複数命令発行・アウトオブオーダー実行=依存関係充足順に実行(完了はプログラム順に整合)
- MIPS=クロック周波数(MHz)÷CPI。並列処理はSIMD(GPU)/MIMD(マルチコア)に分類・並列化率の限界はアムダールの法則
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. あるCPUのクロック周波数が900MHz、平均CPIが3サイクルである。このCPUのMIPS値はどれか。
Q2. ある命令が、直前の命令の演算結果をレジスタへの書き戻し前に必要としたため実行が遅延した。この状況に該当するハザードと、その代表的な緩和策の組合せとして最も適切なものはどれか。
Q3. 大量の画像データの各ピクセルに同一のフィルタ演算を同時に適用する処理と最も相性がよい並列処理の分類はどれか。

