(57)【特許請求の範囲】
【請求項１】
コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する装置であって、
前記コンピュータ使用可能コードを前記第１のメモリ上で事前実行する事前実行部と、
前記事前実行部により前記コンピュータ使用可能コードが事前実行されたときの当該コンピュータ使用可能コードを構成する複数のコード要素の実行の順序を示す順序情報を記録する記録部と、
前記記録部により記録された順序情報に基づいて、前記複数のコード要素の各々に対して次に実行される可能性のあるコード要素を定義した定義情報を生成する生成部と、
前記複数のコード要素のうちの前記第２のメモリ上の第１のコード要素を実行する実行部と、
前記生成部により生成された定義情報に基づいて、次に前記第１のメモリから前記第２のメモリに転送すべき第２のコード要素を決定する決定部と、
前記実行部による前記第１のコード要素の実行と並行して、前記決定部により決定された第２のコード要素を前記第１のメモリから前記第２のメモリに転送する転送部と
を備えた、装置。
【請求項２】
前記複数のコード要素の各々は、独立した機能を実現する関数の集合であり、
前記実行部は、前記第１のコード要素を前記関数の単位で実行し、
前記決定部は、前記実行部による前記関数の実行時に渡される前記第１のコード要素を示す引数と、前記定義情報とに基づいて、前記第２のコード要素を決定する、請求項１の装置。
【請求項３】
前記第１のメモリは、前記装置のメインメモリであり、
前記第２のメモリは、前記メインメモリよりも小容量でかつ高速なメモリである、請求項１の装置。
【請求項４】
前記第２のメモリは、マルチコアプロセッサを構成するプロセッサコアにより使用されるローカルメモリである、請求項３の装置。
【請求項５】
前記複数のコード要素の各々は、独立した機能を実現する関数の集合であり、
前記事前実行部は、前記複数のコード要素の各々を前記関数の単位で事前実行し、
前記記録部は、前記事前実行部による前記関数の事前実行時に渡される前記複数のコード要素の各々を示す引数に基づいて、前記順序情報を記録する、請求項１の装置。
【請求項６】
コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する方法であって、
前記コンピュータ使用可能コードを前記第１のメモリ上で事前実行するステップと、
前記コンピュータ使用可能コードが事前実行されたときの当該コンピュータ使用可能コードを構成する複数のコード要素の実行の順序を示す順序情報を記録するステップと、
記録された順序情報に基づいて、前記複数のコード要素の各々に対して次に実行される可能性のあるコード要素を定義した定義情報を生成するステップと、
前記複数のコード要素のうちの第１のコード要素を前記第１のメモリから前記第２のメモリに転送するステップと、
前記第２のメモリに転送された第１のコード要素を実行するステップと、
前記第１のコード要素の実行と並行して、生成された定義情報に基づいて、次に転送すべき第２のコード要素を決定し、当該第２のコード要素を前記第１のメモリから前記第２のメモリに転送するステップと
を含む、方法。
【請求項７】
コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する装置としてコンピュータを機能させるプログラムであって、
前記コンピュータを、
前記コンピュータ使用可能コードを前記第１のメモリ上で事前実行する事前実行部と、
前記事前実行部により前記コンピュータ使用可能コードが事前実行されたときの当該コンピュータ使用可能コードを構成する複数のコード要素の実行の順序を示す順序情報を記録する記録部と、
前記記録部により記録された順序情報に基づいて、前記複数のコード要素の各々に対して次に実行される可能性のあるコード要素を定義した定義情報を生成する生成部と、
前記複数のコード要素のうちの前記第２のメモリ上の第１のコード要素を実行する実行部と、
前記生成部により生成された定義情報に基づいて、次に前記第１のメモリから前記第２のメモリに転送すべき第２のコード要素を決定する決定部と、
前記実行部による前記第１のコード要素の実行と並行して、前記決定部により決定された第２のコード要素を前記第１のメモリから前記第２のメモリに転送する転送部と
して機能させる、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ使用可能コードを実行する装置及び方法に関する。特に、本発明は、コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する装置及び方法に関する。
【背景技術】
【０００２】
一般に、プロセッサは、コンピュータ使用可能コード（以下、単に「コード」ともいう）を、初期的にコードを記憶する第１のメモリからコードを実行するために記憶する第２のメモリに転送して実行する。ところが、このような場合に、第２のメモリの容量を超えるような大きなサイズのコードはそのままでは実行できないという問題がある。この問題に対する既知の解決策としては、大きなサイズのコードを複数のコードセグメント（以下、単に「セグメント」という）に分割し、セグメントごとに第１のメモリから第２のメモリに転送して、第２のメモリ上の実行が終わったセグメントを置き換えて実行する、オーバーレイと呼ばれる手法がある。しかし、この手法では、コード呼び出し時にセグメントの転送を行うため、コードの実行時間に加えて転送時間がオーバーヘッドとして発生してしまう。
【０００３】
ここで、データ転送のオーバーヘッドをなくすことを目的とする技術として、ＣＰＵ、ＤＳＰのデータ処理とＤＭＡによるデータ転送を並列的に行うものがある（例えば、特許文献１参照）。この特許文献１の技術では、ＤＭＡ制御回路が、転送長レジスタに設定された転送長分のデータをＤＭＡ転送すると一時停止し、再開を指示されると転送を再開し、全転送データが総転送長レジスタに設定された転送長に達するとＤＭＡ転送を終了するようになっている。
【０００４】
また、高速なメモリと低速なメモリを含む装置においてデータやプログラムの処理を高速化する技術も種々提案されている（例えば、特許文献２〜４参照）。
特許文献２には、ＤＭＡ転送を用いてＣＰＵ又はＤＳＰの処理と独立してタスク及びデータの転送を行うことにより、キャッシュメモリと外部メモリ間のデータ転送を高速化する技術が記載されている。
特許文献３には、チャネルマイクロプログラムを格納する外部メモリと内部メモリを備え、チャネルマイクロプログラムのアドレスを示すプログラムカウンタが外部メモリを示しているか内部メモリを示しているかに従い、外部メモリと内部メモリを切り替え、パイプライン制御のマシンサイクルを切り替える技術が記載されている。
特許文献４には、次のセクタｊ＋１からのデータが高速アクセス可能メモリにコピーされている時間中に、前のセクタｊからの、以前に一時的に高速アクセス可能メモリに格納されたデータを、処理装置によって同時に処理する技術が記載されている。
【０００５】
【特許文献１】特開２００６−１１９７１１号公報
【特許文献２】特開２０００−１２２８８０号公報
【特許文献３】特開２０００−３４７９８１号公報
【特許文献４】特開２００５−１８２７８３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
このように、従来、データ処理とデータ転送を並列的に行う技術は存在した。
しかしながら、特許文献１〜４の何れの技術においても、転送すべきデータやコードをどのように決定するかについては述べられていない。
【０００７】
本発明の目的は、第１のメモリから第２のメモリへのコードの転送を、第２のメモリに転送済のコードの実行と並行して行う場合に、転送すべきコードを適切に決定することにある。
【課題を解決するための手段】
【０００８】
かかる目的のもと、本発明は、コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する装置であって、コンピュータ使用可能コードを構成する複数のコード要素の実行の順序を定義した定義情報を記憶する記憶部と、複数のコード要素のうちの第２のメモリ上の第１のコード要素を実行する実行部と、記憶部に記憶された定義情報に基づいて、次に第１のメモリから第２のメモリに転送すべき第２のコード要素を決定する決定部と、実行部による第１のコード要素の実行と並行して、決定部により決定された第２のコード要素を第１のメモリから第２のメモリに転送する転送部とを備えた、装置を提供する。
【０００９】
また、この装置において、複数のコード要素の各々は、独立した機能を実現する関数の集合であり、実行部は、第１のコード要素を関数の単位で実行し、決定部は、実行部による関数の実行時に渡される第１のコード要素を示す引数と、定義情報とに基づいて、第２のコード要素を決定する、ものであってよい。
更に、第１のメモリは、装置のメインメモリであり、第２のメモリは、メインメモリよりも小容量でかつ高速なメモリであってよく、或いは、第２のメモリは、マルチコアプロセッサを構成するプロセッサコアにより使用されるローカルメモリであってもよい。
【００１０】
そして、この装置は、コンピュータ使用可能コードを第１のメモリ上で事前実行する事前実行部と、事前実行部により複数のコード要素が事前実行された順序を示す順序情報を記録する記録部と、記録部により記録された順序情報に基づいて、定義情報を生成する生成部とを更に備えた、ものであってよい。
また、この装置において、複数のコード要素の各々は、独立した機能を実現する関数の集合であり、事前実行部は、複数のコード要素のうちの特定のコード要素を関数の単位で事前実行し、記録部は、事前実行部による関数の事前実行時に渡される特定のコード要素を示す引数に基づいて、順序情報を記録する、ものであってよい。
更に、生成部は、複数のコード要素のうちの特定のコード要素の次に他のコード要素が実行される可能性に関する情報を、定義情報として生成する、ものであってよい。
【００１１】
また、本発明は、コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する方法であって、コンピュータ使用可能コードを構成する複数のコード要素のうちの第１のコード要素を第１のメモリから第２のメモリに転送するステップと、第２のメモリに転送された第１のコード要素を実行するステップと、第１のコード要素の実行と並行して、複数のコード要素の実行の順序を定義した定義情報に基づいて、次に転送すべき第２のコード要素を決定し、第２のコード要素を第１のメモリから第２のメモリに転送するステップとを含む、方法も提供する。
【００１２】
更に、本発明は、コンピュータ使用可能コードを第１のメモリから第２のメモリに転送して実行する装置としてコンピュータを機能させるプログラムであって、コンピュータを、コンピュータ使用可能コードを構成する複数のコード要素のうちの第２のメモリ上の第１のコード要素を実行する実行部と、複数のコード要素の実行の順序を定義した定義情報に基づいて、次に第１のメモリから第２のメモリに転送すべき第２のコード要素を決定する決定部と、実行部による第１のコード要素の実行と並行して、決定部により決定された第２のコード要素を第１のメモリから第２のメモリに転送する転送部として機能させる、プログラムも提供する。
【発明の効果】
【００１３】
本発明によれば、第１のメモリから第２のメモリへのコードの転送を、第２のメモリに転送済のコードの実行と並行して行う場合に、転送すべきコードを適切に決定することができる。
【発明を実施するための最良の形態】
【００１４】
以下、添付図面を参照して、本発明を実施するための最良の形態（以下、「実施の形態」という）について詳細に説明する。
まず、本実施の形態を適用するのに好適なコンピュータのハードウェア構成について説明する。
図１は、このようなコンピュータのハードウェア構成の一例を示した図である。
図示するように、コンピュータは、メインメモリ１０とＣＰＵ２０とがシステムバス３０を介して接続されることにより構成される。
【００１５】
メインメモリ１０は、ＣＰＵ２０が実行するコードやコードの実行に使用されるデータ等を記憶する主記憶装置である。半導体素子を利用して電気的にデータ等を記憶する。本実施の形態では、第１のメモリの一例として、メインメモリ１０を設けている。
ＣＰＵ２０は、メインメモリ１０に記憶されたデータを処理したり、各装置の制御を行ったりする処理装置である。このＣＰＵ２０は、その内部に実行ユニット２１とローカルメモリ２２とＤＭＡ（Direct Memory Access）ユニット２３とを含む。このうち、実行ユニット２１は、メインメモリ１０からローカルメモリ２２にロードされたコードを実行する演算手段である。また、ローカルメモリ２２は、実行ユニット２１が実行するコードやそのコードの実行に使用されるデータ等を記憶する記憶装置であり、メインメモリ１０よりも小容量であるが高速にアクセス可能になっている。本実施の形態では、第２のメモリの一例として、ローカルメモリ２２を設けている。更に、ＤＭＡユニット２３は、メインメモリ１０からローカルメモリ２２へのコードやデータのＤＭＡによる転送を制御する回路である。即ち、ＤＭＡ転送によるメインメモリ１０からローカルメモリ２２へのコードの転送を制御し、ＣＰＵ２０によるコードの実行と並行してコードを転送できることを前提とする。本実施の形態では、第１のコード要素の実行と並行して第２のコード要素を転送する転送部の一例として、ＤＭＡユニット２３を設けている。
【００１６】
尚、図１では、１つのＣＰＵ２０を示し、ＣＰＵ２０のコア数については言及しなかった。最も単純な例は、シングルコアプロセッサである。ところが、近年、プロセッサのマルチコア化が進み、プロセッサコアごとの小容量であるが高速なローカルメモリ２２を細かく制御できるマルチコアプロセッサも普及してきた。そこで、図１の構成はマルチコアプロセッサとして捉えてもよい。このようなプロセッサとしては、Cell Broadband Engineが例示される。このCell Broadband Engineでは、キャッシュコントロールの機能を通じてコードの転送と実行を制御することで、この手法を実現できる。図１の構成をCell Broadband Engineとして捉えた場合、ＣＰＵ２０は、８基のＳＰＥ（Synergistic Processor Element）のうちの１つに相当する。尚、Cell Broadband Engineは、Sony Computer Entertainment Inc.の登録商標である。
【００１７】
ところで、通常、ＣＰＵ２０は、メインメモリ１０に記憶されたコードをローカルメモリ２２で実行する場合、まずコードをメインメモリ１０からローカルメモリ２２に転送し、次にそのコードを実行する。その際、コードのサイズが大きくローカルメモリ２２に収容できなければ、コードを複数のセグメントに分割し、それぞれについて転送及び実行を行うことで、ローカルメモリ２２の限られた領域でコードを実行していた。
【００１８】
しかしながら、これでは、コードの転送時間がオーバーヘッドとなってしまう。
そこで、本実施の形態では、分割されたそれぞれのセグメントについて、転送及び実行を並行して行う。即ち、各プロセッサコアのローカルメモリ２２内でコード領域を明示的に制御できる場合、セグメントのローカルメモリ２２への転送を、ＤＭＡ等を用いてコードの実行と並行して行うことで、転送によるオーバーヘッドを隠蔽することができる。尚、ここで、セグメントとは、コードを構成するコード要素の一例である。
【００１９】
図２は、本実施の形態における動作の概要を模式的に示した図である。
図示するように、コードを分割して得られたコード１、コード２、コード３がメインメモリ１０に記憶されているとする。この場合、まず、コード１がメインメモリ１０からローカルメモリ２２に転送され、コード１の実行の開始と同時にコード２がメインメモリ１０からローカルメモリ２２に転送される。すると、コード１の実行が終了したときにはコード２の転送も終了しているので、転送のオーバーヘッドをかけずにコード２の実行に進むことができる。このような方法により、全体の実行時間を短縮することができる。
【００２０】
図３は、本実施の形態がもたらす効果を示した図である。このうち、（１）は、コードを分割せずに、つまり、シングルコードの単位で転送及び実行を行う場合を示す。また、（２）は、分割されたコードの単位で転送及び実行を繰り返すオーバーレイ方式の場合を示す。更に、（３）は、本実施の形態における手法であり、分割されたコードの単位で転送及び実行を並行して行う場合を示す。最下部に示すように、何れの場合も横軸は時間を示しているが、（３）の手法が（１）及び（２）の手法に比べてパフォーマンスが改善されていることが分かる。即ち、コードをセグメントに分割することで、最初のセグメントの転送が終わるとすぐにその実行を始められるので、コード全体を転送してから実行する場合に比べて短い時間で全体の実行を終えることができる。
【００２１】
ところで、（３）の手法を採用した場合、コードの実行と並行して、次に実行される可能性が高いコードがローカルメモリ２２に転送されなければ、図３に示したような大きな改善の効果は得られない。従って、次にどのセグメントを転送するかが重要になる。どのセグメントを転送すべきかは、例えば、以下のような方法で決めることができる。
Ａ．ユーザにアノテーションを付けさせ、明示的に制御させる。
Ｂ．事前にプログラムを実行してプロファイリングデータを採取し、これに基づいて自動的に決定する。
Ｃ．事前情報がない場合、プログラムを実行しながら、あるセグメントの次にどのセグメントが実行されたかを記憶しておき、次回からそのセグメントを転送する。
以上のような予測が当たれば転送のオーバーヘッドが軽減でき、外れたとしても通常通りセグメントは転送され実行される。従って、この手法を使わない場合に比べて性能を劣化させることはない。
【００２２】
以下、Ａ〜Ｃの予測方法のうち、Ｂの予測方法について、詳細に説明する。
この予測方法は、コードを事前実行してプロファイリングデータを取得しこのプロファイリングデータに基づいて転送すべきセグメントを自動決定するプログラムを構築する処理と、構築されたプログラムを動作させてコードを転送しながら実行する処理とからなる。そこで、前者をプロファイリング処理、後者をコード実行処理として順に説明する。
【００２３】
プロファイリング処理
図４は、プロファイリング処理の手順を示したフローチャートである。
図示するように、まず、コードの事前実行がメインメモリ１０上で行われる（ステップ４０１）。これにより、セグメントの実行順序が分かる。次に、このセグメントの実行順序に基づいてプロファイリングを行うことで、セグメントの転送計画が得られる（ステップ４０２）。そして、このセグメントの転送計画に基づいて、プログラムの最終構築を行う（ステップ４０３）。
【００２４】
ここで、ステップ４０１でのコードの事前実行について説明する。
図５は、コードの事前実行の具体例を示した図である。ここでは、コードが３つのセグメント「ｓｅｇｍｅｎｔ１．ｃ」、「ｓｅｇｍｅｎｔ２．ｃ」、「ｓｅｇｍｅｎｔ３．ｃ」に分けられている。そして、セグメント「ｓｅｇｍｅｎｔ１．ｃ」が関数「ｆｕｎｃ１（）」、「ｆｕｎｃ２（）」、「ｆｕｎｃ３（）」を含み、セグメント「ｓｅｇｍｅｎｔ２．ｃ」が関数「ｆｕｎｃ４（）」、「ｆｕｎｃ５（）」、「ｆｕｎｃ６（）」を含み、セグメント「ｓｅｇｍｅｎｔ３．ｃ」が関数「ｆｕｎｃ７（）」、「ｆｕｎｃ８（）」を含むものとする。
また、本実施の形態では、図示するように、各関数の開始位置に「ＦＯＯ」という文字列を記述する。そして、「＃ｄｅｆｉｎｅ  ＦＯＯ  ｌｏｇ（＿ＦＩＬＥ＿）」により、文字列「ＦＯＯ」を、各関数を含むセグメントのファイル名を引数として関数「ｌｏｇ（）」を呼び出す記述として定義しておく。尚、図では、関数「ｆｕｎｃ１（）」、「ｆｕｎｃ４（）」、「ｆｕｎｃ７（）」についてしか示していないが、他の関数にも同様の文字列を記述し同様に定義しておくものとする。
【００２５】
図６は、関数が実行される際に図５の定義に従い呼び出される関数「ｌｏｇ（）」のソースコード例を示した図である。尚、図５では、３つのセグメントしか示さなかったが、ここでは６つのセグメントがあるものとして説明する。
このソースコード例では、引数として渡されたセグメントのファイル名が「ｓｅｇｍｅｎｔ１．ｃ」、「ｓｅｇｍｅｎｔ２．ｃ」、「ｓｅｇｍｅｎｔ３．ｃ」等の何れであるかを判定し、その判定結果に基づいて、ファイルの識別子を順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」に格納している。図では、ファイル名が「ｓｅｇｍｅｎｔＮ．ｃ」である場合の「Ｎ」をファイルの識別子としている。
【００２６】
また、このソースコード例では、今回引数として渡されたファイル名に対応する識別子が順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」の現在着目している要素の１つ前の要素に格納されている場合には、その識別子を現在着目している要素には格納しないようにしている。あるセグメントに含まれる関数が同じセグメントに含まれる別の関数を呼び出した場合にこのようなことは起こるが、同じセグメント間の呼び出し関係を把握する必要はないからである。
そして、このような処理により、セグメントが実行された順序が、順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」にログとして記録される。
【００２７】
次に、ステップ４０２でのセグメントの転送計画の作成について説明する。
図７は、セグメントの転送計画の作成の具体例を示した図である。ここでは、まず、図６で生成した順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」から、セグメント間の呼び出し関係の統計情報を取得している。但し、統計情報に示したパーセンテージは、図示した順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」の例から得られる数値にはなっていない。つまり、コードの事前実行を何回も行うことにより、このようなパーセンテージが得られるものとしている。
【００２８】
次いで、このような統計情報から、あるセグメントの次に別のあるセグメントが実行される可能性に関する情報を生成する。ここでは、その一例として、セグメントごとにそのセグメントの次に実行される可能性のあるセグメントを定義した次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」を生成している。つまり、次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」において、左側の数字（インデックス）は、セグメントのファイルの識別子を示し、右側のセル内の数字は、そのセグメントの次に実行される可能性があるセグメントのファイルの識別子を示している。例えば、「ｓｅｇｍｅｎｔ１．ｃ」の次には、呼び出し頻度の高い順に「ｓｅｇｍｅｎｔ２．ｃ」か「ｓｅｇｍｅｎｔ４．ｃ」が実行される可能性があり、「ｓｅｇｍｅｎｔ２．ｃ」の次には「ｓｅｇｍｅｎｔ３．ｃ」か「ｓｅｇｍｅｎｔ４．ｃ」か「ｓｅｇｍｅｎｔ６．ｃ」が実行される可能性があることが示されている。
【００２９】
ここで、プロファイリング処理のうち上記ステップ４０１及び４０２の処理を実現するプロファイリング装置の機能構成について説明する。
図８は、プロファイリング装置５０の機能構成例を示したブロック図である。尚、このプロファイリング装置５０は、図１の構成を有するコンピュータにて実現してもよいし、他の構成を有するコンピュータにて実現してもよい。
図示するように、プロファイリング装置５０は、事前実行部５１と、順序情報生成部５２と、順序情報記憶部５３と、次セグメント情報生成部５４と、次セグメント情報記憶部５５とを備える。
【００３０】
事前実行部５１は、プロファイリング装置５０のメインメモリでコードを事前実行する。図５の例で言えば、関数「ｆｕｎｃ１（）」〜「ｆｕｎｃ８（）」を含むプログラムを実行する。
順序情報生成部５２は、事前実行部５１によりコードが事前実行される際に呼び出され、セグメントの実行順序を示す順序情報を生成する。図５、６の例で言えば、「＃ｄｅｆｉｎｅ  ＦＯＯ  ｌｏｇ（＿ＦＩＬＥ＿）」により呼び出される関数「ｌｏｇ（）」に対応する。また、順序情報は、図６に示した順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」に対応する。本実施の形態では、順序情報を記録する記録部の一例として、順序情報生成部５２を設けている。
順序情報記憶部５３は、順序情報生成部５２により生成された順序情報を記憶する。
【００３１】
次セグメント情報生成部５４は、順序情報記憶部５３に記憶された順序情報を解析し、あるセグメントの次にどのセグメントが実行される可能性があるかを示す次セグメント情報を生成する。次セグメント情報は、図７に示した次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」に対応する。つまり、次セグメント情報生成部５４は、図７に示した順序情報配列「ｅｘｅｃ＿ｏｒｄｅｒ［］」から次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」を生成する機能に対応する。本実施の形態では、コード要素の実行の順序を定義した定義情報の一例として、次セグメント情報を用い、定義情報を生成する生成部の一例として、次セグメント情報生成部５４を設けている。
次セグメント情報記憶部５５は、次セグメント情報生成部５４により生成された次セグメント情報を記憶する。
【００３２】
次に、プロファイリング装置５０の動作について説明する。
図９は、プロファイリング装置５０の動作例を示したフローチャートである。
まず、事前実行部５１は、順序情報配列の要素をカウントする変数ｉに「１」を代入し（ステップ５０１）、プログラムを事前実行する（ステップ５０２）。そして、以降、関数の呼び出しごとに、必要に応じて変数ｉをカウントアップしながら、ステップ５０３〜５０８の処理を繰り返す。ここでは、変数ｉの値を「ｉ」として説明を進める。
【００３３】
即ち、まず、事前実行部５１は、プログラムの実行が終了したかどうかを判定する（ステップ５０３）。ここで、プログラムの実行が終了したと判定されれば、ステップ５０９へ進むが、プログラムの実行が終了していないと判定されれば、プログラムに含まれる関数が実行されたことを検出する（ステップ５０４）。尚、関数が実行されたことの検出は、図５の例で言えば、文字列「ＦＯＯ」の検出に相当する。そして、この場合、実行された関数を含むセグメントのファイル名を引数として、順序情報生成部５２が呼び出される。
【００３４】
これにより、順序情報生成部５２は、渡された引数に基づいて、実行された関数を含むセグメントの識別子を取得する（ステップ５０５）。そして、取得したセグメントの識別子が、順序情報配列の現在着目している要素の１つ前の要素、つまり、ｉ−１番目の要素に格納されている識別子と等しいかどうかを判定する（ステップ５０６）。
その結果、２つの識別子が等しくないと判定された場合は、順序情報配列の現在着目している要素、つまり、ｉ番目の要素に、ステップ５０５で取得したセグメントの識別子を格納し、順序情報記憶部５３に記憶する（ステップ５０７）。そして、変数ｉに「１」を加算し（ステップ５０８）、ステップ５０３に戻る。
一方、２つの識別子が等しいと判定された場合は、同じセグメントに含まれるある関数から別の関数が呼ばれた場合等であるので、セグメントの識別子を連続して順序情報配列に格納することなく、ステップ５０３に戻る。
【００３５】
さて、関数が実行されるごとにステップ５０４〜５０８の処理を繰り返すと、そのうちステップ５０３でプログラムの実行が終了したと判定される。
すると、次セグメント情報生成部５４は、順序情報記憶部５３に記憶された順序情報配列を解析し、あるセグメントが実行されると次にどのセグメントが実行されるのかをパーセンテージで示した統計情報を生成する（ステップ５０９）。ここで、統計情報は、例えば、順序情報配列において、ある識別子が格納された複数の要素に着目し、これら複数の要素のそれぞれの次の複数の要素における識別子ごとの出現比率を計算することで簡単に生成できるので、ここでの詳しい説明は省略する。
また、次セグメント情報生成部５４は、この統計情報に基づいて、あるセグメントが実行された次に実行される可能性のあるセグメントを定義した次セグメント情報配列を生成し、次セグメント情報記憶部５５に記憶する（ステップ５１０）。
【００３６】
最後に、ステップ４０３でのプログラムの最終構築について説明する。
図１０は、構築されるプログラムの一部となるセグメントローダの呼び出し定義について示した図である。ここでも、図５と同様、コードが３つのセグメント「ｓｅｇｍｅｎｔ１．ｃ」、「ｓｅｇｍｅｎｔ２．ｃ」、「ｓｅｇｍｅｎｔ３．ｃ」に分けられている。そして、セグメント「ｓｅｇｍｅｎｔ１．ｃ」が関数「ｆｕｎｃ１（）」、「ｆｕｎｃ２（）」、「ｆｕｎｃ３（）」を含み、セグメント「ｓｅｇｍｅｎｔ２．ｃ」が関数「ｆｕｎｃ４（）」、「ｆｕｎｃ５（）」、「ｆｕｎｃ６（）」を含み、セグメント「ｓｅｇｍｅｎｔ３．ｃ」が関数「ｆｕｎｃ７（）」、「ｆｕｎｃ８（）」を含むものとする。
また、本実施の形態では、図５にも示したように、各関数の開始直後に「ＦＯＯ」という文字列が記述されている。この文字列は、図５では、各関数を含むセグメントのファイル名を引数として関数「ｌｏｇ（）」を呼び出す記述として定義されていた。これに対し、セグメントを実際にロードする場合には、「＃ｄｅｆｉｎｅ  ＦＯＯ  ｌｏａｄ（＿ＦＩＬＥ＿）」により、文字列「ＦＯＯ」を、各関数を含むセグメントのファイル名を引数として関数「ｌｏａｄ（）」を呼び出す記述として定義し直す。尚、図では、関数「ｆｕｎｃ１（）」、「ｆｕｎｃ４（）」、「ｆｕｎｃ７（）」についてしか示していないが、他の関数にも同様の文字列を記述し同様に定義しておくものとする。
【００３７】
図１１は、関数が実行される際に図１０の定義に従い呼び出される関数「ｌｏａｄ（）」のソースコード例を示した図である。尚、図１０では、３つのセグメントしか示さなかったが、ここでは６つのセグメントがあるものとして説明する。
このソースコード例では、引数として渡されたセグメントのファイル名が「ｓｅｇｍｅｎｔ１．ｃ」、「ｓｅｇｍｅｎｔ２．ｃ」、「ｓｅｇｍｅｎｔ３．ｃ」等の何れであるかを判定し、その判定結果と、次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」とに基づいて、次にロードすべきセグメントを決定している。図では、ファイル名が「ｓｅｇｍｅｎｔＮ．ｃ」である場合の「Ｎ」をファイルの識別子としている。
但し、その際、既にロード済のセグメントを改めてロードする必要はない。従って、各セグメントがローカルメモリ２２にロード済かどうかをフラグ情報配列「ｓｅｇ＿ｌｏａｄｅｄ［］」で管理し、「ＴＲＵＥ」でなければセグメントをロードするようにする。尚、セグメントのロードが完了すると、フラグ情報配列「ｓｅｇ＿ｌｏａｄｅｄ［］」に「ＴＲＵＥ」を格納する必要があるが、この処理は、例えば、関数「ｂｇ＿ｌｏａｄ＿ｓｅｇ」内で起動された別スレッドで行うとよい。また、セグメントをロードするためのローカルメモリ２２が不足した場合は、フラグ情報配列「ｓｅｇ＿ｌｏａｄｅｄ［］」が「ＴＲＵＥ」で、かつ、次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」に含まれていないセグメント領域に上書きする。その際、フラグ情報配列「ｓｅｇ＿ｌｏａｄｅｄ［］」はロード開始時に「ＦＡＬＳＥ」に書き換えられる。
【００３８】
更に、図１２は、最終的なプログラムの構築の流れを示した図である。
図示するように、セグメント「ｓｅｇｍｅｎｔ１．ｃ」、「ｓｅｇｍｅｎｔ２．ｃ」、「ｓｅｇｍｅｎｔ３．ｃ」等、及び、「ｎｏｎ−ｏｖｅｒｌａｙ．ｃ」が、リンカスクリプト（ｌｉｎｋｅｒ．ｓｃｒｉｐｔ）を指定してコンパイルされることにより、バイナリプログラムが生成される。尚、「ｎｏｎ−ｏｖｅｒｌａｙ．ｃ」は、セグメントのロードを制御するためのコードであり、図１１のセグメントローダを含んでいる。
【００３９】
コード実行処理
まず、コード実行処理を実現するコード実行装置の機能構成について説明する。
図１３は、コード実行装置６０の機能構成例を示したブロック図である。尚、このコード実行装置６０は、図１の構成を有するコンピュータにて実現される。
図示するように、コード実行装置６０では、メインメモリ１０又はローカルメモリ２２に、基本セグメント６１と第１セグメント６２と第２セグメント６３と第３セグメント６４とが格納される。
【００４０】
但し、図では、基本セグメント６１、第１セグメント６２、第２セグメント６３、第３セグメント６４のそれぞれについて、メインメモリ１０内のブロックとローカルメモリ２２内のブロックのうち、プログラムの実行開始直後に展開されているメモリ内のブロックの方を、太線で示している。つまり、基本セグメント６１は初期的にはメインメモリ１０に記憶されているが、プログラムが開始すると、矢印６９ａで示すように、ローカルメモリ２２にロードされるので、ローカルメモリ２２内の基本セグメント６１を太線で示している。また、第１セグメント６２、第２セグメント６３、第３セグメント６４は、初期的にはメインメモリ１０に記憶されており、必要に応じてローカルメモリ２２に転送されるので、メインメモリ１０内の第１セグメント６２、第２セグメント６３、第３セグメント６４を太線で示している。尚、図では、第２セグメント６３を、プログラムが実行を開始して最初に実行されるセグメント（以下、「初期実行セグメント」という）としている。つまり、第２セグメント６３は、プログラムが実行を開始して最初に、矢印６９ｂで示すように、ローカルメモリ２２にロードされる。また、図では、第３セグメント６４を、あるセグメントの次に実行されるセグメント（以下、「次期実行セグメント」という）としている。つまり、第３セグメント６４は、あるセグメント（この場合は初期実行セグメントである第２セグメント６３）が実行されると、次に、矢印６９ｃで示すように、ローカルメモリ２２にロードされる。
【００４１】
また、基本セグメント６１がローカルメモリ２２上で動作することにより、コード実行装置６０には、実行開始部６５と、コード呼び出し部６６と、セグメント転送制御部６７と、次セグメント情報保持部６８とが実現される。
【００４２】
実行開始部６５は、プログラムの実行を開始する。図１０の例で言えば、関数「ｆｕｎｃ１（）」〜「ｆｕｎｃ８（）」を含むプログラムの実行を開始する。
コード呼び出し部６６は、ローカルメモリ２２に転送されたセグメントに含まれるコードを呼び出して実行する。図１０の例で言えば、関数「ｆｕｎｃ１（）」〜「ｆｕｎｃ８（）」の実行に応じてローカルメモリ２２に転送された関数を呼び出して実行する。本実施の形態では、第１のコード要素を実行する実行部の一例として、コード呼び出し部６６を設けている。
【００４３】
セグメント転送制御部６７は、実行開始部６５から指示された初期実行セグメント、又は、次セグメント情報保持部６８を参照して決定した次期実行セグメントを、メインメモリ１０からローカルメモリ２２に転送するよう、ＤＭＡユニット２３に指示する。図１０、１１の例で言えば、「＃ｄｅｆｉｎｅ  ＦＯＯ  ｌｏａｄ（＿ＦＩＬＥ＿）」により呼び出される関数「ｌｏａｄ（）」に対応する。また、次セグメント情報は、図１１に示した次セグメント情報配列「ｎｅｘｔ＿ｓｅｇ＿ｃａｎｄｉｄａｔｅ［］」に対応する。本実施の形態では、次に転送すべき第２のコード要素を決定する決定部の一例として、セグメント転送制御部６７を設けている。
次セグメント情報保持部６８は、あるセグメントを実行した次に実行される可能性のあるセグメントの情報を保持する。尚、ここで保持される情報は、次セグメント情報記憶部５５が記憶する情報と同じである。本実施の形態では、複数のコード要素の実行の順序を定義した定義情報の一例として、次セグメント情報を用い、定義情報を記憶する記憶部の一例として、次セグメント情報保持部６８を設けている。
【００４４】
次に、コード実行装置６０の動作について説明する。
図１４は、コード実行装置６０の動作例を示したフローチャートである。
コード実行装置６０では、基本セグメント６１がメインメモリ１０からローカルメモリ２２にＤＭＡユニット２３による制御の下で転送されると、まず、実行開始部６５が、プログラムの実行を開始する（ステップ６０１）。そして、コード呼び出し部６６に対して、初期実行セグメントの呼び出しを依頼する。すると、コード呼び出し部６６は、その依頼を受け付け、セグメント転送制御部６７に対して、初期実行セグメントの転送の制御を依頼する（ステップ６０２）。この依頼があると、セグメント転送制御部６７は、ＤＭＡユニット２３に対して初期実行セグメントの転送を指示する（ステップ６０３）。これにより、ＤＭＡユニット２３は、初期実行セグメントをメインメモリ１０からローカルメモリ２２に転送する。図１３では、第２セグメント６３が初期実行セグメントであるとし、矢印６９ｂがこの時のＤＭＡ転送を示している。その後、セグメント転送制御部６７は、ＤＭＡユニット２３による初期実行セグメントの転送の完了を検出する（ステップ６０４）。
【００４５】
すると、セグメント転送制御部６７は、コード呼び出し部６６に対して、初期実行セグメントの転送が完了したことを通知し、コード呼び出し部６６が、ローカルメモリ２２に転送された初期実行セグメントの実行を開始する（ステップ６０５）。
その後、コード呼び出し部６６は、初期実行セグメントから次期実行セグメントの読み込み開始依頼を受ける（ステップ６０６）。尚、次期実行セグメントの読み込み開始依頼は、図１０の例で言えば、文字列に示した「ＦＯＯ」に相当する。そして、この場合、初期実行セグメントのファイル名を引数として、セグメント転送制御部６７が呼び出される。
【００４６】
これにより、セグメント転送制御部６７は、次期実行セグメントの候補を決定しロードする次期実行セグメント候補ロード処理を開始する（ステップ６０７）。
セグメント転送制御部６７が次期実行セグメント候補のロード処理を行っている間に、並列に実行セグメントが実行される。実行セグメント中でプログラムの実行が終了した場合（ステップ６０８）は、コード実行処理は終了する。また、プログラム実行中に次期実行セグメントの呼び出しが発生した場合、コード呼び出し部６６に対して次期実行セグメントの呼び出し依頼がなされる（ステップ６０９）。これにより、コード呼び出し部６６は、次期実行セグメントを実行することになるが、次期実行セグメントのローカルメモリ２２への転送がこの時点でまだ完了していないことも考えられる。そこで、コード呼び出し部６６は、次期実行セグメントのローカルメモリ２２への転送状況を調べる（ステップ６１０）。
【００４７】
ここで、次期実行セグメントがローカルメモリ２２へ転送済であれば、コード呼び出し部６６は、次期実行セグメントを実行し（ステップ６１１）、ステップ６０６に戻る。
また、次期実行セグメントがローカルメモリ２２へ転送中であれば、再びステップ６１０の判断を行い、ステップ６１０で転送完了と判断されれば、次期実行セグメントを実行し（ステップ６１１）、ステップ６０６に戻る。
一方、次期実行セグメントがローカルメモリ２２に転送済でもなく転送中でもない場合、セグメント転送制御部６７は、ＤＭＡユニット２３に対して、次期実行セグメントの転送を指示し（ステップ６１２）、ステップ６１０に戻る。例えば、次期実行セグメントを予測してローカルメモリ２２に転送したものの、その予測が当たらなかった場合等に、このような状況が生ずる。その後、ステップ６１０で転送完了と判断されれば、次期実行セグメントを実行し（ステップ６１１）、ステップ６０６に戻る。
【００４８】
尚、次期実行セグメントのローカルメモリ２２への転送状況は、例えば、各セグメントが転送済か未転送かを示すフラグ情報配列を参照して判定するとよい。但し、転送指示を行ったが未だ転送中である状態と転送指示を行っていない状態とを区別するには、転送済かどうかを示す情報だけでなく、転送指示済かどうかを示す情報も記録しておくことが必要となる。
【００４９】
ここで、図１４のステップ６０７における次期実行セグメント候補ロード処理について詳細に説明する。
図１５は、次期実行セグメント候補ロード処理の動作例を示したフローチャートである。
この次期実行セグメント候補ロード処理において、まず、セグメント転送制御部６７は、コード呼び出し部６６から渡された引数に基づいて、現在実行中のセグメントの識別子を取得する（ステップ６５１）。次に、セグメント転送制御部６７は、次セグメント情報保持部６８に保持された次セグメント情報を参照し、次期実行セグメントの候補を特定する（ステップ６５２）。そして、この特定した候補がローカルメモリ２２に転送されているかどうかを判定する（ステップ６５３）。尚、ここでの判定は、図１１に示したように、セグメントごとにローカルメモリ２２へ転送済かどうかを示すフラグ情報配列に基づいて判定するとよい。
【００５０】
その結果、次期実行セグメントの候補がローカルメモリ２２に転送済でなければ、セグメント転送制御部６７は、ＤＭＡユニット２３に対して、そのセグメントをメインメモリ１０からローカルメモリ２２に転送するよう指示する（ステップ６５４）。これにより、次期実行セグメントは、ＤＭＡユニット２３による制御の下、メインメモリ１０からローカルメモリ２２に転送される。図１３では、第３セグメント６４が次期実行セグメントであるとし、矢印６９ｃがこの時のＤＭＡ転送を示している。その後、セグメント転送制御部６７は、次期実行セグメントの候補がまだあるかどうかを判定する（ステップ６５５）。そして、次期実行セグメントの候補がまだあれば、ステップ６５２に戻り、もうなければ、コード呼び出し部６６に制御を戻す。
一方、次期実行セグメントの候補がローカルメモリ２２に転送済であれば、セグメント転送制御部６７は、何もせずに、次期実行セグメントの候補がまだあるかどうかを判定する（ステップ６５５）。そして、次期実行セグメントの候補がまだあれば、ステップ６５２に戻り、もうなければ、コード呼び出し部６６に制御を戻す。
【００５１】
以上、本実施の形態におけるプロファイリング処理及びコード実行処理について説明してきた。このうち、コード実行処理は、既に述べた通り、図１に示したようなメインメモリ１０とローカルメモリ２２を有するコンピュータで行われるが、プロファイリング処理は、コード実行処理を行うのと同じコンピュータで実行してもよいし、別のコンピュータで実行してもよい。
【００５２】
また、これまでの説明では、ローカルメモリ２２のサイズとセグメントのサイズを考慮しなかったが、かかるサイズを考慮した処理を行ってもよい。例えば、次期実行セグメントの候補が複数あるが、サイズの関係でそれら全てをローカルメモリ２２に転送することができないような場合もあると考えられる。そのような場合は、図７に示した統計情報を参照し、使われる可能性の高いセグメントから優先的に転送するような構成としてもよい。
【００５３】
このように、本実施の形態では、ローカルメモリ２２とセグメントサイズの許す範囲で使われる可能性の高いセグメントを複数、あらかじめ自動的に転送しておく。こうすることにより、メインメモリ１０からローカルメモリ２２に転送してコードを実行する場合のパフォーマンスを向上することができる。
【００５４】
但し、本実施の形態は、コードをメインメモリ１０からローカルメモリ２２に転送して実行する場合のみに限定されるものではない。大容量で低速な記憶装置から小容量で高速な記憶装置にコードを転送して実行する如何なる場合にも適用可能である。或いは、容量、速度に関係なく、２つのメモリを有する装置において、一方のメモリから他方のメモリにコードを転送して実行する場合にも適用可能である。
【００５５】
ここで、本発明は、全てハードウェアで実現してもよいし、全てソフトウェアで実現してもよい。また、ハードウェア及びソフトウェアの両方により実現することも可能である。また、本発明は、コンピュータ、データ処理システム、コンピュータプログラムとして実現することができる。このコンピュータプログラムは、コンピュータにより読取り可能な媒体に記憶され、提供され得る。ここで、媒体としては、電子的、磁気的、光学的、電磁的、赤外線又は半導体システム（装置又は機器）、或いは、伝搬媒体が考えられる。また、コンピュータにより読取り可能な媒体としては、半導体、ソリッドステート記憶装置、磁気テープ、取り外し可能なコンピュータディスケット、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、リジッド磁気ディスク、及び光ディスクが例示される。現時点における光ディスクの例には、コンパクトディスク−リードオンリーメモリ（ＣＤ−ＲＯＭ）、コンパクトディスク−リード／ライト（ＣＤ−Ｒ／Ｗ）及びＤＶＤが含まれる。
【００５６】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態には限定されない。本発明の精神及び範囲から逸脱することなく様々に変更したり代替態様を採用したりすることが可能なことは、当業者に明らかである。
【図面の簡単な説明】
【００５７】
【図１】本発明の実施の形態を適用可能なコンピュータのハードウェア構成を示した図である。
【図２】本発明の実施の形態の動作の概要を模式的に示した図である。
【図３】本発明の実施の形態がもたらす効果を説明するための図である。
【図４】本発明の実施の形態におけるプロファイリング処理の手順を示したフローチャートである。
【図５】本発明の実施の形態におけるプロファイリング処理を具体的に説明するための図である。
【図６】本発明の実施の形態におけるプロファイリング処理を具体的に説明するための図である。
【図７】本発明の実施の形態におけるプロファイリング処理を具体的に説明するための図である。
【図８】本発明の実施の形態におけるプロファイリング装置の機能構成例を示したブロック図である。
【図９】本発明の実施の形態におけるプロファイリング装置の動作例を示したフローチャートである。
【図１０】本発明の実施の形態におけるコード実行処理に組み込まれるプログラムを具体的に説明するための図である。
【図１１】本発明の実施の形態におけるコード実行処理に組み込まれるプログラムを具体的に説明するための図である。
【図１２】本発明の実施の形態におけるプログラムの構築を説明するための図である。
【図１３】本発明の実施の形態におけるコード実行装置の機能構成例を示したブロック図である。
【図１４】本発明の実施の形態におけるコード実行装置の動作例を示したフローチャートである。
【図１５】本発明の実施の形態におけるコード実行装置の動作例を示したフローチャートである。
【符号の説明】
【００５８】
１０…メインメモリ、２０…ＣＰＵ、２１…実行ユニット、２２…ローカルメモリ、２３…ＤＭＡユニット、３０…システムバス
【図１】
0005187944.tif 000002
【図２】
0005187944.tif 000003
【図３】
0005187944.tif 000004
【図４】
0005187944.tif 000005
【図５】
0005187944.tif 000006
【図６】
0005187944.tif 000007
【図７】
0005187944.tif 000008
【図８】
0005187944.tif 000009
【図９】
0005187944.tif 000010
【図１０】
0005187944.tif 000011
【図１１】
0005187944.tif 000012
【図１２】
0005187944.tif 000013
【図１３】
0005187944.tif 000014
【図１４】
0005187944.tif 000015
【図１５】
0005187944.tif 000016