(57)【特許請求の範囲】
【請求項１】
トランザクションの排他制御を可能にするトランザクショナル・メモリを備えるプログラムの最適化装置であって、
プログラムを解釈し、前記プログラム内の指定された処理を実行するための複数の命令から構成される命令列の前後にトランザクションを開始させる開始命令とトランザクションを終了させる終了命令とを挿入した第１コードを生成する第１コード生成部と、
前記指定された処理に応じて、所定のタイミングで前記複数の命令を用いて第２コードを生成する第２コード生成部と、
トランザクション内で前記第１コードの前記命令列を前記第２コードで上書き、または前記第１コードの一部に前記第２コードを書き込むコード書込部とを備える、プログラムの最適化装置。
【請求項２】
前記指定された処理は、関数呼び出し処理で、前記複数の命令は、引数を設定する命令と、関数を呼び出す命令と、返し値を読み出す命令とを含む、請求項１に記載のプログラムの最適化装置。
【請求項３】
前記所定のタイミングは、前記プログラムの実行中に呼び出した関数を解釈した際である、請求項２に記載のプログラムの最適化装置。
【請求項４】
前記第２コード生成部は、前記呼び出した関数が解釈されたことに応答して、前記命令列内の前記関数を呼び出す命令を、前記呼び出した関数内の値を読み出す命令で置換し、置換した前記値を読み出す命令内のパラメータを変更し、前記命令列内の前記引数を設定する命令および前記返し値を読み出す命令を含む不要な命令群を削除して、最適化した前記第２コードを生成する、請求項３に記載のプログラムの最適化装置。
【請求項５】
前記第２コードのコード・サイズが前記第１コードの前記命令列のコード・サイズ以下であるかを判定するサイズ判定部をさらに含み、
前記命令列のコード・サイズ以下と判定された場合に、前記コード書込部が、前記第１コードの前記命令列に前記第２コードを上書きする、請求項１〜４のいずれか１項に記載のプログラムの最適化装置。
【請求項６】
前記指定された処理は、分岐を伴う処理で、前記複数の命令は、少なくとも１つの分岐命令と、分岐先で実行すべき命令とを含む、請求項１に記載のプログラムの最適化装置。
【請求項７】
前記プログラムを解釈した際に、計測された分岐命令の成立回数および不成立回数から得られる実行頻度を用い、分岐先の実行頻度が閾値より低くなるかどうかを判定する頻度判定部をさらに含み、
前記第２コード生成部は、前記所定のタイミングとして、前記プログラムを解釈した際の前記頻度判定部により分岐先の実行頻度が閾値より低くなると判断されたことに応答して、低くなると判断された前記分岐先の直前の前記分岐命令までの一連の制御フローである、前記第２コードを構成するためのトレースを生成する、請求項６に記載のプログラムの最適化装置。
【請求項８】
前記プログラムの実行中に前記分岐先の命令がアボートした回数が設定値を超えたか否かを判定するアボート判定部と、前記設定値を超えたと判定した場合に、アボートを発生させた命令を含まない前記トレースを、前記第２コード生成部が生成した複数のトレースの中から検索するトレース検索部とを含み、
前記コード書込部が、トランザクション内で前記第１コードの一部に、検索された前記トレースから構成される前記第２コードを書き込む、請求項７に記載のプログラムの最適化装置。
【請求項９】
トランザクションの排他制御を可能にするトランザクショナル・メモリを備えるプログラムの最適化装置により実行される方法であって、
プログラムを解釈し、前記プログラム内の指定された処理を実行するための複数の命令から構成される命令列の前後にトランザクションを開始させる開始命令とトランザクションを終了させる終了命令とを挿入した第１コードを生成するステップと、
前記指定された処理に応じて、所定のタイミングで前記複数の命令を用いて第２コードを生成するステップと、
トランザクション内で前記第１コードの前記命令列を前記第２コードで上書き、または前記第１コードの一部に前記第２コードを書き込むステップとを含む、プログラムの最適化方法。
【請求項１０】
前記指定された処理は、関数呼び出し処理で、前記複数の命令は、引数を設定する命令と、関数を呼び出す命令と、返し値を読み出す命令とを含む、請求項９に記載のプログラムの最適化方法。
【請求項１１】
前記所定のタイミングは、前記プログラムの実行中に呼び出した関数を解釈した際である、請求項１０に記載のプログラムの最適化方法。
【請求項１２】
前記第２コードを生成するステップは、前記呼び出した関数が解釈されたことに応答して、前記命令列内の前記関数を呼び出す命令を、前記呼び出した関数内の値を読み出す命令で置換し、置換した前記値を読み出す命令内のパラメータを変更し、前記命令列内の前記引数を設定する命令および前記返し値を読み出す命令を含む不要な命令群を削除して、最適化した前記第２コードを生成する、請求項１１に記載のプログラムの最適化方法。
【請求項１３】
前記第２コードのコード・サイズが前記第１コードの前記命令列のコード・サイズ以下であるかを判定するステップをさらに含み、
前記書き込むステップでは、前記命令列のコード・サイズ以下と判定された場合に前記第１コードの前記命令列に前記第２コードを上書きする、請求項９〜１２のいずれか１項に記載のプログラムの最適化方法。
【請求項１４】
前記指定された処理は、分岐を伴う処理で、前記複数の命令は、少なくとも１つの分岐命令と、分岐先で実行すべき命令とを含む、請求項９に記載のプログラムの最適化方法。
【請求項１５】
前記プログラムを解釈した際に、計測された分岐命令の成立回数および不成立回数から得られる実行頻度を用い、分岐先の実行頻度が閾値より低くなるかどうかを判定するステップをさらに含み、
前記第２コードを生成するステップでは、前記所定のタイミングとして、前記プログラムを解釈した際の前記分岐先の実行頻度が閾値より低くなると判断されたことに応答して、低くなると判断された前記分岐先の直前の前記分岐命令までの一連の制御フローである、前記第２コードを構成するためのトレースを生成する、請求項１４に記載のプログラムの最適化方法。
【請求項１６】
前記プログラムの実行中に前記分岐先の命令がアボートした回数が設定値を超えたか否かを判定するステップと、前記設定値を超えたと判定した場合に、アボートを発生させた命令を含まない前記トレースを、前記第２コードを生成するステップで生成された複数のトレースの中から検索するステップとを含み、
前記第２コードを書き込むステップにおいて、トランザクション内で前記第１コードの一部に、検索された前記トレースから構成される前記第２コードを書き込む、請求項１５に記載のプログラムの最適化方法。
【請求項１７】
請求項９〜１６のいずれか１項に記載の方法を実行するためのコンピュータ可読な最適化プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の命令から構成されるプログラムを動的に書き換えて最適化する装置、最適化する方法、およびその方法を実現するためのコンピュータ可読な最適化プログラムに関する。
【背景技術】
【０００２】
コンピュータに所定の作業をさせるためのプログラムは、プログラミング言語を用いて記述されている。プログラミング言語には、コンピュータが直接解釈し、実行することができる機械語や、そのマシン語と一対一で対応し、マシン語に近いアセンブリ言語といった低級言語と、マシン語と一対一で対応せず、より人間が理解しやすいテキスト形式で記述されたC、C＋＋、Java（登録商標）等の高級言語とがある。
【０００３】
コンピュータは、アセンブリ言語または高級言語で記述されたプログラムを直接解釈し、実行することができないため、アセンブラまたはコンパイラと呼ばれるソフトウェアにより、コンピュータが直接解釈して実行することができる機械語へ変換し実行する。
【０００４】
アセンブリ言語によるプログラムは、例えば、実行速度やプログラムサイズに制限があるアプリケーション実行時のコンパイラの最適化能力では実現することができない最適化作業を行いたい場合や、プログラマがCPUの動作を制御する必要がある場合や、メモリ容量や演算実行速度等のリソースに制約がある場合等に行われている。また、カーネルやデバイスドライバの開発等にもこのアセンブリ言語が用いられている。
【０００５】
高級言語によるプログラムは、テキスト形式で記述することができることから、一般に広く行われている。このプログラムは、コンパイラにより機械語へ変換されるが、その際に一旦アセンブリ言語へ変換して出力し、アセンブラで機械語へ変換される。
【０００６】
アセンブラには、高級言語で記述されたプログラムの中にアセンブリ言語による記述を含めるインライン・アセンブラと呼ばれるものがある。このインライン・アセンブラは、プログラムの実行時間の多くを占める部分をアセンブリ言語による記述に置き換えて最適化し、アセンブリ言語で記述したプログラムに近い実行速度を実現するものである。
【０００７】
このようなアセンブリ言語によるプログラムや、インライン・アセンブラを用いることにより、プログラムを最適化し、プログラムの実行速度を向上させることが従来から行われている。プログラムの最適化技術の１つに、複数の命令から構成されるバイナリ列を動的に書き換える技術が知られている。
【０００８】
例えば、コンペア・アンド・スワップ(CAS)命令といったCPUの特別な命令を用い、バイナリの動的な書き換えを行う技術がある。この技術は、あるメモリ位置の値を読み取り、それを記憶しておき、その値に基づき新しい値を計算し、その後、そのメモリ位置にその新しい値を格納するが、その際、計算に用いた値が書き換えるときにも記憶されていることを確認し、記憶されていない場合、最初から処理をやり直すというものである。このため、プロセッサ間の衝突を防ぐことができ、アトミックにメモリ位置を確認して変更することができる。
【０００９】
また、ロードおよびストア命令をパッチ領域に分岐する分岐命令に置き換える技術がある（例えば、非特許文献１参照）。この技術は、対称型マルチプロセッシング環境において、命令を後埋めする技術で、オリジナル・コードの最初のワードのみを変更し、同期プロトコルが使用され、すべてのプロセッサが最終的に後埋めコードを参照することを保証するというものである。
【００１０】
具体的には、図１（ａ）に示すオリジナル・コードの最初のワードである「nop」を、図１（ｂ）に示すような「jmp Label3」へ変更する。「nop」は、何もしないことを意味する命令で、後に命令を追加する予定の場所にダミーとして置かれる。「jmp」は、分岐命令で、ある条件が成立した場合にのみ分岐する条件分岐と、無条件に分岐する無条件分岐とがあり、図１（ｂ）は無条件分岐を示し、「Label3」へ無条件に分岐することを表している。機械語の命令列は、逐次実行されるので、Label1、Label2、Label3、戻ってLabel2の順に実行されるが、このような変更により、Label1、Label2をとばしてLabel3を実行した後、Label2を実行することができるので、プログラムの最適化を図ることができる。
【００１１】
また、ハードウェア・トランザクショナル・メモリ(HTM)を用いて命令列であるバイナリ列を動的に書き換える技術がある（例えば、特許文献１参照）。マルチコア・プロセッサでは、並列に実行されるスレッドがデータを共有して扱う共有メモリ型の並列プログラムが用いられることが多いが、アクセスが競合しないようにする手法として、ロックを用いる手法や、ロックを用いないHTMと呼ばれる手法がある。
【００１２】
このHTMは、ハードウェアとして実装されるトランザクショナル・メモリであり、共有リソースに対するロックを事前に行うのではなく、実行しているスレッドの各々がそのコピーをローカルにもっていて、処理が終了した時点でその共有リソースの値とローカルにもつコピーの値が変更されていないことを確認し、その処理結果を一気に書き込み、他のスレッドにより書き換えられている場合はそれらの値が変更されているため、処理そのものを廃棄してやり直すというものである。ここで、トランザクションとは、１つのスレッドで実行される一連の処理をまとめたものである。
【００１３】
この技術では、バイナリ列を書き換えるとき、メモリのストアをトランザクションで行う。このため、トランザクションの処理が他のトランザクションの処理と競合しない限り、バイナリ列を書き換えることができ、競合した場合であっても、初めから再実行されるので、その再実行されるときに競合しない限り、バイナリ列を書き換えることができる。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】米国特許出願公開第２００９／０００６７５０号明細書
【非特許文献】
【００１５】
【非特許文献１】Bowen Alpern, Mark Charney, Jong-Deok Choi, Anthony Cocchi, Derek Lieber,“Dynamic Linking on a Shared-Memory Multiprocessor”、[online]、１９９９年、インターネット、<URL: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.23.8877&rep=rep1&type=pdf>
【発明の概要】
【発明が解決しようとする課題】
【００１６】
上記のCAS命令を用いてバイナリ列を動的に書き換える手法では、高々１〜２命令の書き換えしかできない。これでは、複数の命令から構成されるバイナリ列を動的に書き換えることはできない。
【００１７】
上記の分岐命令に置き換える手法では、分岐命令が増加し、コード・サイズも増加することから、命令キャッシュ・ミスが増加するという問題がある。また、この手法も、１命令のみ書き換えるので、複数の命令から構成されるバイナリ列を動的に書き換えることはできない。
【００１８】
上記のHTMを用いる手法では、バイナリ列を動的に書き換えることは可能であるが、書き換え対象のバイナリ列に関数呼び出しを含むことができない。これは、例えばスレッド１が元のバイナリ列を実行しているときにスレッド２が書き換えを行う場合、スレッド１が実行している関数が呼び出し先の関数であれば、この時点では元のバイナリ列を実行していないので、スレッド２によるバイナリ列の書き換えは失敗しないからである。このため、スレッド１が呼び出し元に戻ったときには、バイナリ列が書き換えられているという状態となり、これでは正しい実行結果を得ることができない。
【００１９】
呼び出される関数を呼び出し元に展開するインライニングという最適化技術があるが、この技術では、コード・サイズの増加を防止するために、コード・サイズがある閾値に達したところでインライニングが終了する。また、Java（登録商標）のような動的にクラスをロードする言語で、呼び出し対象の関数の実体がコンパイル時に不明である場合は、インラインすることができない。このため、インラインされずに残された関数呼び出しをインラインするには、元の関数を再コンパイルしなければならない。これではコンパイル・コストがかかるという問題がある。
【００２０】
また、HTMを用いた最適化技術には、投機実行される分岐を伴う処理に対し、ホット・トレースから制御依存による制約を取り除いて最適化を行う技術がある。この技術では、コンパイル時に条件分岐でアボートする命令のある分岐先を削除してトレースを作成し、実行時にアボートが頻発すればそのトレースを廃棄し、再コンパイルして新たなトレースを作成するというものである。これも、再コンパイルが必要であるため、コンパイル・コストがかかるという問題がある。
【００２１】
したがって、関数呼び出しを含む複数の命令から構成されるバイナリ列を動的に書き換えることができ、また、再コンパイルすることなく、関数呼び出し処理を動的にインラインし、トレースを新たなトレースに動的に置き換えることができる装置や方法の提供が望まれていた。
【課題を解決するための手段】
【００２２】
本発明は、上記課題に鑑み、トランザクションの排他制御を可能にするトランザクショナル・メモリを備える装置において、プログラムを解釈し、そのプログラム内の指定された処理を実行するための複数の命令から構成される命令列の前後にトランザクションを開始させる開始命令とトランザクションを終了させる終了命令とを挿入した第１コードを生成する第１コード生成部と、指定された処理に応じて、所定のタイミングで複数の命令を用いて第２コードを生成する第２コード生成部と、トランザクション内で第１コードの命令列を第２コードで上書きまたは第１コードの一部に第２コードを書き込むコード書込部とを備える、プログラムの最適化装置を提供することができる。
【００２３】
トランザクショナル・メモリを用いた処理では、トランザクションが投機実行されるが、他のスレッドのメモリ・アクセスと競合してアトミックにトランザクションを実行することができない場合、トランザクションを停止し、それまでの処理を破棄し、再実行する。これにより、トランザクションの排他制御を実現している。このため、指定された処理に対し、トランザクションの開始命令と終了命令とを挿入してトランザクションを構成することにより、他のスレッドのメモリ・アクセスと競合した場合に、確実にトランザクションを停止し、再実行することができるので、正しい実行結果を得ることができる。
【００２４】
ここで、投機実行とは、プログラムが途中で条件分岐している場合に、分岐した先の処理を予め実行しておくことをいい、アトミックとは、他のスレッドからトランザクション内の各命令による処理が１つの処理に見え、途中経過が観測されないことを意味する。
【００２５】
指定された処理は、例えば、関数呼び出し処理や分岐を伴う処理である。関数呼び出し処理は、その関数を呼び出すために、引数の設定、関数の呼び出し、返り値の読み出しを含み、複数の命令として、引数を設定する命令、関数を呼び出す命令、返り値を読み出す命令を含む。分岐を伴う処理は、少なくとも１つの分岐を含み、複数の命令として、少なくとも１つの分岐命令と、分岐先で実行すべき命令とを含む。
【００２６】
第２コード生成部は、具体的には、所定のタイミングとして、プログラムの実行中に呼び出した関数を解釈した際、それに応答して、命令列内の関数を呼び出す命令を、その呼び出した関数内の値を読み出す命令で置換し、置換した値を読み出す命令内のパラメータを変更し、命令列内の引数を設定する命令および返し値を読み出す命令を含む不要な命令群を削除して、最適化した第２コードを生成する。
【００２７】
この最適化装置は、指定された処理を実行するための複数の命令から構成される命令列をトランザクションで囲み、その囲まれた命令列に基づき、最適化したコードを作り、それをその命令列上に書き込むことで、関数呼び出しを含む複数の命令から構成されるバイナリ列を動的に書き換えることができる。また、実行時にコンパイルするのは呼び出し先の関数のみであるため、プログラムを再コンパイルすることなく、関数呼び出し処理を動的にインラインすることができる。
【００２８】
また、この最適化装置は、第２コードのコード・サイズが第１コードの命令列のコード・サイズ以下であるかを判定するサイズ判定部をさらに含むことができる。これにより、サイズ判定部が命令列のコード・サイズ以下と判定した場合に、これを受けて、コード書込部が、第１コードの命令列に第２コードを上書きすることができる。コード・サイズが閾値を超える場合は、命令列は書き換えない。
【００２９】
上記のサイズ判定部とは別に、プログラムを解釈した際に、計測された分岐命令の成立回数および不成立回数から得られる実行頻度を用い、分岐先の実行頻度が閾値より低くなるかどうかを判定する頻度判定部を含むことができる。この場合、第２コード生成部は、上記の所定のタイミングとして、プログラムを解釈した際の分岐先の実行頻度が閾値より低くなると判断されたことに応答して、低くなると判断された分岐先の直前の分岐命令までの一連の制御フローである、第２コードを構成するためのトレースを生成する。
【００３０】
また、プログラムの実行中に分岐先の命令がアボートした回数が設定値を超えたか否かを判定するアボート判定部と、その設定値を超えたと判定した場合に、アボートを発生させた命令を含まないトレースを、第２コード生成部が生成した複数のトレースの中から検索するトレース検索部とを含むことができる。この場合、コード書込部は、トランザクション内で第１コードの一部に、トレース検索部により検索されたトレースから構成される第２コードを書き込む。
【００３１】
上記の第１コード生成部、第２コード生成部、コード書込部に加えて、頻度判定部、アボート判定部、トレース検索部を含む構成を採用することで、実行頻度から第１トレースを作り、それをトランザクションで囲んで第１コードを生成し、この第１トレースから少なくとも１つの第２トレースを作り、これにトランザクション終了命令を挿入して第２コードを生成し、アボートが頻発する場合に、生成した第２コードの中からアボートしないものを検索して選び、それを書き込むので、プログラムを再コンパイルすることなく、トレースを新たなトレースに動的に置き換えることができ、アプリケーションの性能を向上させることができる。
【００３２】
本発明では、上述したプログラムの最適化装置のほかに、その最適化装置において行われる最適化方法も提供できる。この方法は、トランザクショナル・メモリを備えるプログラムの最適化装置により実行され、プログラムを解釈し、そのプログラム内の指定された処理を実行するための複数の命令から構成される命令列の前後にトランザクションを開始させる開始命令とトランザクションを終了させる終了命令とを挿入した第１コードを生成するステップと、指定された処理に応じて、プログラムを解釈した際またはプログラムの実行中に複数の命令を用いて第２コードを生成するステップと、トランザクション内で第１コードの命令列を第２コードで上書きまたは第１コードの一部に第２コードを書き込むステップとを含んで構成される。
【００３３】
また、その方法を実現するための装置可読な最適化プログラムも提供することができる。この最適化プログラムは、CD-ROM、DVD、SDカード等の記録媒体に格納して提供することができ、PC等のコンピュータにより読み出し実行することにより、そのコンピュータを最適化装置として機能させることができる。
【図面の簡単な説明】
【００３４】
【図１】ロードおよびストア命令をパッチ領域に分岐する分岐命令に置き換える前後のプログラムを例示した図。
【図２】本発明のプログラムの最適化装置のハードウェア構成の一例を示した図。
【図３】本発明のプログラムの最適化装置の機能ブロック図。
【図４】関数呼び出しを実行するためのコード、それをコンパイルしたコードを例示した図。
【図５】関数呼び出し処理を実行するための命令列を上書きして最適化する処理の流れを示したフローチャート図。
【図６】呼び出し先のコード、それをコンパイルしたコードを例示した図。
【図７】命令を置き換え、不要な命令を削除して最適化されたコードを例示した図。
【図８】制御フローグラフを例示した図。
【図９】第１トレースおよび第２トレースを例示した図。
【図１０】第１コード上に第２コードを書き込み、最適化されたコードを例示した図。
【図１１】第１トレースに第２トレースを書き込み、最適化する処理の流れを示したフローチャート図。
【発明を実施するための形態】
【００３５】
以下、本発明を図面に示した具体的な実施の形態に沿って説明するが、本発明は、後述する実施の形態に限定されるものではない。図２は、本発明のプログラムの最適化装置のハードウェア構成を例示した図である。この最適化装置１００は、上述したアセンブリ言語、C、C＋＋、Java（登録商標）等のプログラミング言語により記述された、処理対象のプログラムを受け取り、そのプログラム内の指定された処理を実行するための複数の命令から構成される命令列を書き換え、そのプログラムを最適化する装置である。以下、単にプログラムと記載されるものは、この処理対象のプログラムを意味する。
【００３６】
この最適化装置１００は、上記の処理を実現するための最適化プログラムを格納し、それを実行することができる装置であってもよく、PC、サーバ、ワークステーション等を最適化装置とすることが可能である。
【００３７】
最適化装置１００は、ハードウェアとして例えば、ホスト・コントローラ１０１により相互に接続されるCPU１０２と、RAM１０３と、グラフィック・コントローラ１０４および表示装置１０５を備える周辺装置と、入出力コントローラ１０６によりホスト・コントローラ１０１に接続される通信インタフェース１０７と、ハードディスク・ドライブ（HDD）１０８、CD/DVDドライブ１０９等を備える入出力装置と、入出力コントローラ１０６に接続されるROM１１０と、入出力チップ１１１を備えるレガシー入出力装置とを含んで構成することができる。この装置はそのほかに、記録媒体の１つとして使用されるSDカードに記録された最適化プログラム、処理対象のプログラム、その他プログラムやデータを読み取るSDカード・リーダ等を含むことができる。
【００３８】
ホスト・コントローラ１０１は、RAM１０３と、高い転送レートでRAM１０３をアクセスするCPU１０２およびグラフィック・コントローラ１０４とを接続する。CPU１０２は、ROM１１０およびRAM１０３に格納された上記の最適化プログラム等に基づいて動作し、各部の制御を行う。このCPU１０２は、並列処理が可能なマルチプロセッサとされ、HTM１０２ａを含んで構成される。HTM１０２ａは、ハードウェアとして実装されるトランザクショナル・メモリで、上述したように、共有リソースに対するロックを事前に行うのではなく、実行しているスレッドの各々がそのコピーをローカルにもち、処理が終了した時点でその共有リソースの値とローカルにもつコピーの値が変更されていないことを確認し、その処理結果を一気に書き込むことができる。また、HTM１０２ａは、他のスレッドにより書き換えられている場合は、それらの値が変更されているため、処理そのものを廃棄してやり直すことができる。
【００３９】
グラフィック・コントローラ１０４は、CPU１０２等がRAM１０３内に設けたフレーム・バッファ上に生成する画像データを取得し、表示装置１０５上に表示させる。グラフィック・コントローラ１０４は、CPU１０２等が生成する画像データを格納するフレーム・バッファを、このグラフィック・コントローラ１０４の内部に備えることもできる。
【００４０】
入出力コントローラ１０６は、ホスト・コントローラ１０１と、比較的高速な入出力装置である通信インタフェース１０７、HDD１０８、CD/DVDドライブ１０９を接続する。通信インタフェース１０７は、ネットワークを介して他の装置と通信する。HDD１０８は、上記の最適化プログラムやその他のプログラム、各種データを格納することができる。CD/DVDドライブ１０９は、CD-ROMやDVDに上記最適化プログラム、処理対象のプログラム、その他のプログラム、各種データが記録されている場合、それらを読み取り、RAM１０３を介して入出力チップ１１１に提供することができる。
【００４１】
入出力コントローラ１０６は、ROM１１０と、入出力チップ１１１等の比較的低速な入出力装置とが接続される。ROM１１０は、HDD１０８からOSをロードして起動するためのブート・プログラムや、コンピュータや機器の初期設定情報等を記録したファームウェア等を格納する。入出力チップ１１１は、パラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各部の入出力装置を接続する。
【００４２】
最適化プログラムは、CD-ROM、DVD、SDカード等の記録媒体に格納されてユーザに提供される。この最適化プログラムは、この記録媒体から読み出され、入出力コントローラ１０６を介してHDD１０８等にインストールされ、CPU１０２により読み出されて実行される。本発明では、これに限られるものではなく、ネットワークに接続されたサーバのHDD等に格納され、このサーバのHDD等から読み出し、実行することも可能である。
【００４３】
プログラムは、上記のプログラミング言語で記述されたプログラムであればいかなるプログラムやアプリケーションであってもよく、HDD１０８や記録媒体から読み出し、また、ネットワークに接続される他のPC等から受信して、コンパイルおよび実行することができる。
【００４４】
図３は、本発明のプログラムの最適化装置の機能ブロック図である。この最適化装置は、トランザクショナル・メモリを備えるため、トランザクションの処理が競合した場合、一方のトランザクション処理をすべて破棄し、初めから再実行して、排他制御を実現することができる。トランザクションの処理を実現するために、この装置は、プログラムを解釈し、そのプログラム内の指定された処理を実行するための複数の命令から構成される命令列の前後にトランザクションを開始させる開始命令とトランザクションを終了させる終了命令とを挿入した第１コードを生成する第１コード生成部２００を備える。
【００４５】
また、この装置は、指定された処理に応じて、所定のタイミングで、具体的にはプログラムを解釈した際またはプログラムの実行中に、命令列の複数の命令を用い、命令を置換、削除、選択する等して最適化した第２コードを生成する第２コード生成部２０１と、トランザクション内で、上記のプログラムの実行中に第１コードの命令列を第２コードで上書きし、または上記のプログラムを解釈した際に第１コードの一部に第２コードを書き込むコード書込部２０２とを備える。
【００４６】
第１コード生成部２００は、プログラムをコンパイルすることにより解釈し、そのプログラム内の関数呼び出し処理や分岐を伴う処理といった予め指定された処理を実行するための複数の命令から構成される命令列を特定する。具体的には、例えば、図４（ａ）に示すコードをコンパイルして図４（ｂ）に示すようなアセンブラ言語で記述された命令列を得、その中の引数の設定から返り値の読み出しまでの６つの命令から構成される命令列を特定する。
【００４７】
図４（ｂ）に示される６つの命令は、関数を呼び出すときに渡す値である引数を設定する命令と、呼び出し先の関数のアドレスを保持する関数テーブルをロードする命令、呼び出し先の関数のアドレスをロードしてレジスタに設定する命令、カウント・レジスタにコピーする命令、関数Foo2.getValue()を呼び出す命令、返り値を読み出す命令とされている。
【００４８】
そして、第１コード生成部２００は、その特定した命令列の前、すなわち引数を設定する命令の前に、トランザクションを開始させる開始命令「tbegin」を挿入し、その特定した命令列の後、すなわち返り値を読み出す命令の直後に、トランザクションを終了させる終了命令「tend」を挿入する。これにより、「tbegin」と「tend」で囲まれた部分の命令列が１つのトランザクションを構成し、このトランザクションをあるスレッドが実行しているときに、他のスレッドが書き換えを行おうとしても、それが任意の関数（例えば、関数add）の実行中であっても、その書き換えは失敗となり、正しい実行結果を得ることができる。
【００４９】
プログラムのコンパイル時、上述したインライニングして、呼び出される関数を呼び出し元の関数に展開することができるが、このインライニングは、コンパイル時にプログラム内のすべての関数をインラインし、また、インラインすることができるわけではない。これは、コード・サイズの増加を防止するため、コード・サイズがある閾値に達したところでインラインを終了することから、残った関数はインラインされず、また、Java（登録商標）のような動的にクラスをロードする言語で記述されたプログラムは、実行時でなければ呼び出し対象の関数が確定しないことから、コンパイル段階ではその実体が不明でインラインすることができないためである。
【００５０】
このインラインされずに残った関数呼び出しをインラインするためには、呼び出し元の関数を再コンパイルすればインラインすることができるが、本発明の最適化装置では、プログラムの実行により呼び出し対象の関数の実体が確定し、インラインすることができるようになった時点で、その呼び出し先の関数をコンパイルするのみで、インラインすることができる。
【００５１】
第２コード生成部２０１は、呼び出し先の関数をコンパイルし、インラインすることができるようになったことに応答して、プログラム実行中に書き換え対象の命令列の中の複数の命令を用い、呼び出し先の関数の変数の値を読み出す命令と関数を呼び出す命令とを置換し、その置換した変数の値を読み出す命令のパラメータを変更し、これによって不要となった命令を削除して、第２コードを生成する。
【００５２】
コード書込部２０２は、第２コードが生成されたことに応答して、トランザクション内で第１コードの書き換え対象の命令列を第２コードで上書きする。これにより、実行されるプログラムは最適化されるので、プログラムの性能を向上させることができ、また、関数を呼び出すことなく、直接に変数の値を読み出すことができるので、処理速度を向上させることができる。
【００５３】
図５に示すフローチャートを参照して、本発明のプログラムの最適化装置を用いて関数呼び出しをインラインする処理について詳細に説明する。この処理は、ステップ５００から開始し、ステップ５１０で、まず、関数のコンパイル時にインラインすることができなかった関数呼び出し処理を実行するための命令列を特定する。具体的には、プログラムを解釈して、関数を呼び出す命令を探し、そのうち呼び出し元の関数に呼び出し先の関数が展開されていないものを特定する。そして、その関数を呼び出す命令に関連する、その関数へ渡す引数の値を設定する命令やその関数の返り値を読み出す命令等を特定し、これらの複数の命令から構成される命令列を書き換え対象の命令列と特定する。次に、ステップ５２０で、その書き換え対象として特定した命令列の前後にトランザクションの開始命令と終了命令を挿入し、第１コードを生成する。
【００５４】
プログラムが、例えばJava（登録商標）といった動的にクラスをロードする言語で記述されたプログラムである場合、そのプログラムが実行されたときに関数の呼び出し先が確定し、この確定によりインラインが可能となった段階で、ステップ５３０において、その呼び出し先の関数をコンパイルする。この呼び出し先の関数は、図６（ａ）で示され、これをコンパイルすると、図６（ｂ）に示すように、変数「value」の値を読み出す命令と、呼び出し元へ戻る命令の２つから構成されたコードへ変換される。
【００５５】
再び図５を参照して、次にステップ５４０において、ステップ５１０でコンパイル時に生成した第１コードの中の関数を呼び出す命令、すなわち図４（ｂ）に示す「bctrl」を、ステップ５３０でコンパイルして変換された変数の値を読み出す命令、すなわち図６（ｂ）に示す「lwz r3,16(r3)」に置き換える。これにより、図７（ａ）に示すようなコードが生成され、呼び出し先の関数を呼び出すことなく、直接に変数の値を読み出すことが可能となる。
【００５６】
続いてステップ５５０において、置き換えられた変数の値の読み出す命令に、変数の値の読み出しに必要な引数と、読み出す返り値とを代入し、これによって不要となった引数を設定する命令、関数テーブルをロードする命令、呼び出し先関数のアドレスをロードする命令、返り値を読み出す命令を削除し、第２コードを生成する。
【００５７】
第２コードは、図７（ｂ）に示すように、変数「value」の値を読み出す命令のみで表され、その他の命令が記述されていた部分には、何もしないという「nop」が書き込まれる。
【００５８】
そして、ステップ５６０において、第２コードのコード・サイズが関数呼び出しを行う命令列のコード・サイズ以下であるかを判定する。コード・サイズは、そのコードを格納するために必要とされるメモリ容量とすることができる。なお、この判定は、最適化装置が備えるサイズ判定部が行うことができる。
【００５９】
図４に示す関数呼び出しを行う命令列は、６つの命令から構成され、図７に示す第２コードは、「nop」が５つあるものの、実質的に１つの命令から構成されることから、大幅に実行時間を削減することができているものと考えられる。このため、この実施例では、第２コードのコード・サイズが関数呼び出しを行う命令列のコード・サイズ以下であると判定される。
【００６０】
ステップ５６０における判定で、関数呼び出し行う命令列のコード・サイズを超える場合は、コード・サイズが増加することからインラインを行うことなく、ステップ５８０の終了へ進む。
【００６１】
一方、そのコード・サイズ以下である場合は、ステップ５７０へ進み、トランザクション内で関数呼び出しを行う命令列上にこの第２コードを上書きする。上書きは、命令列を構成する「ori r3, r5, 0」の上に「lwz r8, 16(r5)」を書き込み、それ以降の命令上に「nop」を書き込むことにより行われる。この上書きが終了したところで、ステップ５８０へ進み、この処理を終了する。このようにコードを上書きするので、プログラムのサイズが大きくなることはなく、プログラムの実行時に必要とされるメモリ・サイズが増加し、メモリ不足や処理速度が低下するといった問題が生じることはない。
【００６２】
これまで、指定された処理として関数呼び出し処理を例に挙げ、再コンパイルすることなくインラインしてプログラムを最適化することについて詳細に説明してきた。指定された処理はこれに限られるものではなく、分岐を伴う処理を挙げることができる。この分岐を伴う処理は、分岐命令を含む命令列により実現されることから、分岐命令を探すことにより見分けることができる。
【００６３】
プログラムによる処理は、図８に示すように制御フローグラフによって表すことができる。この制御フローグラフは、プログラムを実行した場合に通過する可能性がある全パスをグラフで表したものであり、四角は基本ブロックを示し、基本ブロックの矢印は基本ブロック間の制御の流れを示すエッジである。基本ブロック内には、制御の遷移のない一連の命令列が含まれる。図８中では、基本ブロックAの最後で、「br1」で示される条件付分岐命令を実行し、いずれかの分岐先へ進み、その分岐先の命令列を実行後、基本ブロックDへ進み、「br2」で示される条件付分岐命令を実行し、いずれかの分岐先へ進み、その分岐先の命令列を実行するような流れとなっている。ここで、条件付分岐とは、条件判定を行い、その条件を満足した場合に一方の分岐先へ飛び、満足しない場合には他方の分岐先へ飛ぶというものである。これに対し、条件付アボート命令は、ある条件が成立した際、トランザクションをアボートさせ、命令の実行をトランザクションの先頭に戻すための命令である。
【００６４】
プログラムの実行中、最適化等のために、条件付分岐命令を実行する際、その成立回数および不成立回数を計測し、それを履歴情報として記録することができる。分岐先の命令が正常に実行されれば、成立回数が１つ増加し、それ以外では不成立回数が１つ増加するように計測される。この計測は、例えばカウンタを用いて行うことができる。成立回数と不成立回数は、実行頻度(%)を算出するために用いられ、実行頻度が高いほど成立回数が多く、不成立回数が少ないことを示す。履歴情報は、上記回数に限られるものではなく、算出された実行頻度であってもよい。なお、実行頻度は、成立回数を全回数で除し、100を乗算した値とすることができる。
【００６５】
図８では、条件付分岐命令「br1」を実行した後、向かって左側の基本ブロックBの実行頻度が90%、右側の基本ブロックCの実行頻度が10%となっており、次の条件付分岐命令「br2」を実行した後、向かって左側の基本ブロックEの実行頻度が70%、右側の基本ブロックFの実行頻度が30％となっている。
【００６６】
これを基に、第１コード生成部２００は、プログラムのコンパイル時に、実行頻度が高い基本ブロックを選択しながら第１トレースを生成する。図８に示す制御フローグラフを参照して第１トレースを生成する場合、図９（ａ）に示すように、実行頻度が高い基本ブロックを選択し、基本ブロックA、B、D、Eから構成されるトレースが生成される。このとき、基本ブロックA、Dの中の条件付分岐命令「br1」、「br2」は、トレースに含まれない基本ブロックに分岐する可能性があるため、条件付アボート命令「ab1」、「ab2」へと変更される。
【００６７】
プログラムのコンパイル時、第１コード生成部２００により第１トレースが生成されたことに応答して、最適化装置が備える頻度判定部が、第１トレース内の命令列を後方からたどり、実行頻度が閾値以下のエッジを検出したかを判定する。そして、第２コード生成部２０１が、所定のタイミングとして、プログラムのコンパイル時の第１トレースが生成され、さらに閾値以下のエッジが検出されたことに応答して、その検出されたエッジ直前の分岐命令までのトレースを第２トレースとして生成する。
【００６８】
例えば、経験値によって閾値を70%とした場合、図８に示す例では、基本ブロックDからEへのエッジの実行頻度が70%であるため、閾値以下であると判定し、図９（ｂ）に示すような、そのエッジの直前の分岐命令「br2」までの、A、B、Dから構成されるトレースが第２トレースとして生成される。ここでは、このトレースのみが生成されるため、第２トレースは１つであるが、アボートの頻発等を考慮して２以上のトレースを生成しておくことができる。
【００６９】
第１コード生成部２００は、図１０（ａ）に示すような、生成した第１トレースの前後にトランザクションの開始命令と終了命令を挿入し、第１コードを生成する。第２コード生成部２０１は、図１０（ｂ）に示すような、第２トレースの最後の分岐命令「br2」の直前にトランザクションの終了命令「tend」を挿入し、分岐命令「br2」の後に無条件分岐命令「b」を挿入し、第２コードを生成する。そして、実際にプログラムを実行し、第１コードの実行でアボートが頻発する場合、アボートが発生する命令を特定し、その命令を含まない第２トレースを検索する。この検索は、最適化装置が備えるトレース検索部により行うことができる。コード書込部２０２は、その命令を含まない第２トレースが存在する場合、その第２トレースから構成される第２コードを第１トレース上にトランザクション内で書き込む。なお、図１０（ｂ）に示す第２コードを書き込み、実行させると、第２トレースの実行が終了した後、基本ブロックEへ無条件にジャンプし、基本ブロックEを実行することになる。ここでは、図１０（ｂ）に示すトレースを例示したが、「ab2」でアボートが頻発する場合、条件分岐命令「br2」の条件成立の結果が基本ブロックFへ変わったことを意味することから、効率的に処理するために、基本ブロックA、B、D、Fから構成されるトレースを生成し、このトレースを採用することも可能である。
【００７０】
図１１を参照して、分岐を伴う処理を実行するための複数の命令から構成される命令列を書き換えて最適化する処理について説明する。ステップ１１００からこの処理を開始し、ステップ１１１０において、プログラムをコンパイルする際、制御フローグラフを構築し、回数あるいは実行頻度を含む履歴情報を用い、実行頻度が高い方のエッジを選択して、プログラム中の実行頻度が高い一連の制御フローである第１トレースを生成する。第１トレースは、分岐命令を含む命令列と、少なくとも２つの分岐先となる命令もしくは命令列とを含んで構成される。
【００７１】
ステップ１１２０では、頻度判定部が、ステップ１１１０において生成した第１トレースを後方からたどり、実行頻度が閾値以下のエッジを検出したかを判定する。閾値以下のエッジが検出された場合、ステップ１１３０へ進み、第２コード生成部２０１が、その検出されたエッジ直前の分岐命令までのトレースを第２トレースとして生成する。一方、エッジを検出しない場合、トレースが生成されないので、ステップ１２００へ進み、処理を終了する。
【００７２】
実行頻度は30%と低いものの、基本ブロックA、B、D、Fから構成されるトレースを第２トレースとして生成しておき、第１トレースのアボート命令「ab2」が相当な高確率でアボートするようであれば、このような第２トレースで第１トレースを置き換えることができる。このため、第２トレースは複数生成することができ、トレース検索部がそれら複数の第２トレースの中からアボートが頻発する命令を含まないトレースを検索し、そのトレースを書き込むことができる。
【００７３】
ステップ１１４０において、第１コード生成部２００は、プログラムの実行時に、ステップ１１１０で生成した第１トレースの前後にトランザクションを開始させる開始命令とトランザクションを終了させる終了命令を挿入し、第１コードを生成する。
【００７４】
次にステップ１１５０において、第２コード生成部２０１が、ステップ１１３０で生成した第２トレースの最後の分岐命令の直前にトランザクションの終了命令を挿入し、第２コードを生成する。これにより、トランザクション内で第２トレースを実行することができ、他のスレッドがトレースを書き込もうとしても失敗し、確実にトランザクションを実行することができる。
【００７５】
プログラムの実行時に、ある命令でアボートが頻発する場合、ステップ１１６０で、最適化装置が備えるアボート判定部が、アボートする回数が設定値を超えたかどうかを判定する。回数でなく、アボート率(%)であってもよい。超えない場合は、第２コードを書き込むことなく、ステップ１２００へ進み、この処理を終了する。
【００７６】
これに対し、設定値を超えた場合は、ステップ１１７０へ進み、そのアボートが頻発する命令を含まない第２コードを、ステップ１１５０で生成した複数の第２コードの中から検索する。そして、ステップ１１８０において、第２コードが存在するかを判定し、存在する場合はステップ１１９０へ進み、その第２コードを、第１トレースの対応する部分にトランザクション内で書き込み、ステップ１２００で処理を終了する。
【００７７】
一方、存在しない場合はステップ１２００へ進み、第１トレースに何も書き込むことなく、処理を終了する。これは書き込むべきトレースが存在しないからである。
【００７８】
これまで、本発明の最適化装置および最適化方法について、図面を参照して詳細に説明してきたが、他の実施形態や、追加、変更、削除など、当業者が想到することができる範囲内で変更することができ、いずれの態様においても本発明の作用・効果を奏する限り、本発明の範囲に含まれるものである。
【００７９】
また、最適化方法は、コンピュータにより読み取り可能な最適化プログラムにより実現することができ、本発明では、この最適化プログラムを提供することも可能である。なお、最適化プログラムは、CD-ROM、DVD-ROM、SDカード、HDD等の記録媒体に格納して提供することができる。
【００８０】
近年、複数のプロセッサ・コアを１つのチップ上に集積したマルチコア・プロセッサが広く普及しており、複数のスレッドを並列に実行することができるようになってきており、並列プログラミングの重要性が高まってきている。この並列プログラミングにおいて、ロックを用いた同期機構が広く用いられているが、ロックを用いると、デッドロックや不要なロックによる並列性の低下が生じることから、ロックを用いないトランザクショナル・メモリを用いた同期機構が提案されている。このため、様々なプロセッサにこのトランザクショナル・メモリが搭載される可能性があり、本発明のトランザクショナル・メモリを備える最適化装置の提供は、特に関数呼び出しを含むプログラムを動的に最適化することができる点で、アプリケーションの性能を向上させ、高速処理を実現することができるので有用である。
【符号の説明】
【００８１】
１００…最適化装置、１０１…ホスト・コントローラ、１０２…CPU、１０２ａ…トランザクショナル・メモリ、１０３…RAM、１０４…グラフィック・コントローラ、１０５…表示装置、１０６…入出力コントローラ、１０７…通信インタフェース、１０８…HDD、１０９…CD/DVDドライブ、１１０…ROM、１１１…入出力チップ、２００…第１コード生成部、２０１…第２コード生成部、２０２…コード書込部
【図１】
0005681473.tif 000002
【図２】
0005681473.tif 000003
【図３】
0005681473.tif 000004
【図４】
0005681473.tif 000005
【図５】
0005681473.tif 000006
【図６】
0005681473.tif 000007
【図７】
0005681473.tif 000008
【図８】
0005681473.tif 000009
【図９】
0005681473.tif 000010
【図１０】
0005681473.tif 000011
【図１１】
0005681473.tif 000012