Next: Up: Previous:

性能評価

 

figure256

figure263

StackThreads では, スレッド生成は単に手続き呼び出しである. ゆえに, オーバヘッドは, ターゲットマシンにおける手続き呼びだし に必要なもの全てであり, それはレジスタの保存とパラメタの 準備に支配されている. ゆえに, 興味深い数字はブロックと 再開のコストである. switch_to_parent が直接 ブロックしたスレッドから呼ばれた場合の, ブロックと再開のコストを分解して表3.3に示す. 数字は Sparc の命令数で与えられている. オーバヘッドは手続きの 局所変数の個数(l), 手続きの入力パラメタ(p), 慣例で定まる callee-save register の数(r)に依存している. ブロックのコストは, 新しいコンテキストを確保するか, この手続きの以前ブロックしたときのコンテキストを再利用 できるかどうかに依存する.

r=14 である Sparc のレジスタ使用慣例, l=16,p=3 である 典型的な手続きでは, ブロックコストは267命令(新しい コンテキストを確保するとき)もしくは178命令(コンテキストを 再利用するとき)であり, 再開の コストは191命令である. 局所変数とパラメタをコピーする ことが, ブロックにおいては総命令数の三分の一を数え, 再開においては半分を数える. 再開については, callee-save register の保存と回復が 総命令数の四分の一を占める. スレッドがブロック, 再開を繰り返す簡単なベンチマークプログラムでは, ブロックと再開のペアに要する時間は, 150MHz HyperSparc 上で 2.31マイクロ秒である. これは Plevyak らによって報告された結果 [37] に匹敵する.

3.2.4 (5)節ですでに議論されているように, 我々の方式は 生きている変数の情報を全く無視しており, 全ての 局所変数とパラメタをコピーしている. この起こりうる 制限要因にもかかわらず, 実際的には それらは大きな問題ではないことをこれらの図は示している. StackThreads において生きている変数の情報を利用することは 多くてもブロックコストの三分の一, 再開コストの 半分を節約するだけである. 実際の影響は詳細に依存するものの, これはスイッチに少々のコストを払っても低 オーバヘッドの生成を好むどんなマルチスレッディング 方式にもあてはまる.

コンテキストスイッチのほとんどすべての命令がライブラリで 共有されていることも指摘しておきたい. ベンチマーク プログラムでは, ブロックのために埋め込まれたコード列は たった9命令であり, すべての他の命令はすべてのコンテキスト スイッチの場所および任意の必要な場合(例えば epilogue の コード列)の間で共有されている.





Mitsubishi Research Institute,Inc.
Mon Feb 24 19:27:36 JST 1997