第6回 プロセッサの高性能化
本日の講義内容
- プロセッサの高性能化
- SRAM
- オープンなVLSI設計環境
プロセッサの高性能化
パイプライン化
汎用プロセッサの主要な高性能化手法について見ていきましょう。まずは、パイプライン化です。プロセッサの命令処理を複数の工程に分割し、それぞれを並列動作させるのでした。シングルサイクル動作と比較すると、より短い各工程への分割によって動作周波数の向上が見込めます。
また、メモリとして省面積なSRAMマクロを用いる場合について考えると、これは一般に書き込み・読み出しのそれぞれがクロック同期となります。したがって、そもそも複数クロックサイクル動作を前提としないと多くのSRAMマクロを活用できないという事情もあります。これについては後ほどまた触れることにします。
2段パイプラインプロセッサの設計

以前設計したシングルサイクルプロセッサは上のような構成になっていました。
最も簡単なパイプライン構成は、下に示すような位置でコアを分割する2段パイプラインプロセッサです。

こうした構成では、
- ストール: まだ演算結果が得られていなかったり、資源の競合が起こる場合に、パイプラインを停止する
- フラッシュ: 分岐予測のミスなどによって誤った命令を実行してしまった場合に、パイプラインを空にする
は必要なく、データのフォワーディングのみによってハザードを解消することができます。
より具体的には、EXステージにおけるソースレジスタ読み出し時、先行するWBステージで同一レジスタに書き込む値があれば代わりにそれを用いる、ということさえ気を付ければ問題ありません。
先ほど述べた通り、クロック同期式の命令メモリやデータメモリを前提とした場合、コアはシングルサイクルで動作することができません。したがって、こうしたものに近い2段パイプライン構成が実質的な最小構成として商用の組み込み向け汎用プロセッサなどでも採用されています。
演習: 2段パイプラインプロセッサの設計
講義で取り扱ったシングルサイクルプロセッサを改良して、2段パイプラインプロセッサを設計してみましょう。
5段パイプラインプロセッサの設計
続いて、典型的なパイプライン構成である5段パイプラインについて見てみましょう。

こうした構成、かつ分岐予測を実施するなると
- ロード命令時のデータハザードを解決するためのストール
- 分岐予測を失敗した場合の制御ハザードを解決するためのフラッシュ
が必要になります。
まずストールについて見てみましょう。このような構成のプロセッサでロード命令を発行することを考えます。すると、ロードしてきた値が得られるのはMEMステージになります。そのため、直後の命令がそのデータを EXステージで必要とする場合には、1サイクルのストールを行い、依存関係を解消してからパイプラインを再開します。

また、フラッシュについても見てみます。5段パイプラインで、分岐の有無や分岐先アドレスについてはEXステージで計算し、MEMステージのはじめで明らかになる、とすると、分岐予測を失敗した場合には後続する3命令をフラッシュする必要があります。

