【前へ】

第3章 ハイエンドコンピューティング研究開発の動向

3.2.3 高性能プロセッサの高速シミュレータ

中島 浩 委員

1. はじめに
 高性能プロセッサをはじめとする高性能システムの研究・開発に、シミュレータが不可欠のツールであることはいうまでもない。本稿の著者は平成12年度の報告書[1]において、高性能システムのシミュレーション技術の動向を概観し、その中でプロセッサの複雑化への対応が重要な課題であることを示した。すなわち、スーパスカラーなど複雑化した命令実行機構を忠実にシミュレーションすると、実機との実行時間比であるslowdown (SD) が5,000〜10,000という非常に大きな値となり、アーキテクチャの迅速な評価に支障をもたらしていることを指摘した。
 また[1]では、この性能上の問題を解決するアプローチとして、シミュレーションの精度を一定の範囲で犠牲にしたうえで、処理を簡略化することによって高速化する手法をいくつか紹介した。これらはいずれも精度と性能がトレードオフの関係にあり、たとえばRice大学のDirecRSIM[2]は誤差が1~2%と小さいがSDは1000以上と大きく、FastILP[3]はSDが100程度と高速であるが誤差が10%と大きい。
 一方、最近になって精度をまったく落とさないcycle accurateなシミュレーションを、計算再利用の技術を用いて高速化する研究が注目されている。その一つがWisconsin大学のグループが開発しているFastSim[4,5,6]であり、また著者らが開発中のTurboScalar(仮称)[7]も同様のアプローチを採用している。本稿ではこれら二つのシミュレータを概観し、計算再利用技術がシミュレーションの高速化に有用であることを示す。

2. 高性能プロセッサのアーキテクチャシミュレーションの課題
 アーキテクチャレベルあるいは命令レベルのシミュレータは古くから研究されており、命令の動作だけをシミュレートするものであれば10〜100という非常に小さなSDを達成しているものが数多く知られている。また単一パイプラインなど、命令実行に要するサイクル数が比較的単純に定まるものについては、キャッシュやMMUを含めたシミュレータであっても同程度のSDが達成されている[1,8]。
 一方、スーパスカラーのように命令実行機構が複雑である場合、ある命令の実行完了に要するサイクル数は他の多くの命令の動作に依存するため、ワークロードの実行サイクルを精密にシミュレートするcycle accurateなシミュレーションには、大きな計算量を要する。すなわち、命令パイプラインの各ステージなどのハードウェア機構の動作を詳細にシミュレートする必要があり、必然的にSDが大きな値となってしまう。
 たとえば代表的なスーパスカラーシミュレータであるSimpleScalar[9]は、分岐予測を含む命令フェッチ、renaming registerを含む命令発行機構、ロード・ストアバッファ、キャッシュ、TLBを含むメモリアクセス機構、複数サイクルの遅延を持つ演算機構、リオーダバッファなど、命令実行のための種々のハードウェア機構の動作を忠実にシミュレートすることができる。またこれらの機構の構成パラメータを自由に設定できるほか、研究者・設計者が独自の機構をC言語でコーディングすることもできる。このようにSimpleScalarはマイクロアーキテクチャを柔軟かつ詳細に記述できるという優れた特徴を持っているが、1サイクルのシミュレーションに多くの機構の処理が含まれるため、SDが5,000〜10,000という大きな値となってしまう。
 このほか、SimOS [10]の動的スケジューリングモードやRSIM[11]など、命令の動的スケジューリングを精密にシミュレートするシミュレータのSDは、いずれも5,000〜10,000という大きな値である。

3. 命令スケジューリング計算における計算再利用
 
前節で述べたように、スーパスカラーなど高度で複雑な命令実行機構を持つプロセッサのシミュレータには、ハードウェア機構の動作、特に命令スケジューリングの処理に大きな計算量が必要なため、命令動作のシミュレーションの100倍もの時間を要するという問題がある。一方、プログラムや命令の実行過程には繰り返しによる時間的局所性があり、キャッシュや分岐予測機構など局所性を利用した機構が数多く知られている。
 計算再利用の技術もその一つであり、ある計算の入力が過去の同じ計算の入力に一致すれば、計算を省略して過去の計算結果を出力することにより、計算を高速化する手法である。たとえば関数の入力引数と関数内で参照する状態変数の値を記憶しておき、同じ関数が再び起動された場合に入力引数・状態変数の値が一致すれば、やはり記憶しておいた関数の返値、出力引数の値および状態変数の更新値を用いて、計算を省略して関数を実行する手法などが知られている[12]。
 この手法は、再利用可能な場合には計算を大幅に高速化できるが、再利用ができない場合には入力値の比較と入出力値の保存というオーバヘッドを伴う投機的なものであるため、その有効性は再利用可否の確率とそれを左右する比較・保存対象の選択に強く依存する。すなわち多数の入出力値を保存しておけば再利用確率は高くできるが、保存や比較のオーバヘッドは必然的に大きな値となり、結果的に性能が向上しない(あるいは低下する)ことが十分に考えられる。したがって再利用されやすいもの、すなわち関数の例では実行頻度が高い関数の出現頻度が高い入力値を選択的に保存し、比較・保存のオーバヘッドを極力小さくしつつ再利用確率を高く保つことが重要である。
 さて前述のように命令の実行過程には時間的局所性があるため、シミュレータにおける命令スケジューリング計算に計算再利用技術を適用するのは妥当なアプローチであると考えられる。すなわちループを形成する命令列の実行過程において、命令スケジューリングの結果が一つあるいは少数のパターンとなることは十分予想される。したがって入力である命令列と命令実行機構の状態と、出力であるスケジューリング結果を保存しておけば、同一の命令列・状態に対してスケジューリング計算を完全に省略することができる。
 たとえば図1に示す簡単なループを、2命令同時実行の仮想的なスーパスカラーで実行したときの命令パイプラインの状態が、図2の(a)と(b)を繰り返すものとする。すなわちループが一定回数回転すると、パイプラインにはi-1回目のBNEZとi回目のLW、およびi回目のADDとSUBが、それぞれペアとなって実行される状態が継続するものとする。このとき入力命令列として同じものが供給される限り、すなわちループが継続しかつLWがキャッシュヒットする限り、スケジューリング計算の結果は(a)から(b)あるいは(b)から(a)への遷移となる。したがって、この二つの状態とその間の遷移をもたらす命令列を保存・比較すれば、スケジューリング計算を完全に省略することができる。

 

【次へ】