第 2 章 C言語実装を用いたインタプリタ方式の命令エミュレータ性能
2.3. インタプリタ方式のエミュレータ実装事例に基づく性能解析
2.3.4. sim-safe の速度性能の解析
本節では,sim-safeとsim-MIPSlikeの速度性能の解析を行う.
性能の指標としてレガシー命令 1 個を実行するホストの平均クロック数を CPI(Clock
cycles Per Instruction)として用いる.CPIの数値が小さいほど速度性能は高い.まず,
2.3.4.1ではsim-safeのI-LOOP性能を測定し,理想的なアセンブリ言語実装コードと比較
する.2.3.4.2ではSPEC CINT/CFP95の速度性能の結果より評価プログラムによらずCPI
値が同様になることを示す.次に2.3.4.3では,C言語実装によって発生したsim-safeのオー バヘッドを解析する.
2.3.4.1. sim-safeのI-LOOP性能
sim-safeをMPC7450とSparcIIIi用にコンパイルし,I-LOOP実行時間とプロセッサ周 波数より,それぞれの命令のCPIを測定した.この結果を表6と表7の“Measured CPI”
として示した.I-LOOPで繰返し実行する命令には,次の4つを選んだ.
・ NOP: コアループの速度性能を示す
・ ADDU: オペランドが3個ありオペランドデコードが多い
・ LW: メモリアドレスの計算からメモリロードが遅延要因となる
・ BEQ: 分岐判定とプログラムカウンタ値を使った計算が特徴的である
ホスト MPC7450 用には,レジスタ割付とパイプライン最適化を施した理想的なインタ
プリタをアセンブリ言語で作成し,I-LOOPにより実測したCPI (Ideal CPI)と,sim-safe の実測結果を比較した.SparcIIIiではパイプライン詳細動作が不明なため,コンパイラ生 成のアセンブリ言語ソースから求めた命令数 (Actual)を机上作成した理想命令数(Ideal)
と比較した.結果として,sim-safe の速度性能は,理想コードに対してSparcIIIiでは 39
~57%,MPC7450 では 40~47%の速度性能であり,理想コードとの差が大きいことが分 かる.
表6 MPC7450のsim-safeエミュレーション性能 Instruction Measured CPI Ideal CPI Ideal / Measured
NOP 33.3 15 45%
ADDU 40.0 17 42%
LW 40.8 19 47%
BEQ(taken) 45.2 18 40%
表7 SparcIIIiのsim-safeエミュレーション性能 Instruction steps Instruction
Measured
CPI Actual Ideal Ideal/Actual
NOP 36.9 31 (28+3) 12 39%
ADDU 40.9 43 (28+15) 23 (12+11) 53%
LW 37.2 45 (28+17) 23 (12+11) 51%
BEQ(taken) 40.1 47 (28+19) 26 (12+14) 57%
2.3.4.2. sim-safeのSPEC CINT/CFP95の速度性能
次にSPEC CPU95を用いて平均CPIを測定した.結果を図14に示す.132.ijpeg,110.appl,
141.apsiを除いた10本の結果では,これらの平均に対しCPIの増減はSparcIIIiで9%,
MPC7450で10%以内の範囲に収まっている.132.ijpeg,110.applと141.apsiのCPIが他 より大きいのは,乗算命令が(mult)がそれぞれ 1.3%,0.7%,3.8%の出現頻度ながら 1 命令の実行にSparcIIIiで1404サイクル,MPC7450で776サイクル掛かっているためで ある.これらは,乗算命令の実装変更により改善できる.
図15に命令種別毎の頻度を示す.頻度はロード(load),ストア(store) ,分岐(branch),
整数演算と論理演算(int / log)を行う基本命令,乗除算(mpy / div),浮動小数演算(float), その他(others)に分類してある.棒グラフでは,この順に下から積上げて表示している.
その他は,LWL/LWR/SWL/SWR/SQRT/SYSCALLなどレガシーISA固有のものを示す.
折れ線により基本命令の合計(basic)を示しているが,CINTでは132.ijpegの98.6%を除
き99.4%以上となっている.この結果よりload~int / logまでの単純な命令の比率が高く,
またそれらが ISA固有の複雑な命令に変わる頻度も小さいことから,評価プログラムの違 いによらずインタプリタは同様なCPI値を示すといえる.
図16に,異なるレガシーISA間での命令種の比率を099.goで測定した結果を示す.この
図からも,基本命令の比率は同様に高く,ISA 固有の複雑な命令の影響は無視できるとい える.これよりレガシーISA 及び評価プログラムに依存せずにインタプリタは同様な CPI 値を示すと考えられる.なお,他の ISAの評価結果はここでは示さず,提案方式の評価結 果と併せて4.6の表12(57ページ)と図23(57ページ)に示す.
0 10 20 30 40 50 60 70 80
CPI
sparcIIIi 41.4 42.2 43.9 41.5 41.5 52.2 43.2 41.4 42.5 49.5 75.2 47.0 47.0 MPC7450 38.3 38.7 42.4 38.3 37.7 46.2 39.7 38.9 41.6 45.4 65.0 43.8 44.3 CoreDuo 31.1 29.3 30.8 26.0 27.0 31.7 29.9 29.6 25.9 29.1 36.0 32.6 27.5 099 124 126 129 130 132 134 147 102 110 141 145 146
図14 sim-safe のSPEC 95エミュレーション性能
0%
20%
40%
60%
80%
100%
099 124 126 129 130 132 134 147 102 110 141 145 146
load store branch int/log
mpy/div float others basic
図15 SPEC 95の命令種別毎の頻度(PISA)
100.0% 99.1% 99.9% 99.9%
0%
20%
40%
60%
80%
100%
PISA/MIPSlike PowePC SH4 M32R
load store branch int/log
mpy/div float others basic
load int/log
branch
sto re
図16 複数ISAの命令種別毎の頻度(go 30, 11)
2.3.4.3. sim-safeのオーバヘッド
sim-safe の速度性能の解析にあたり,評価プログラムへの依存性が低いことを2.3.4.2で
確認できたため,オーバヘッドの分析は命令個々に行うことにした.コンパイラの最適化
コードがPowerPCより優れていたSparcの機械語コードを分析し,各命令ごとにコアルー
プ部と命令固有の処理部分のオーバヘッドを別々に分析した.オーバヘッドは,
オーバヘッド率 =(実行したホスト命令数―理想のホスト命令数)/ 理想のホスト命令数 の式で表現する.コアループの“理想のホスト命令数”は表7(38ページ)の4列目の括弧 内に示した値12個であり,コアループの“実行したホスト命令数”は表7の3列目の括弧 内左に示した値28個である.これらの値を式に代入して求めた(28 ― 12)/12 = 1.33 がコアループのオーバヘッドとなる.ADDU命令は理想のホスト命令数の23個に対して実 際は43個掛っている.これの命令固有部では,理想のホスト命令数は4列目の括弧内右側 の数値11個で,実行したホスト命令数は3列目の括弧内右側の数値15個から,
(15―11)/11=0.36 がオーバヘッド率となる.各レガシー命令を構成しているホスト
Sparc の命令をロード(LD),ストア(ST),分岐(B),その他(Others)の“ホスト命
令種別”に分類して,オーバヘッド率をグラフにした結果を図17に示す.このグラフでは,
共通処理となるコアループ部と命令固有の処理部を分けて表記している.コアループは 2.33 倍の時間が掛かりオーバヘッド率は 1.33(133%)のオーバヘッドとなり,その 50%
相当分がロード命令(LD)である.ADDUの固有部の合計(36%)の半分もロード命令で ある.ホスト命令種別でもロード命令が約 20%ほどと大きく,パイプラインを考慮すると クロックサイクルに占める割合はそれ以上に大きいと考えられる.コアループと命令固有 部ではコアループの改善が効果的であることが分かる.ロード処理(LD)が多い主な原因 は下記の3点である.
・ 各種アドレス値(間接分岐のアドレス表の開始ポインタ,memoryp,regsのアドレス
など)を必要分ホストのレジスタに持つことができない.
・ 値が変化するプログラムカウンタ(reg_PC, reg_NPC),命令数計数(sim_num_insn) の最新値のコピーをレジスタ上に残す最適化をしていない.
・ 次の命令処理向けにエミュレータ変数(hi,lo)を先読みするように最適化されてい
るが,実際にはそれらの使用頻度が低いため逆効果となっている.
また other には,ポインタ値を新たにレジスタに設定するときの定数生成の処理もレガ
シー命令1個当たり2~3回含まれている.例外判定などを含む命令間でのコードの共通動 作をコンパイラが併合し,そのための分岐も余分に発生している.PowerPCでは,このよ うなコードをコンパイラが生成する傾向は更に拡大してレガシー命令処理間の併合処理の 分岐が 2 個に増える命令もあり,更に低速化している.なお,ソースコードのわずかな違 いにより,このようなオーバヘッドの現れ方が大きく変わる.これらのオーバヘッドを削 減する改良が必要となる.
0%
20%
40%
60%
80%
100%
120%
140%
CoreLoop ADDU
ADDIU BEQ(tkn)
BEQ(inline) JR JAL LW SW Others
B ST LD
図17 オーバヘッドとなっている命令数の割合