5段パイプラインにおいては、3段パイプラインと同じようなデータのフォワーディングに加えて、このようなストールやフラッシュをサポートするよう、各パイプラインレジスタを設計する必要があります。
演習: 5段パイプラインプロセッサの設計
講義で取り扱ったシングルサイクルプロセッサを改良して、5段パイプラインプロセッサを設計してみましょう。
パイプライン段数を増やしていくことで動作周波数を向上することができる半面、このようにストールやフラッシュなどによる
- サイクルあたりの実行命令数の低下
- ハザード対策のためのハードウェアオーバーヘッド
といった課題が生じます。
論理合成の結果得られる具体的な値を元に考えてみましょう。上に示した2段パイプラインを基準とした場合、5段パイプラインの最大動作周波数は2.2倍程度になります。しかし、特に工夫しないと典型的なベンチマークプログラムにおける実行命令数は0.5倍程度となってしまいました。
汎用プロセッサ設計の上では、このようなトレードオフがあることを念頭に置きつつ、実行命令数の低下を抑える手法をとることが要求されます。
パイプラインの歴史
1961年のIBM 7030 (Stretch) では既にパイプラインによる性能向上がはかられています ("The Engineering Design of the Stretch Computer," IRE-AIEE-ACM1959.)。また、最初のスーパーコンピュータとも呼ばれるCDC 6600 ("Parallel operation in the control data 6600," AFIPS1964.)、あるいは、同時期のIBM System/360は汎用計算機や計算機アーキテクチャという概念自体の導入、あるいはTomasuloのアルゴリズムに基づくOut-of-Order実行で知られますが、ここでも高度なパイプライン構成が採られています("An Efficient Algorithm for Exploiting Multiple Arithmetic Units," IBM J. Res. Dev1967.)。
一方で、こうした例では複雑な命令セットアーキテクチャを前提としており、パイプライン動作を担保するためのハードウェアオーバヘッドや、それに起因してさらに深いパイプラインが実現できなくなるといった課題がありました。
RISC ISAやそれに基づくVLSI、マイクロプロセッサは、簡素化によってシンプルなパイプライン構成に基づく高速汎用プロセッサを実現するものでした。たとえばその黎明期に"MIPS: A microprocessor architecture," SIGMICRO Newsl.1982.にて、今回示したような典型的な5段パイプライン構成が提示されています。
分岐予測器
分岐予測の基本
先に示したように、パイプラインプロセッサにおいては分岐予測ミスによって生じる命令再実行で性能上大きなペナルティが生じます。また、そのようなペナルティはパイプライン段数が多ければ多いほど大きくなっていきます。
そのため、分岐するか、しないかを予測する機構が重要になります。特に、過去の履歴に基づいてプロセッサ上で予測をおこなう動的分岐予測器が一般に広く用いられています。
bimodal分岐予測器
基本的な動的分岐予測器に、bimodal分岐予測器と呼ばれるものがあります。

ここでは、複数のエントリを持つテーブルが構成されており、それぞれのエントリには2bitの値が格納されています。このテーブルを、Patern history table (PHT) と呼んだりします。分岐予測器としては、PCのアドレスの一部を用いて対応するエントリの中身を見て、そこから分岐する (Taken) か分岐しない (Not taken) かを予測するという動きをします。

さて、各エントリの中身は2bitの飽和カウンタとなっています。いま、読んだエントリの値が11
だとしたら、Taken
と予測します。分岐の最終的な結果がTaken
の場合は、値はそのままとします。一方、実際にはNot taken
だった場合には、値を10
とします。
このような仕組みで、アドレス毎に分岐の傾向をうまく学習して、その結果を元に分岐予測を実施します。
演習: bimodal分岐予測器の設計
bimodal分岐予測器を設計してみましょう。
gshare分岐予測器
こうしたアイディアの延長で、さらに予測精度を向上したものとして、gshareと呼ばれる分岐予測器が知られています。

