JP2005063165A - 仮想計算機の高速エミュレータ - Google Patents
仮想計算機の高速エミュレータ Download PDFInfo
- Publication number
- JP2005063165A JP2005063165A JP2003292884A JP2003292884A JP2005063165A JP 2005063165 A JP2005063165 A JP 2005063165A JP 2003292884 A JP2003292884 A JP 2003292884A JP 2003292884 A JP2003292884 A JP 2003292884A JP 2005063165 A JP2005063165 A JP 2005063165A
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- decode
- execution
- cache
- virtual
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
【課題】仮想計算機のプログラムを実行するためのエミュレータを高速化、低容量化する。
【解決手段】エミュレータに、命令フェッチとデコードの処理の結果を保存しておくデコードキャッシュを設ける。命令の最初の実行時に、デコードキャッシュにデコードした結果を保存しておく。次回の実行の際には保存したキャッシュの内容を再利用し、実行を高速化することができる。仮想命令に対応した実行処理を行なう実行処理ルーチン、仮想命令ポインタをキーとして実行処理ルーチンのアドレスと対応させて保持するデコードキャッシュ、仮想命令ポインタに基づいて命令のフェッチ時にデコードキャッシュを調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段を起動して、その処理結果を使用する実行管理手段、実行管理手段から起動され、仮想命令ポインタに基づいて命令をデコードし、結果をデコードキャッシュに登録する命令デコード手段である。
【選択図】図1
【解決手段】エミュレータに、命令フェッチとデコードの処理の結果を保存しておくデコードキャッシュを設ける。命令の最初の実行時に、デコードキャッシュにデコードした結果を保存しておく。次回の実行の際には保存したキャッシュの内容を再利用し、実行を高速化することができる。仮想命令に対応した実行処理を行なう実行処理ルーチン、仮想命令ポインタをキーとして実行処理ルーチンのアドレスと対応させて保持するデコードキャッシュ、仮想命令ポインタに基づいて命令のフェッチ時にデコードキャッシュを調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段を起動して、その処理結果を使用する実行管理手段、実行管理手段から起動され、仮想命令ポインタに基づいて命令をデコードし、結果をデコードキャッシュに登録する命令デコード手段である。
【選択図】図1
Description
本発明は、仮想計算機のプログラムを実行するためのエミュレータを高速化、低容量化する技術に関する。
近年、インターネットの普及により、ネットワークを介してプログラムを実行するシステムが実用となっている。特にJava(登録商標)言語は、携帯電話上でのアプリケーションとしてプログラムを実行させることのできるものとして急速に広まっている。
Java言語は実行させるプラットフォームを撰ばない仮想計算機(Java VM)のプログラム(バイトコード)として配布される。また、マイクロソフト社の.NETフレームワークではアプリケーションはC言語で開発してMSIL(Microsoft Intermediate Language)という中間言語に変換され、CLR(Common Language Runtime)という仮想計算機で実行される。
JavaのバイトコードやMSILのアプリケーション・プログラムは、実行するプラットフォームを撰ばない仮想計算機のプログラムであるため、仮想計算機をシミュレートするエミュレーション技術を使って実行する。一般には仮想計算機の命令を1命令ずつ解釈し実行するソフトウェア(エミュレータ)がアプリケーションを実行する。
また、エミュレーション技術は従来の計算機システムのプロセッサを変更したときに、旧プロセッサ用に作られた旧アプリケーションを動作させることにも使われる。
その他に、エミュレーション技術は新規プロセッサの開発時に性能評価や新規プロセッサのソフトウェア開発(クロス開発)などにも使われる。この時の開発効率を向上にも、新規プロセッサを仮想計算機とみなして実行することで、開発効率を向上させることにも役立つ。
仮想計算機をソフトウェアで実行する手段として、仮想計算機の命令を逐次解釈・実行するインタプリタ方式がある。しかし、この手法では仮想計算機の命令を1つずつ実行するため、処理速度が遅い。インタプリタ方式で実行時間の半分以上を占めるのは、仮想計算機の命令をフェッチしてデコードする処理であり、この処理の高速化が望まれる。
図2にインタプリタにおける命令フェッチとデコードの処理を示す。また、図3にこのとき使用されるデコードテーブルの構成例を示す。
IP(Instruction Pointer)1は仮想計算機のプログラムカウンタであり、仮想計算機の命令を指し示すものであり、実行に伴って更新されていく。
インタプリタは、以下の手順で処理する。
s1:まず命令ポインタ(IP)1の指す仮想計算機の命令(以下、単に命令と記す)3をメモリ2から採取してきて、
s2:命令コード部等によりデコードテーブル41,42のインデックスを計算する。
s2:命令コード部等によりデコードテーブル41,42のインデックスを計算する。
S3:デコードテーブルから各命令に対応する実行処理ルーチンの処理アドレスを得る。デコードテーブルは図3のように多段構成になることが多い。
S4:そのアドレスへ分岐(実行処理へ分岐)する。
S5:そこで各処理を実行し最初に戻る
ということを繰り返し実行することで処理を進める。
ということを繰り返し実行することで処理を進める。
デコードテーブル41,42の内容や実行処理ルーチンは各命令に対応してあらかじめ用意されている。途中IPの更新をする必要があるが、これはこのループのどこかで行われる。一般には各実行処理内で行う。
高速化方法として、JIT(Just-In-Compiler)コンパイラを使う手法がある。JITコンパイラはプログラムを実行する前に、仮想計算機の命令コードを適当な単位ごとに実計算機の命令コード(ネイティブコード)にコンパイルする。これにより、アプリケーションは直接そのマシンのプロセッサで実行できるようになり、高速な実行が可能となる。一連の仮想計算機の命令列がネイティブコードに展開されるため、命令フェッチとデコードのオーバヘッドが無くなる。また実計算機のレジスタを使って無駄なメモリ転送を省くなどの最適化を施すことができ、さらに実行を高速化できる。
一般にJITコンパイラはサブルーチンを単位としてコンパイルを行う。すなわち、あるサブルーチンを実行するときに、サブルーチン全体をコンパイルしてネイティブコードを生成しメモリ上に格納する。その後は生成したネイティブコードを実計算機が直接実行する。そのサブルーチンが頻繁に実行されるようなとき、実計算機のネイティブコードになっており最適化もされているので高速に実行できる。ただし、サブルーチンを最初に実行する時にはコンパイルするためのオーバヘッドがあり、あまり使われないサブルーチンであるとかえって遅くなることもある。
Java JITコンパイラの試作、情報処理学会研究報告96-ARC-120 pp37-42,DEC1996
Java JITコンパイラの試作、情報処理学会研究報告96-ARC-120 pp37-42,DEC1996
JITコンパイラではコンパイルしたコードのサイズは元のコードの10倍以上になることもあり、実用的に無理なことがある。
携帯電話やPDAなどの携帯機器では使用できるメモリが限られており、コンパイルしたコードを全てメモリ上に展開することができない。また、コンパイルの処理に時間がかかることも問題となる。携帯機器でのソフトウェアの実行はゲームなどの対話型のアプリケーションが多く、応答性を高めるためにはコンパイルにあまり時間をかけることはできない。特に携帯機器に搭載されたプロセッサでは、処理能力が比較的低いため、大きなプログラムをコンパイルすると、実行中のプログラムが一瞬止って見えることもある。
また、一度しか実行されないような命令コードの場合、コンパイルする時間のオーバヘッドのため、インタプリタで実行するよりも遅くなることもある。
一方、インタプリタにおいては、他のプロセッサをエミュレーションするような場合、命令フェッチとデコードの処理はかなり複雑になる。前述の図3に命令デコード処理の例を示したように、一般にフェッチした仮想計算機命令の命令を表すビットだけを抜き出し、そこを基準に多段のテーブル検索を行うことになる。この処理にはシフト演算、AND演算、メモリからのロードといった煩雑な処理が必要となる。
その他にインタプリタが遅くなる理由として、命令フェッチ・デコード・実行の処理において色々なテーブルやデータを参照するために、データの局所性を損ない、プロセッサのハードウェアで用意されている命令キャッシュ等を効率的に使えないことがある。
図4に従来の処理のデータの参照の様子を示す。太実線は実行の流れ、点線がデータの参照、細実線はポインタを示す。この図のように一つの仮想計算機命令を実行するのに、仮想計算機のコード1、デコードテーブル40、レジスタテーブル50、定数テーブル60などの多数のデータを参照する。従来のインタプリタではこのような複雑な処理を命令毎に毎回行なわなければならない。
本発明は、インタプリタを基本とし、仮想計算機の命令を実行するエミュレータを高速に動作させることを目的とする。
本発明の基本構成を図1に示す。仮想計算機の命令を解釈・実行するエミュレータに、命令フェッチとデコードの処理の結果を保存しておくデコードキャッシュ3を設ける。命令の最初の実行時に、デコードキャッシュ3にデコードした結果を保存しておく。次回の実行の際には保存したキャッシュの内容を再利用し、命令フェッチとデコードの処理を省略し、実行を高速化することができる。
1.基本構成は、以下のものである。
仮想命令に対応した実行処理を行なう実行処理ルーチン4、
仮想命令ポインタ12をキーとして実行処理ルーチン4のアドレスと対応させて保持するデコードキャッシュ3、
仮想命令ポインタ12に基づいて命令のフェッチ時にデコードキャッシュ3を調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段2を起動して、その処理結果を使用する実行管理手段1、
実行管理手段1から起動され、仮想命令ポインタ12に基づいて命令をフェッチしてデコードし、結果をデコードキャッシュ3に登録する命令デコード手段2。
仮想命令ポインタ12をキーとして実行処理ルーチン4のアドレスと対応させて保持するデコードキャッシュ3、
仮想命令ポインタ12に基づいて命令のフェッチ時にデコードキャッシュ3を調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段2を起動して、その処理結果を使用する実行管理手段1、
実行管理手段1から起動され、仮想命令ポインタ12に基づいて命令をフェッチしてデコードし、結果をデコードキャッシュ3に登録する命令デコード手段2。
デコードキャッシュ3自体はメモリのキャッシュ等と同様の構成をとればよい。
2.さらに、命令デコード手段2は、指定された位置から所定の範囲の複数の命令のフェッチとデコードとを一括して処理し、結果をデコードキャッシュ3に登録する。
命令ブロックのとり方は固定値やサブルーチンの切れ目など任意でよい。これらがよく使われる命令の組み合わせやサブルーチンであれば、次回以後命令のフェッチとデコードが省略でき、高速化される。処理中にアクセスするデータの局所性が増してプロセッサ等に用意された命令キャッシュ、データキャッシュのヒット率が向上し、高速化する。
3.デコードキャッシュ3のエントリアドレスを指定するデコードキャッシュポインタ(DCP)31を設ける。
実行処理ルーチン4には、実行管理手段1へ戻る処理を行なう終端処理ルーチンを設ける。命令デコード手段2は、命令ブロックのデコード結果をデコードキャッシュ3に登録するとき、最後のエントリに終端処理ルーチンを登録し、デコードキャッシュポインタ31に命令ブロックの先頭のエントリを設定する。
実行管理手段1は、デコードキャッシュ3を調べるとき、デコードキャッシュポインタ31を参照して処理を行い、命令のデコード結果がデコードキャッシュ3に存在すれば、終端処理までそれを順次使用する。この間、仮想命令ポインタ12を参照しないで済むので命令フェッチとデコードの処理にデコードキャッシュ3のタグと仮想命令ポインタ12との比較処理が不要になり高速化する。
4.デコードキャッシュ3は仮想命令ポインタ12をキーとして、実行処理ルーチン4のアドレスの他に、オペランドを対応させて保持する構成とし、命令デコード手段2は、デコードキャッシュ3に命令のデコード結果とオペランドとを対にして登録する。
これにより、実行処理においてオペランドの切り出し処理が不要になるので高速化できる。また、処理中にアクセスするデータの局所性が増す。
5.前項において、実行処理中には仮想命令ポインタ12を参照する必要がなくなる。従って、全ての実行処理ルーチン4で仮想命令ポインタ12の更新を行なう必要はない。
実行処理ルーチン4は、仮想命令ポインタ12の更新処理を行なう機能を有する終端処理ルーチンと、仮想命令ポインタ12の更新処理機能を含まないその他の処理ルーチンとに分ける。例えば、登録する命令ブロックが必ず特定の命令(分岐命令、サブルーチン呼び出し、リターン命令など)で終わるようにして、前記の特定の命令においてのみ仮想命令ポインタ12の更新を行う。
または、ある命令ブロックをデコードキャッシュ3に登録した後に(デコードキャッシュの最後に登録したエントリの直後に)、仮想命令ポインタ12の更新をしてインタプリタの先頭アドレスに分岐するアドレスを登録する。
それ以外の命令については、更新処理が不要となり実行が高速化する。
6.項2において、実行処理ルーチン4は、複数の命令を組み合わせた実行マクロ処理ルーチンを含むものとし、命令デコード手段2は、命令のパターンによりマクロ命令であるか否かを判断し、マクロの各命令を一括してデコードキャッシュ3に登録する。
命令のフェッチデコードの処理回数が減り、組み合わせたマクロの実行処理を最適化することでも実行処理を向上させることができる。
7.さらに、エミュレーション実行中の命令の組み合わせ頻度を実行プロファイルとして記録する実行プロファイル採取手段と、実行プロファイルにより所定の頻度以上の組み合わせをマクロとして、実行マクロ処理ルーチンを生成する動的マクロ生成手段とを設ける。
動的にマクロを生成するためにアプリケーションに特化した処理の最適化が可能となり、実行速度が早くなる。
デコードキャッシュを設け、デコード結果を登録することにより、2回目以後は命令のフェッチ・デコード処理がデコードキャッシュの参照のみになるので高速化される。また、インタプリタが命令フェッチ・デコード・実行の処理において参照するデータが、ハードウェアのキャッシュ上にまとめて配置される可能性が高くなり、データの局所性が増すために処理時間を短くできる。
デコードキャッシュを用いることにより、エミュレーション処理における命令フェッチとデコードの処理を軽減し、実行速度、メモリ量、応答性を向上させることができる。
本発明は基本的に逐次処理を行うので、JITコンパイラほどの最大性能は出ないものの、使用メモリが少なく、利用できるメモリの少ない機器においてはアプリケーションの実効性能を引き出すことができる。また、実行時オーバヘッドもJITコンパイラよりも小さくでき応答性を損なうことも少ない。
図1に基本構成図を示す。仮想命令ポインタ(IP:Instruction Pointer)12は仮想計算機のプログラムカウンタで、仮想計算機の命令を指し示すものである。インタプリタ全体の実行の管理を行なう実行管理手段1、命令デコード手段2及び実行処理ルーチン4の基本動作は従来のインタプリタの機能を包含する。命令フェッチとデコード処理において、IP12に基づいて、仮想計算機コード(プログラム)5のコードとデコードテーブル(図省略)を参照する。本発明でも従来のインタプリタの処理は必要であるが、背景技術の項で説明済みであるので、ここでは発明で加えられた事項を中心に記述する。
[デコードキャッシュの構成]
デコードキャッシュ3はIP12をキーとするデータテーブルとして構成すればよい。図5にデコードキャッシュの一構成例を示す。この例はダイレクトマッピング方式を用いたメモリのキャッシュと同様な構成である。IP12の上位何ビットかを取りだし、これをデコードキャッシュ3のテーブルのインデックスとする。このインデックスを元にTagと実行処理アドレスを取り出す。TagがIP12と一致すれば、そのIP12は登録済ということで、実行処理アドレスに分岐する処理を行えばよい。なおデコードキャッシュ3はメモリのキャッシュのセット・アソシアティブ方式と同等の構成を採ることもできる。例えば4ウェイのセット・アソシアティブとし、4枚のデコードキャッシュのテーブルを持ち、4枚のうち一致した実行処理アドレスへ分岐する。
デコードキャッシュ3はIP12をキーとするデータテーブルとして構成すればよい。図5にデコードキャッシュの一構成例を示す。この例はダイレクトマッピング方式を用いたメモリのキャッシュと同様な構成である。IP12の上位何ビットかを取りだし、これをデコードキャッシュ3のテーブルのインデックスとする。このインデックスを元にTagと実行処理アドレスを取り出す。TagがIP12と一致すれば、そのIP12は登録済ということで、実行処理アドレスに分岐する処理を行えばよい。なおデコードキャッシュ3はメモリのキャッシュのセット・アソシアティブ方式と同等の構成を採ることもできる。例えば4ウェイのセット・アソシアティブとし、4枚のデコードキャッシュのテーブルを持ち、4枚のうち一致した実行処理アドレスへ分岐する。
図6のフローにより実施例1の動作を説明する。
s1.命令ポインタ(IP)12からデコードキャッシュ3のインデックスを計算する。
s2.デコードキャッシュ3のTagを取得し、IP12と比較する。
s3.一致しなければ、(デコードキャッシュ3に登録されていなければ)
s4.命令のフェッチ、デコードを行って実行処理ルーチン4との関係を生成する。これは従来のインタプリタ動作と同等である。
s4.命令のフェッチ、デコードを行って実行処理ルーチン4との関係を生成する。これは従来のインタプリタ動作と同等である。
s5.デコードの後に、デコードキャッシュ3にTagと実行処理アドレス(実行処理ルーチン4の対応処理の先頭アドレス)を登録する。
s6.登録した実行アドレスへ分岐する。
s7. s3において一致すれば、すなわち登録済みであれば、デコードキャッシュ3の実行処理アドレスへ分岐する。
仮想計算機の命令のデコードのためには、前述のように複雑な操作が必要であるが、登録済みであれば、デコードキャッシュ3のTagを読んで、比較するだけの単純な処理で実行できる。
実行処理が終わると先頭s1へ戻る。
[ブロック登録]
図7に実施例2による実行手順を示す。実施例1が1命令ずつ実行とデコードキャッシュ3の登録を行っていたのに対して、ここでは予めこれから実行すべき命令をデコードキャッシュ3に複数まとめて登録してから実行処理を行う。これにより、プロセッサに通常備えられている命令キャッシュ等のヒット率を向上させることにもなる。
図7に実施例2による実行手順を示す。実施例1が1命令ずつ実行とデコードキャッシュ3の登録を行っていたのに対して、ここでは予めこれから実行すべき命令をデコードキャッシュ3に複数まとめて登録してから実行処理を行う。これにより、プロセッサに通常備えられている命令キャッシュ等のヒット率を向上させることにもなる。
すなわち、
s3.で一致しなければ、(デコードキャッシュ3に登録されていなければ)、s4.s5.s6まで同じ処理をして、
s8.命令ブロックの終わりか判断し、終わりでなければ
s9.次の命令とデコードキャッシュ3の次のエントリを取り出して、命令のフェッチデコード登録を行なう。
s3.で一致しなければ、(デコードキャッシュ3に登録されていなければ)、s4.s5.s6まで同じ処理をして、
s8.命令ブロックの終わりか判断し、終わりでなければ
s9.次の命令とデコードキャッシュ3の次のエントリを取り出して、命令のフェッチデコード登録を行なう。
s10.命令ブロックの終わりに達すれば最初に登録したデコードキャッシュ3の実行アドレスへ分岐する。
命令ブロックのとり方は、仮想計算機の実行制御が途切れる点(分岐命令、サブルーチン呼び出し、リターン等)を終わりとし、それがなく、長く続くときはデコードキャッシュ3のエントリ数に見合った適宜な数に決定することでよい。
[DCPによる最適化]
実施例2では、デコードキャッシュ3には仮想計算機の命令の実行の順番にエントリが並ぶ。このエントリを指定するデコードキャッシュポインタ(DCP)31を設ける。DCP31を基にしてデコードキャッシュ3のエントリの順番通り引いて、DCP31を更新しながら実行を繰り返すことで仮想計算機のコードをエミュレートすることができる。これにより、デコードキャッシュ3に登録されていれば、DCP31とデコードキャッシュ3のみの参照で済む。これにより参照の局所化が進み、命令キャッシュ等が効果的に使用され、処理速度の向上が期待できる。また命令フェッチ・デコード処理(連続処理)において、デコードキャッシュ3のTagとIP12の比較処理を省略することができるようになり、実行が早くなる。
実施例2では、デコードキャッシュ3には仮想計算機の命令の実行の順番にエントリが並ぶ。このエントリを指定するデコードキャッシュポインタ(DCP)31を設ける。DCP31を基にしてデコードキャッシュ3のエントリの順番通り引いて、DCP31を更新しながら実行を繰り返すことで仮想計算機のコードをエミュレートすることができる。これにより、デコードキャッシュ3に登録されていれば、DCP31とデコードキャッシュ3のみの参照で済む。これにより参照の局所化が進み、命令キャッシュ等が効果的に使用され、処理速度の向上が期待できる。また命令フェッチ・デコード処理(連続処理)において、デコードキャッシュ3のTagとIP12の比較処理を省略することができるようになり、実行が早くなる。
しかし、デコードキャッシュ3に登録したブロックの最後にここまでしか登録されていないということを何らかの方法で示す必要がある(終端処理)。さもなければ全く関係のない命令が実行されるという誤った事態になる。
それを避けるため、デコードキャッシュ3に登録したブロックの最後のエントリの次に、先頭に戻るように開始アドレスを登録しておく(終端処理1)。
図8にこの場合の実行フローを示す。この例では実行処理A、B、Cを実行し(s1〜s9まで図7と同じ)、そのあとS10により最後のエントリの次のエントリに先頭に戻るように登録してあるので、正しく次の処理が行なえる。
仮想計算機の特定の命令(分岐命令など)をブロックの終わりとし、その命令の実行処理の終りには開始アドレスに分岐するように構成する(終端処理2)。
図9にこの場合の実行フローを示す。デコードキャッシュ3に命令ブロックを登録するときに、その最後は上記の特定の命令になるようにする。この図では終端処理N s10がこれに当たる。これにより、この例では実行処理A、B、C、の実行ではDCP31の更新が行なわれるが最後に終端処理s10の命令を実行すると、先頭に戻る。従って1つのブロックが実行された後、デコードキャッシュ3の登録のチェックがなされ、正しく次の処理が行なわれる。
[オペランドフェチの最適化]
実行処理においてIP12の指す仮想計算機の命令からオペランドを抜き出す必要がある。この操作は、命令のデコードと同様に、まずIP12の示す命令を取り出し、その命令から特定のビットを抜き出すという処理である。また定数などは別の定数テーブル60からその値を取り出す操作も必要である。
実行処理においてIP12の指す仮想計算機の命令からオペランドを抜き出す必要がある。この操作は、命令のデコードと同様に、まずIP12の示す命令を取り出し、その命令から特定のビットを抜き出すという処理である。また定数などは別の定数テーブル60からその値を取り出す操作も必要である。
命令デコード時にオペランドも抜きだして、デコードキャッシュ3にデコード結果と対にしてオペランドを格納しておく。これにより実行時に簡単に直接その値を取り出すことができ、処理速度を向上できる。また定数テーブル60のアクセスは不要となる。これによってデータの参照の局所性が増し高速化が期待できる。また実行処理中にIP12の参照が全く必要なくなる。これにより実計算機上でIP12をレジスタに割り付ける必要もなくなり、実計算機上で使えるレジスタが増えるため処理速度の向上が期待できる。
[IP更新処理の最適化]
デコードキャッシュ3にオペランドも格納しておくことにより、実行処理においてIP12の参照が不要になる。IP12の更新を各実行処理の後に行う必要はなくなり、ブロックの最後で一括して行うようにする。すなわち図9において実行処理A,B,C等においてIP更新s7が不要になり、終端処理NでのみIP更新s11を行なう。これによりIP12の更新処理の回数を減らすことができ、処理速度が向上する。
デコードキャッシュ3にオペランドも格納しておくことにより、実行処理においてIP12の参照が不要になる。IP12の更新を各実行処理の後に行う必要はなくなり、ブロックの最後で一括して行うようにする。すなわち図9において実行処理A,B,C等においてIP更新s7が不要になり、終端処理NでのみIP更新s11を行なう。これによりIP12の更新処理の回数を減らすことができ、処理速度が向上する。
[マクロ実行]
仮想計算機のコードのパターンには頻繁に現れる命令の組み合わせがあり、このような頻度が大きい命令の組み合わせの処理をまとめて行う実行マクロルーチンを予め用意しておく。例えば、命令Aと命令Bを組み合わせた実行マクロABを用意した場合、命令Bに関する命令フェッチとデコードの処理が不要になる。このようにして命令フェッチとデコードの処理を少なくすることができ、実行速度を向上させることができる。2命令に限らず3命令以上の命令を組合わせても良い。なおIP12の更新を命令数に合わせて行なう。
仮想計算機のコードのパターンには頻繁に現れる命令の組み合わせがあり、このような頻度が大きい命令の組み合わせの処理をまとめて行う実行マクロルーチンを予め用意しておく。例えば、命令Aと命令Bを組み合わせた実行マクロABを用意した場合、命令Bに関する命令フェッチとデコードの処理が不要になる。このようにして命令フェッチとデコードの処理を少なくすることができ、実行速度を向上させることができる。2命令に限らず3命令以上の命令を組合わせても良い。なおIP12の更新を命令数に合わせて行なう。
また、組み合わせたマクロは処理を最適化することが可能である。例えば定数のロードと加算の2つの処理を組み合わせた場合、従来はレジスタに定数をロードし、レジスタと加算を行うという2つの操作が必要であった。しかし、実計算機が定数の加算命令を持っていればその命令1つで実行可能となる。
実行マクロルーチンのアドレスのデコードキャッシュ3への登録は実施例2のブロック登録において、ブロック内の命令をデコードキャッシュ3へ登録する際に、命令パターンを調べ用意した実行マクロに合致するかどうか調べることで行う。
従来の方法で同様のことを行おうとすると、命令フェッチとデコードの処理を複数の命令に対して行う必要があった。つまり仮想計算機の命令を先読みして複雑なデコード処理を行わなければならない。本実施例では、IP12を参照してデコードテーブル40を引くという単純操作だけで、マクロの実行が可能となる。
[動的なマクロ生成]
本実施例は実行時に実マシンで直接実行する命令を生成してそれを実行するという点で、従来のJITコンパイラの高速化手法に類似している。JITコンパイラがサブルーチンの単位で実行処理を生成するのに対し、本発明では2〜3命令の単位で細かいものを生成することが異なる。最も異なるのは、JITコンパイラが生成した実計算機の命令列は仮想計算機のコードと一対一に対応するのに対し、本手法で生成した実行マクロは一対多に対応することである。アプリケーション中に良く現れる実行命令のパターンに対し、一つの実行マクロが共通に使われることになる。この点で、メモリの消費量をJITよりも遥かに少なくすることができる。
本実施例は実行時に実マシンで直接実行する命令を生成してそれを実行するという点で、従来のJITコンパイラの高速化手法に類似している。JITコンパイラがサブルーチンの単位で実行処理を生成するのに対し、本発明では2〜3命令の単位で細かいものを生成することが異なる。最も異なるのは、JITコンパイラが生成した実計算機の命令列は仮想計算機のコードと一対一に対応するのに対し、本手法で生成した実行マクロは一対多に対応することである。アプリケーション中に良く現れる実行命令のパターンに対し、一つの実行マクロが共通に使われることになる。この点で、メモリの消費量をJITよりも遥かに少なくすることができる。
図10に本実施例の処理フローを示す。
p1.インタプリタのメインループ中に実行プロファイルの採取を行う。実行プロファイルは仮想計算機の命令の組み合わせが現れた回数を記録するものとする。
p2.次に、その命令の組合わせのマクロを生成済か調べ、生成されていない場合は、
p3.命令の組み合わせ頻度によって判断し、所定の条件に合えば実行マクロを新しく生成する。その後はマクロ生成済の処理と同じ処理をする。
p3.命令の組み合わせ頻度によって判断し、所定の条件に合えば実行マクロを新しく生成する。その後はマクロ生成済の処理と同じ処理をする。
命令の組み合わせ頻度が少ない場合は、実施例2の処理、すなわち命令ブロックのフェッチ・デコード処理p10を行う。この場合はデコードキャッシュ3への登録、実行処理へと続く。
p4.頻度条件が合えば、実行マクロを生成する。
p5.命令の組合わせのマクロを生成済の場合は、マクロの実行アドレスをデコードキャッシュ3に登録し、
p6.その実行マクロへ分岐し、実行する。
p6.その実行マクロへ分岐し、実行する。
また、この図では実行プロファイルの取得の処理はインタプリタのメインループ中で毎回行っているが、デコードキャッシュ3にブロックを登録するときに実行プロファイルの採取をするようにしても良い。実行プロファイルは静的(アプリケーション中に現れた頻度)となり、実際に良く実行されるもののプロファイルが採れなくなり若干効率が悪くなるが、実行プロファイルの採取のオーバヘッドを軽減できる。
1 実行管理手段
12 仮想命令ポインタ(IP)
2 命令デコード手段
3 デコードキャッシュ
31 デコードキャッシュポインタ
4 実行処理ルーチン
40 デコードテーブル
50 レジスタテーブル
60 定数テーブル
5 仮想計算機のコード(プログラム)
12 仮想命令ポインタ(IP)
2 命令デコード手段
3 デコードキャッシュ
31 デコードキャッシュポインタ
4 実行処理ルーチン
40 デコードテーブル
50 レジスタテーブル
60 定数テーブル
5 仮想計算機のコード(プログラム)
Claims (5)
- 仮想計算機の命令を解釈・実行するエミュレータであって、
各仮想命令に対応した実行処理を行なう実行処理ルーチンと、
仮想命令ポインタをキーとして実行処理ルーチンのアドレスと対応させて保持するデコードキャッシュと、
仮想命令ポインタに基づいて命令のフェッチ時にデコードキャッシュを調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段を起動して、その処理結果を使用する実行管理手段と、
実行管理手段から起動され、仮想命令ポインタに基づいて命令をフェッチしてデコードし、結果をデコードキャッシュに登録する命令デコード手段と
を有することを特徴とするエミュレータ。 - 請求項1に記載のエミュレータであって、
命令デコード手段は、指定された位置から所定の範囲の複数の命令のフェッチとデコードとを一括して処理し、結果をデコードキャッシュに登録する
ことを特徴とするエミュレータ。 - 請求項2に記載のエミュレータであって、
デコードキャッシュのエントリアドレスを指定するデコードキャッシュポインタを有し、
実行処理ルーチンは、実行管理手段へ戻る処理を行なう終端処理ルーチンを有するものであり、
命令デコード手段は、命令ブロックのデコード結果をデコードキャッシュに登録するとき、最後のエントリに終端処理ルーチンを登録し、デコードキャッシュポインタに命令ブロックの先頭のエントリを設定するものであり、
実行管理手段は、デコードキャッシュを調べるとき、デコードキャッシュポインタを参照して処理を行い、命令のデコード結果がデコードキャッシュに存在すれば、終端処理までそれを順次使用するものである
ことを特徴とするエミュレータ。 - 請求項1ないし請求項3に記載のエミュレータであって、
デコードキャッシュは仮想命令ポインタをキーとして実行処理ルーチンのアドレスと、オペランドとを対応させて保持するものであり、
命令デコード手段は、デコードキャッシュに命令のデコード結果とオペランドとを対にして登録するものである
ことを特徴とするエミュレータ。 - 請求項3に記載のエミュレータであって、
実行処理ルーチンは、仮想命令ポインタの更新処理を行なう機能を有する終端処理ルーチンと、仮想命令ポインタの更新処理機能を含まないその他の処理ルーチンとを含むものであり、
デコードキャッシュは仮想命令ポインタをキーとして実行処理ルーチンのアドレスと、オペランドとを対応させて保持するものであり、
命令デコード手段は、デコードキャッシュに命令のデコード結果とオペランドとを対にして登録するものであり、
実行管理手段は、デコードキャッシュを使用するときは登録されているオペランドを使用するものである
ことを特徴とするエミュレータ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003292884A JP2005063165A (ja) | 2003-08-13 | 2003-08-13 | 仮想計算機の高速エミュレータ |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003292884A JP2005063165A (ja) | 2003-08-13 | 2003-08-13 | 仮想計算機の高速エミュレータ |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2005063165A true JP2005063165A (ja) | 2005-03-10 |
Family
ID=34370059
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003292884A Withdrawn JP2005063165A (ja) | 2003-08-13 | 2003-08-13 | 仮想計算機の高速エミュレータ |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2005063165A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007310546A (ja) * | 2006-05-17 | 2007-11-29 | Nec Computertechno Ltd | エミュレーション方法及びコンピュータシステム |
JPWO2017009996A1 (ja) * | 2015-07-16 | 2017-10-19 | 三菱電機株式会社 | 情報処理装置、情報処理方法及びプログラム |
-
2003
- 2003-08-13 JP JP2003292884A patent/JP2005063165A/ja not_active Withdrawn
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007310546A (ja) * | 2006-05-17 | 2007-11-29 | Nec Computertechno Ltd | エミュレーション方法及びコンピュータシステム |
US8392893B2 (en) | 2006-05-17 | 2013-03-05 | Nec Computertechno, Ltd. | Emulation method and computer system |
JPWO2017009996A1 (ja) * | 2015-07-16 | 2017-10-19 | 三菱電機株式会社 | 情報処理装置、情報処理方法及びプログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3808755B2 (ja) | Jitコンパイラを備えた仮想計算機 | |
US9645795B1 (en) | Accelerated class check | |
US7823140B2 (en) | Java bytecode translation method and Java interpreter performing the same | |
US6965984B2 (en) | Data processing using multiple instruction sets | |
US6122638A (en) | Object-oriented processor and method for caching intermediate data in an object-oriented processor | |
KR101247259B1 (ko) | 가상화 장치 및 그 처리 방법 | |
US6430675B1 (en) | Hardware system for fetching mapped branch target instructions of optimized code placed into a trace memory | |
US20010049818A1 (en) | Partitioned code cache organization to exploit program locallity | |
US20040015896A1 (en) | Program instruction interpretation | |
US7739674B2 (en) | Method and apparatus for selectively optimizing interpreted language code | |
WO2001022213A2 (en) | Optimized bytecode interpreter of virtual machine instructions | |
RU2287178C2 (ru) | Обработка необработанной операции в системах с множеством наборов команд | |
Mong et al. | DynamoSim: a trace-based dynamically compiled instruction set simulator | |
Gregg et al. | Implementing an efficient Java interpreter | |
JP2005063165A (ja) | 仮想計算機の高速エミュレータ | |
JPH0668724B2 (ja) | シミユレーシヨン方法 | |
US9342319B1 (en) | Accelerated class check | |
Brandner et al. | Embedded JIT compilation with CACAO on YARI | |
JP2006164294A (ja) | Jitコンパイラを備えた仮想計算機 | |
KR20040044655A (ko) | 자바 가상머신에서 루프 문 처리를 위해 바이트코드를생성 및 수행하는 방법 | |
JP2006202317A (ja) | Jitコンパイラを備えた仮想計算機 | |
JP2844626B2 (ja) | 情報処理装置 | |
JP2006134351A (ja) | Jitコンパイラを備えた仮想計算機 | |
Davis et al. | A survey of optimisations for the java virtual machine | |
Kim et al. | Accelerating Java Interpretation in Low-Cost Embedded Processors |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Withdrawal of application because of no request for examination |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20061107 |