ここでは、PCに加えて、グローバルな分岐履歴の情報を利用してエントリを選択しています。ここで、グローバルな分岐履歴とは、直近n個の分岐命令が分岐したか、しなかったか、を記録したものです。
こうした構成によって、単にあるアドレスに対応した履歴や傾向だけではなく、プログラム全体での傾向も考慮した分岐予測が実施できます。
演習: gshare分岐予測器の設計
gshare分岐予測器を設計してみましょう。
分岐予測器についても、搭載によって性能が向上する一方で、ハードウェアのオーバーヘッドが生じます。これによって消費電力の増加や、動作周波数の低下、面積の増加を招く恐れがあります。また、PHTの容量を増やせばさらに分岐予測の精度が向上しますが、やはり同様の議論があります。実際にマイクロプロセッサを作っていく上では、こうした点を定量的に評価して、適切なバランスを探っていく必要があります。
より高度な分岐予測器
今回示したものよりもより高度な動的分岐予測器として、TAGE分岐予測器と呼ばれるもの("A New Case for the TAGE Branch Predictor," MICRO2011.)や、パーセプトロンを用いたものなどが知られています。特に先端の汎用プロセッサにおける分岐予測器の開発全般やパーセプトロン分岐予測器について、"Evolution of the Samsung Exynos CPU Microarchitecture," ISCA2020.などが参考になります。
その他の性能改善手法
今回取り上げなかったその他の性能改善手法として、たとえば、以下のようなものがあります。
- 命令発行・実行管理の工夫: スーパースカラ、アウトオブオーダ実行
- メモリ階層の工夫: キャッシュメモリ、プリフェッチ
- 専用演算器の追加: 整数乗除算器、浮動小数点演算器
先端の汎用プロセッサ設計開発においては、こうした性能改善手法を取り入れた複雑なシステムを組み上げた上で、全体最適化に取り組むことで高い性能を実現しています。たとえば、ここで挙げたのは主にマイクロアーキテクチャのレイヤにおける性能改善手法です。これらを単に導入するだけではなく、RTL設計や論理ゲートレベル設計、レイアウトのレイヤもその前提で適切なものになっていなければ (クリティカルパスや、論理ゲートのファンアウト、フロアプランや信号配線設計・電源設計が適切なものになっていなければ)、全体として良いものにはなりません。
このような全体最適化を目指すための定量評価に、本講義で取り扱ったVLSI設計の知識が役立つことと思います。
SRAM
SRAMの基本
SRAMについて思い出してみましょう。SRAMは標準的なVLSIの製造プロセスでチップ上に形成可能で、典型的には次のような回路図の単位セルから成るのでした。

高い密度でのレイアウトを実現するために、各トランジスタのサイズ比や配線設計含めて最適化されます。このような非常に小さなメモリセルがアレイ状に並び、その周辺に読み書き用の回路が配置されることになります。
このような典型的な構成のSRAMマクロセルを、スタンダードセルと組み合わせて利用することで、スタンダードセル内のDFFを用いるよりも省面積にメモリを構成することができます。
マクロセル
SRAMは、マクロセルとして提供される以外に、パラメタライズしたSRAMセルを生成可能なメモリコンパイラというかたちで提供されることもあります。
今回は、オープンなメモリコンパイラであるOpenRAMを利用して生成したマクロセルを見てみましょう。

$ cp /home/resources/sram_32b_32_1rw_freepdk45.gds ${自分の作業ディレクトリ}
$ klayout sram_32b_32_1rw_freepdk45.gds
として、セルのレイアウトを見てみてください。これは32bit、32wordのSRAMマクロセルになります。前回、スタンダードセルの論理合成、配置配線によって作成したレジスタファイルが、32bit、32本のものだったので、メモリ容量で考えると概ね同様のサイズということになります。
演習: スタンダードセルで作ったレジスタファイルとの比較
前回作成したレジスタファイルのレイアウトと見た目や面積を比較してみましょう。
オープンなVLSI設計環境
さて、今回の講義では
- Synopsys Design Compiler
- Cadence Innovus
を用いたVLSI設計フローを学んできました。これらは商用ツールです。
一方で、近年オープンなライセンスのVLSI設計ツールも数多く見られるようになっています。たとえば、mflowgenやOpenLane、OpenROADといったものがあります。
mflowgenはオープンライセンスのVLSI設計ツール群をモジュール式にまとめてパラメタライズして扱えるシステムで、設計空間探索のために優れたものになっています。
また、OpenLaneやOpenROADは今回示したような一連のディジタルVLSI設計フロー全体をオープンなツール群でまかない、ラッピングしたものになります。
OSSの文脈での様々な利点に加えて、パラメタライズや中間ファイルの出力が容易、独自の機械学習手法などと組み合わせることも容易、であることから、今後はこうした設計環境にも注視しておくと良いかもしれません。
本日はここまでです。これにて前半、汎用アーキテクチャ回講義は終了です。レポート課題にぜひ取り組んでみてください。