(57)【要約】【課題】  プログラムを高速に実行し、システムの性能を向上する。【解決手段】  情報処理装置は、階層構造を有する複数の関数を含むソースプログラムにおいて、実行頻度の高い関数を、内部メモリに格納する選択関数として順次に選択する。情報処理装置は、選択関数を内部メモリの記憶領域に割り当て、選択関数から呼び出される選択関数以外の関数を内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成する。情報処理装置は、残りの関数をプロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成する。そして、プログラムが格納される内部メモリを有するプロセッサにより実行されるプログラムが生成される。階層構造を有する複数の関数のうち実行頻度の高い関数を内部メモリに割り当てることで、プログラムを高速に実行でき、システムの性能を向上できる。【選択図】    図２
2011076218.tif 000002
【特許請求の範囲】
【請求項１】
プログラムが格納される内部メモリを有するプロセッサにより実行されるプログラムを生成するプログラム生成方法であって、
情報処理装置が、階層構造を有する複数の関数を含むソースプログラムを実行し、実行頻度の高い関数を、前記内部メモリに格納する選択関数として順次に選択し、
前記情報処理装置が、前記選択関数を前記内部メモリの記憶領域に割り当て、前記選択関数から呼び出される前記選択関数以外の関数を前記内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成し、
前記情報処理装置が、残りの関数を前記プロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成すること
を特徴とするプログラム生成方法。
【請求項２】
前記外部ロードモジュールおよび前記内部ロードモジュールの少なくともいずれかは、前記外部メモリの記憶領域にロードされる前記内部ロードモジュールのうち、前記選択関数を前記内部メモリにコピーし、前記選択関数から呼び出される前記選択関数以外の関数を前記プロセッサのアドレス変換機能を用いて前記内部メモリの記憶領域に近接する領域に割り当てる管理プログラムを含むこと
を特徴とする請求項１記載のプログラム生成方法。
【請求項３】
前記情報処理装置が、前記ソースプログラムのメインルーチン直下にぶらさがる関数群毎に、前記内部メモリに格納する前記選択関数を順次に選択し、
前記情報処理装置が、前記関数群毎に前記内部ロードモジュールを生成し、
前記外部ロードモジュールは、前記外部メモリの記憶領域にロードされる前記内部ロードモジュール内の関数が前記プロセッサにより実行される前に、前記選択関数を前記内部メモリにコピーする管理プログラムを含むこと
を特徴とする請求項１記載のプログラム生成方法。
【請求項４】
前記関数群は、３以上であり、
前記内部ロードモジュール内の前記選択関数のサイズは、前記内部メモリの記憶容量の半分以下であり、
前記管理プログラムは、前記関数群の１つに対応する前記内部ロードモジュール内の前記選択関数と、前記関数群の別の１つに対応する前記内部ロードモジュール内の前記選択関数とを、前記内部メモリの記憶領域にコピーし、前記内部メモリ上の実行されていない前記選択関数を、別の内部ロードモジュールの前記選択関数に入れ替える機能を有していること
を特徴とする請求項３記載のプログラム生成方法。
【請求項５】
前記情報処理装置が、前記各関数群の中で複数の関数から呼び出される共有関数を、前記選択関数として１回のみ選択すること
を特徴とする請求項３記載のプログラム生成方法。
【請求項６】
前記情報処理装置が、複数の前記関数群から呼び出される共有関数を選択し、選択した前記共有関数を前記外部ロードモジュール内に含めること
を特徴とする請求項３記載のプログラム生成方法。
【請求項７】
メインプロセッサおよび階層構造を有する複数の関数を含むプログラムが格納される内部メモリを有する少なくとも１つのサブプロセッサを含むシステムの動作方法であって、
前記メインプロセッサからの開始指示に応答して前記サブプロセッサがプログラムを実行する毎に、実行された関数のログを保持し、
前記メインプロセッサからの次の開始指示の前に、保持された関数のログに基づいて実行頻度の高い関数を前記メインプロセッサにより選択するとともに、選択した関数を用いて前記メインプロセッサにより前記内部メモリにコピーするためのメモリイメージを作成し、
前記メインプロセッサからの前記開始指示に応答して、新たに選択された関数を前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とするシステムの動作方法。
【請求項８】
今回のプログラムを実行するサブプロセッサが、前回のプログラムを実行したサブプロセッサと同じで、かつ、保持された関数のログに基づいて選択された実行頻度の高い関数が、前回のプログラムを実行するときに選択された関数と同じとき、前記メモリイメージの作成を禁止し、
前記メインプロセッサからの前記開始指示に応答して前記サブプロセッサにより、前回のプログラムを実行するときに作成したメモリイメージを前記内部メモリにコピーすること
を特徴とする請求項７記載のシステムの動作方法。
【請求項９】
メインプロセッサおよび階層構造を有する複数の関数を含むプログラムが格納される内部メモリを有する少なくとも１つのサブプロセッサを含むシステムの動作方法であって、
前記メインプロセッサからの開始指示に応答して前記サブプロセッサがプログラムを実行する毎に、実行された関数のログを保持し、
前記サブプロセッサのアイドル期間を前記メインプロセッサにより予想し、
予想した前記アイドル期間が第１期間より長いときに、前記アイドル期間に、保持された関数のログに基づいて実行頻度の高い関数を前記サブプロセッサにより選択するとともに、選択した関数を用いて前記内部メモリにコピーするためのメモリイメージを前記サブプロセッサにより作成し、前記メインプロセッサからの前記開始指示に応答して、作成されたメモリイメージを前記サブプロセッサにより前記内部メモリにコピーし、
予想した前記アイドル期間が第１期間以下のときに、前記アイドル期間に、保持された関数のログに基づいて実行頻度の高い関数を前記サブプロセッサにより選択し、前記メインプロセッサからの前記開始指示に応答して、選択した関数を用いて前記内部メモリにコピーするためのメモリイメージを前記サブプロセッサにより作成し、作成されたメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とするシステムの動作方法。
【請求項１０】
予想した前記アイドル期間が前記第１期間より長い第２期間より長く、今回のプログラムを実行するサブプロセッサが、前回のプログラムを実行したサブプロセッサと同じで、かつ、保持された関数のログに基づいて選択された実行頻度の高い関数が、前回のプログラムを実行するときに選択された関数と同じとき、
前記メモリイメージの作成を禁止し、
前記メインプロセッサからの前記開始指示に応答して、前回のプログラムを実行するときに作成したメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とする請求項９記載のシステムの動作方法。
【請求項１１】
予想した前記アイドル期間が前記第１期間より長く、前記第２期間以下であり、今回のプログラムを実行するサブプロセッサが、前回のプログラムを実行したサブプロセッサと同じで、かつ、保持された関数のログに基づいて選択された実行頻度の高い関数と前回のプログラムを実行するときに選択された関数との一致の程度を示す有効使用率が予め設定された閾値より高いときに、
前記メモリイメージの作成を禁止し、
前記メインプロセッサからの前記開始指示に応答して、前回のプログラムを実行するときに作成したメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とする請求項１０記載のシステムの動作方法。
【請求項１２】
予想した前記アイドル期間が前記第１期間より短い第３期間以下のとき、前記アイドル期間に、実行頻度の高い関数を選択することおよび前記メモリイメージを作成することを禁止し、
前記メインプロセッサからの前記開始指示に応答して、実行頻度の高い関数を前記サブプロセッサにより選択し、前記サブプロセッサにより前記メモリイメージを作成し、作成したメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とする請求項９ないし請求項１１のいずれか１項記載のシステムの動作方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサが実行するプログラムの生成方法およびプログラムを実行するシステムの動作方法に関する。
【背景技術】
【０００２】
一般に、システムの性能を向上するために、プロセッサにより実行されるプログラムのうち一部のサブルーチンが選択され、キャッシュメモリや、高速にアクセスできる内部メモリに格納される（例えば、特許文献１参照。）。例えば、プログラムのうち分岐のないプログラムが選択され、内部メモリに格納される（例えば、特許文献２参照。）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００４−５１３９号公報
【特許文献２】特開２００７−３２３３５８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、内部メモリの記憶容量は決まっているため、選択したプログラムの全てが内部メモリに格納できるとは限らない。また、階層構造を有する構造化言語において、内部メモリに格納するプログラムの選択手法は提案されていない。さらに、プログラムの実行頻度がシステムの運用中に変わる場合がある。このとき、内部メモリに格納されているプログラムの実行頻度が下がると、システムの性能は低下する。
【０００５】
本発明の目的は、プログラムを高速に実行し、システムの性能を向上することである。
【課題を解決するための手段】
【０００６】
本発明の一形態では、プログラムが格納される内部メモリを有するプロセッサにより実行されるプログラムを生成するプログラム生成方法であって、情報処理装置が、階層構造を有する複数の関数を含むソースプログラムにおいて、実行頻度の高い関数を、内部メモリに格納する選択関数として順次に選択し、情報処理装置が、選択関数を内部メモリの記憶領域に割り当て、選択関数から呼び出される選択関数以外の関数を内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成し、情報処理装置が、残りの関数をプロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成することを特徴とする。
【発明の効果】
【０００７】
実行頻度の高いプログラムをアクセス速度が相対的に速い内部メモリに格納することにより、関数の単位時間当たりの実行回数を増やすことができる。この結果、プログラムを高速に実行でき、システムの性能を向上できる。
【図面の簡単な説明】
【０００８】
【図１】一実施形態における情報処理装置およびシステムの例を示している。
【図２】図１に示したワークステーションの動作の例を示している。
【図３】図１に示したソースプログラムから生成した関数呼び出しグラフの例を示している。
【図４】図２に示したステップＳ１２の処理の例を示している。
【図５】図２に示したステップＳ１４により生成されるロードモジュールの例を示している。
【図６】図５に示したロードモジュールを外部メモリおよび内部メモリに配置する例を示している。
【図７】別の実施形態における関数選択プログラムの例を示している。
【図８】図７に示したステップＳ１２の後に実行されるステップＳ１４により生成されるロードモジュールの例を示している。
【図９】図８に示したロードモジュールを外部メモリおよび内部メモリ内に配置する例を示している。
【図１０】別の実施形態における関数選択プログラムの例を示している。
【図１１】別の実施形態における情報処理装置およびシステムの例を示している。
【図１２】図１１に示したワークステーションにより生成されるロードモジュールの例を示している。
【図１３】図１２に示したロードモジュールを外部メモリおよび内部メモリに配置する例を示している。
【図１４】別の実施形態における関数呼び出しグラフの例を示している。
【図１５】共有関数を含むソースプログラムから内部メモリに配置する関数を選択するための関数選択プログラムの例を示している。
【図１６】図１５に示したステップＳ３００の処理の例を示している。
【図１７】別の実施形態における共有関数を含むソースプログラムから内部メモリに配置する関数を選択するための関数選択プログラムの例を示している。
【図１８】図１７に示したステップＳ４００の処理の例を示している。
【図１９】図１８に示したステップＳ５００の処理の例を示している。
【図２０】図１７に示したステップＳ１２の後に実行されるステップＳ１４により生成されるロードモジュールの例を示している。
【図２１】図２０に示したロードモジュールを外部メモリおよび内部メモリに配置する例を示している。
【図２２】図１７に示したステップＳ１２の後に実行されるステップＳ１４により生成されるロードモジュールの例を示している。
【図２３】図２２に示したロードモジュールを外部メモリおよび内部メモリ内に配置する例を示している。
【図２４】別の実施形態における情報処理装置およびシステムの例を示している。
【図２５】図２４に示したワークステーションが実行する関数選択プログラムの例を示している。
【図２６】別の実施形態における情報処理装置およびシステムの例を示している。
【図２７】図２６に示したワークステーションにより生成されるロードモジュールの例を示している。
【図２８】図２７に示したロードモジュールを外部メモリおよび内部メモリに配置する例を示している。
【図２９】図２８により配置されたロードモジュールの実行方法を示している。
【図３０】別の実施形態における情報処理装置およびシステムの例を示している。
【図３１】図３０に示したワークステーションの動作の例を示している。
【図３２】図３１のステップＳ２２により生成されるプロファイル情報の例を示している。
【図３３】図３１のステップＳ２４の処理の例を示している。
【図３４】図３１のステップＳ２６の処理の例を示している。
【図３５】図３４の処理により生成されるオブジェクトコードの例を示している。
【図３６】図３１のステップＳ２８の処理の例を示している。
【図３７】図３６のフローにより生成されるロードモジュールの例を示している。
【図３８】図３６のフローにより生成されるリンクテーブルの例を示している。
【図３９】図３０に示したシステムの動作の例を示している。
【図４０】図３９に示した主要なステップにおける動作の概要を示している。
【図４１】図３０に示したシステムの動作の概要を示している。
【図４２】図３９に示したステップＳ５２の処理の例を示している。
【図４３】図３９に示したステップＳ５４の処理の例を示している。
【図４４】図４２のフローにより生成される優先度リストと、優先度リストに基づいてシステムの動作中に生成されるリンクテーブルの例を示している。
【図４５】図４３に示したステップＳ８１０の処理の例を示している。
【図４６】図３９に示したステップＳ６０の処理の例を示している。
【図４７】別の実施形態における情報処理装置の動作の概要を示している。
【図４８】図４７に示したワークステーションにより設計された関数を実行するシステムの動作の例を示している。
【図４９】図４７に示したワークステーションにより設計された関数を実行するシステムの動作の例を示している。
【図５０】図４７に示したワークステーションにより設計された関数を実行するシステムの動作の例を示している。
【図５１】図４７に示したワークステーションにより設計された関数を実行するシステムの動作の例を示している。
【図５２】図４７に示したワークステーションにより設計された関数を実行するシステムの動作の例を示している。
【図５３】図４８から図５２に示した動作の概要を示している。
【図５４】図４７に示したワークステーションにより設計された関数を実行するシステムの動作の例を示している。
【図５５】図５４に示したステップＳ６２の処理の例を示している。
【図５６】図４７に示したフローにより生成されるリンクテーブルの例を示している。
【図５７】図５５に示したステップＳ８５０の処理の例を示している。
【発明を実施するための形態】
【０００９】
以下、実施形態を図面を用いて説明する。
【００１０】
図１は、一実施形態における情報処理装置およびシステムの例を示している。例えば、情報処理装置は、ワークステーションＷＳ等のコンピュータシステムである。ワークステーションＷＳは、ソースプログラムＳＯＵＲＣをコンパイル等して、システムＳＹＳが実行可能なプログラムＥＸＥを生成する機能を有している。ソースプログラムＳＯＵＲＣは、システムＳＹＳ内のＣＰＵが実行するために設計される。例えば、ワークステーションＷＳ内のＣＰＵは、コード選択プログラムＣＳＰＲＧ、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫをそれぞれ実行することで、ソースプログラムＳＯＵＲＣからプログラムＥＸＥを生成する。コード選択プログラムＣＳＰＲＧ、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫは、ワークステーションＷＳ内のハードディスク装置等の記憶部に格納される。特に限定されないが、コード選択プログラムＣＳＰＲＧ、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫの少なくともいずれかは、記録媒体ＳＭに格納されているものをワークステーションＷＳにダウンロードした後に実行されてもよい。あるいは、コード選択プログラムＣＳＰＲＧ、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫの少なくともいずれかは、ネットワークを介してワークステーションＷＳにダウンロードされてもよい。
【００１１】
例えば、システムＳＹＳは、携帯電話やビデオカメラなどの組み込み向けのマイクロコンピュータ応用システムであり、システムバスＳＢＵＳに接続されたＣＰＵ等のプロセッサおよび外部メモリＥＭＥＭを有している。ＣＰＵは、プロセッサコアＣＯＲＥ、メモリ管理ユニットＭＭＵおよび内部メモリＩＭＥＭを有している。内部メモリＩＭＥＭは、内部バスＩＢＵＳを介してプロセッサコアＣＯＲＥに接続されており、プロセッサコアＣＯＲＥによりアクセスされる。内部メモリＩＭＥＭのアクセス速度は、外部メモリＥＭＥＭのアクセス速度に比べて速い。
【００１２】
この実施形態では、ワークステーションＷＳにより生成されたプログラムＥＸＥは、外部メモリＥＭＥＭに転送される。さらに、外部メモリＥＭＥＭに格納されたプログラムＥＸＥのうち、実行頻度の高いプログラムは、内部メモリＩＭＥＭに転送される。実行頻度の高いプログラムは、コード選択プログラムＣＳＰＲＧにより抽出される。実行頻度の高いプログラムをアクセス速度の速い内部メモリＩＭＥＭに配置することにより、プログラムＥＸＥ内の命令コード（＝プログラムコード）の単位時間当たりの実行回数を増やすことができる。この結果、システムＳＹＳの性能を向上できる。
【００１３】
コード選択プログラムＣＳＰＲＧは、ソースプログラムＳＯＵＲＣを解析し、内部メモリＩＭＥＭに配置すべき実行頻度の高いプログラムコードを選択する。そして、ワークステーションＷＳは、コード選択プログラムＣＳＰＲＧの実行結果に基づいて、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫを実行し、外部メモリＥＭＥＭと内部メモリＩＭＥＭとにそれぞれ配置するプログラムコードの配置情報を含むプログラムＥＸＥを生成する。
【００１４】
ソースプログラムＳＯＵＲＣは、例えば、Ｃ言語等の構造化言語で記述されている。一般に、構造化言語によるプログラムは、複数の関数を多階層にネストすることで形成されている。すなわち、一つの関数から子関数、孫関数が呼び出されることで、プログラムが実行される。各関数は、所定数のプログラムコードを有する。コード選択プログラムＣＳＰＲＧは、これ等複数の関数の中から、呼び出し頻度の高い関数を抽出し、抽出した関数を内部メモリＩＭＥＭに配置する関数として割り当てる。
【００１５】
図２は、図１に示したワークステーションＷＳの動作の例を示している。図２のフローは、システムＳＹＳに格納されるプログラムの設計において実施されるプログラム生成方法を示している。まず、ステップＳ１０において、ワークステーションＷＳは、コード選択プログラムＣＳＰＲＧを実行し、ソースプログラムＳＯＵＲＣから関数呼び出しグラフを生成する。関数呼び出しグラフの例は、図３に示す。なお、関数呼び出しグラフは、コード選択プログラムＣＳＰＲＧとは異なる独立したグラフ生成プログラムを用いて生成されてもよい。あるいは、ワークステーションＷＳは、別のプログラムを用いて、ソースプログラムＳＯＵＲＣ内の関数のツリー構造および各関数の実行回数（実行頻度）を求めてもよい。
【００１６】
次に、ステップＳ１２において、ワークステーションＷＳは、コード選択プログラムＣＳＰＲＧを実行し、関数呼び出しグラフを用いて、内部メモリＩＭＥＭに配置するための実行頻度の高い関数を選択する。ステップＳ１２の具体例は、図４に示す。なお、内部メモリＩＭＥＭに配置する関数は、別のプログラムによって求められた関数のツリー構造および各関数の実行回数に基づいて選択されてもよい。コード選択プログラムＣＳＰＲＧを実行するワークステーションＷＳは、実行頻度の高い関数を、内部メモリＩＭＥＭに格納する選択関数として順次に選択する関数選択部として動作する。
【００１７】
次に、ステップＳ１４において、ワークステーションＷＳは、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫを実行し、外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置するロードモジュールを生成する。ここで、ロードモジュールは、図１に示したプログラムＥＸＥに含まれ、外部メモリＥＭＥＭおよび内部メモリＩＭＥＭにロード可能な実行ファイル形式のプログラムおよびデータである。コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫを実行するワークステーションＷＳは、ロードモジュールを生成するプログラム生成部として動作する。
【００１８】
図３は、図１に示したソースプログラムＳＯＵＲＣから生成した関数呼び出しグラフの例を示している。図中の長円は、階層化された関数を示している。太線の長円は、後述する図４のフローにより選択される内部メモリＩＭＥＭに配置する関数の例を示している。図中の矢印は、下位の関数が上位の関数から呼び出されることを示している。
【００１９】
矢印に付けた数値は、呼び出し回数（実行回数）の例を示している。この例では、メインルーチンＭＲは関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３を呼び出し、関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３は、下位の関数をそれぞれ呼び出す。関数名の”ＦＵＮＣ”の次の数字は、関数群の番号を示している。例えば、図３では、メインルーチンＭＲの下に、関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３を親関数とする３つの関数群がぶら下がっている。以降、関数ＦＵＮＣ１および関数ＦＵＮＣ１にぶら下がる関数を関数群ＦＵＮＣ１とも称する。関数群ＦＵＮＣ２−３も同様である。
【００２０】
関数呼び出しグラフを生成するために、まず、ワークステーションＷＳは、内部メモリＩＭＥＭを使用せず外部メモリＥＭＥＭのみを使用すると仮定して、ソースプログラムＳＯＵＲＣをコンパイル、アセンブルおよびリンクし、実行可能な仮のプログラムを生成する。以下の説明では、コンパイル、アセンブルおよびリンクにより実行可能なプログラムを生成することを、単にコンパイルとも称する。次に、ワークステーションＷＳは、コード選択プログラムＣＳＰＲＧを起動し、生成した仮のプログラムを実行する。プログラムは、シミュレータにより実行されてもよく、エミュレータにより実行されてもよい。そして、ワークステーションＷＳは、コンパイル結果および実行結果より、各関数のコードサイズ、実行回数および関数の呼び出し関係の情報を取得する。そして、図３に示す関数呼び出しグラフが生成される。なお、ワークステーションＷＳ上では、関数呼び出しグラフは、図３に示した情報を含むデータテーブルとして生成されてもよい。
【００２１】
図４は、図２に示したステップＳ１２の処理の例を示している。図４のフローは、コード選択プログラムＣＳＰＲＧにより実行される。まず、ステップＳ１０２において、メインルーチンＭＲが先頭の関数として選択される。また、処理の開始時において、メインルーチンＭＲは、親関数として扱われる。ステップＳ１０４において、選択されていない子関数があるとき、処理はステップＳ１０６に移行する。全ての子関数が選択されているとき、処理はステップＳ１１８に移行する。ここで、子関数は、親関数に呼び出される関数である。例えば、ステップＳ１０２の実行直後のステップＳ１０４では、親関数はメインルーチンＭＲであり、子関数は図３に示した関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３である。
【００２２】
次に、ステップＳ１０６では、未選択の子関数のうち、実行回数が最も多い子関数が選択される。例えば、子関数が図３の関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３であり、関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３のいずれも選択されていないとき、実行回数が１０回の関数ＦＵＮＣ１が選択される。次に、ステップＳ１０８において、選択された関数のコードサイズが取得される。
【００２３】
次に、ステップＳ１１０において、取得したコードサイズが内部メモリＩＭＥＭの空き領域に収まるとき、処理はステップＳ１１２に移行する。取得したコードサイズが内部メモリＩＭＥＭの空き領域に収まらないとき、処理はステップＳ１１８に移行する。ステップＳ１１２では、選択された関数を選択関数として内部メモリＩＭＥＭに搭載することが決定される。
【００２４】
次に、ステップＳ１１４において、内部メモリＩＭＥＭの空き領域が、選択した関数のコードサイズだけ減らされる。次にステップＳ１１６において、現在選択されている関数が親関数に設定される。例えば、ステップＳ１１６において、図３の関数ＦＵＮＣ１が選択されたとき、関数ＦＵＮＣ１が新たな親関数に設定される。そして、処理はステップＳ１０４に戻る。
【００２５】
一方、ステップＳ１１８では、現在の親関数より１つ上位の関数が、新たな親関数に設定される。すなわち、全ての子関数が選択されたとき、または選択された子関数が内部メモリＩＭＥＭに収まらないとき、関数呼び出しグラフ内の別の枝を探索するために親関数が上位の関数に戻される。次に、ステップＳ１２０では、現在の親関数が先頭の関数のとき（この例では、メインルーチンＭＲ）、選択可能な全ての関数が選択されたと判断され、処理は終了する。現在の親関数が先頭の関数でないとき、処理はステップＳ１０４に戻る。
【００２６】
図４の処理では、例えば、図３に太枠で示した関数ＦＵＮＣ１、ＦＵＮＣ１−２、ＦＵＮＣ１−２−１、ＦＵＮＣ１−２−２、ＦＵＮＣ１−１が、内部メモリＩＭＥＭに配置される関数として順次に選択される。換言すれば、関数ＦＵＮＣ１−１が選択された後、関数ＦＵＮＣ１−１−２は、内部メモリＩＭＥＭの空き容量が足りないために選択されず、処理は終了する。
【００２７】
図４に示した処理により、複雑にネストしている関数群から内部メモリＩＭＥＭに搭載する関数を容易に選択できる。また、内部メモリＩＭＥＭの記憶容量に合わせて、実行頻度が高い関数を選択できる。特に、階層構造を有するプログラムにおいて、上位の関数から順に実行頻度の高い関数を探索していくことで、システムＳＹＳの性能を向上するために最適な関数を選択できる。
【００２８】
図５は、図２に示したステップＳ１４により生成されるロードモジュールの例を示している。ロードモジュールは、図４の処理により選択された関数を含む関数群を含む内部ロードモジュールＩＬＤＭと、他の関数群を含む外部ロードモジュールＥＬＤＭとに分けて生成される。例えば、図４の処理により選択された関数を含む関数群は、図３の関数群ＦＵＮＣ１である。他の関数群は、関数群ＦＵＮＣ２−３である。
【００２９】
内部ロードモジュールＩＬＤＭの生成では、まず、各関数は、別々のオブジェクトコードになるようにコンパイルされる。通常のコンパイラを用いるとき、一つの入力ファイルに対して一つのオブジェクトコードが生成される。このため、各関数は、それぞれ別のファイルに分けられた後にコンパイルされる。なお、１ファイル内の関数毎にオブジェクトコードを生成する機能を持つコンパイラを用いる場合、１つのファイルから複数の関数のオブジェクトコードが生成される。
【００３０】
そして、各関数のオブジェクトコードをリンクして内部ロードモジュールＩＬＤＭが生成される。この際、図４の処理において内部メモリＩＭＥＭに配置すると決定した関数は、メインルーチンＭＲの直下の関数を先頭として内部メモリＩＭＥＭに配置するために、リンカに配置アドレスを指定してリンクさせる。また、図４の処理により選択された関数を含む関数群（例えば、ＦＵＮＣ１）のうち、選択されていない関数は、外部メモリＥＭＥＭに配置される。しかし、子関数群は、内部メモリＩＭＥＭに近接するアドレスに配置されるようにリンカに配置アドレスを指定する。
【００３１】
これは、一般に、コンパイラは、相対アドレスを用いて関数呼び出しを行うようにプログラムコードを生成するためである。例えば、アドレス空間が３２ビットのときでも、関数呼び出しできるアドレス範囲が２０ビットの場合がある。この実施形態では、内部メモリＩＭＥＭに搭載する関数から関数呼び出しできる範囲内に、選択されていない関数を配置できる。なお、図１に示したメモリ管理ユニットＭＭＵの機能を用いることで、選択されていない関数を配置するアドレスが、外部メモリＥＭＥＭとして利用できるか否かは意識する必要はない。また、内部ロードモジュールＩＬＤＭには、プログラムコード以外に、そのプログラムで利用するデータ領域なども配置する必要がある。しかし、データ領域なども、メモリ管理ユニットＭＭＵの機能を用いることにより、アドレス空間上の任意の空き領域に配置可能である。例えば、データ領域には、定数データＣＯＮＳＴ、初期値のあるデータＳＤＡＴＡおよび初期値のないデータＤＡＴＡ等が配置される。
【００３２】
一方、図４の処理により選択された関数を含む関数群以外の他の関数群（例えば、関数群ＦＵＮＣ２−３）は、外部メモリＥＭＥＭに配置されるようにコンパイルおよびリンクを行い、データ領域などとともに外部ロードモジュールＥＬＤＭとして生成される。なお、外部ロードモジュールＥＬＤＭ内のメインルーチンＭＲにおいて、図４の処理により選択された関数(例えば、図３の関数ＦＵＮＣ１）の呼び出し部分を、関数呼び出しから、内部メモリＩＭＥＭの先頭にジャンプする命令に変更しておく。ジャンプ命令は絶対アドレスで記述されるため、関数呼び出しのようにアドレス範囲の制約をなくすことができる。一般に、ジャンプ命令は、関数呼び出しより命令数が多くなる。しかし、ジャンプ命令への置き換えは、呼び出し部分のみのため、コードサイズの増加は最小限である。
【００３３】
図６は、図５に示したロードモジュールＥＬＤＭ、ＩＬＤＭを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する例を示している。まず、プロセッサコアＣＯＲＥは、イニシャルプログラムを実行し、図５に示した外部ロードモジュールＥＬＤＭを外部メモリＥＭＥＭにロードする。次に、図５に示した内部メモリＩＭＥＭに配置する関数を含む内部ロードモジュールＩＬＤＭが、リンク時のアドレス情報を無視して外部メモリＥＭＥＭの空き領域にロードされる（図６の左側の物理アドレスによるアドレスマップ）。
【００３４】
この後、外部ロードモジュールＥＬＤＭ内のイニシャルプログラムを用いて、外部メモリＥＭＥＭにロードされた関数のうち、図４の処理により選択された関数（プログラムコードＣＯＤＥ）が、内部バスＩＢＵＳを介して内部メモリＩＭＥＭにコピーされる。さらに、イニシャルプログラムを用いて、図４の処理により選択された関数(例えば、図３の関数ＦＵＮＣ１）が呼び出される前に、メモリ管理ユニットＭＭＵを利用してアドレス変換が行われる。具体的には、リンク時に設定した内部メモリＩＭＥＭのアドレス空間に近接するアドレスが、外部メモリＥＭＥＭにロードした内部ロードモジュールＩＬＤＭのアドレスにマップされる(図６の右側の論理アドレスによるアドレスマップ）。
【００３５】
このように、イニシャルプログラムは、選択された関数を内部メモリＩＭＥＭにコピーし、内部メモリＩＭＥＭ内の関数から呼び出される関数をＣＰＵのアドレス変換機能を用いて内部メモリＩＭＥＭの記憶領域に近接する領域に割り当てる管理プログラムを含む。なお、イニシャルプログラムは、内部ロードモジュールＩＬＤＭに含まれてもよい。
【００３６】
以上により、論理アドレスによるアドレスマップは、内部ロードモジュールＩＬＤＭを生成したときと同じになる。この後、プロセッサコアＣＯＲＥが、図４の処理により選択された関数(例えば、図３の関数ＦＵＮＣ１）を呼び出すためのジャンプ命令を実行することにより、内部メモリＩＭＥＭ上に配置された関数を実行できる。すなわち、システムＳＹＳの動作が開始される。
【００３７】
以上、この実施形態では、階層構造を有するプログラムの中で、実行頻度の高い関数を内部メモリＩＭＥＭの記憶容量に合わせて選択する。これにより、プログラムを高速に実行でき、システムの性能を向上できる。
【００３８】
図７は、別の実施形態における関数選択プログラムＦＳＰＲＧの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。図７は、図２に示したステップＳ１２の動作の別の例を示しており、上述した図４のフローに対応している。この実施形態の関数選択プログラムＦＳＰＲＧでは、内部メモリＩＭＥＭに配置する複数の関数群が選択される。情報処理装置（ワークステーションＷＳ）およびシステムＳＹＳの構成は、図１と同じである。
【００３９】
まず、ステップＳ２０２において、メインルーチンＭＲの直下の関数が先頭の関数として選択される。例えば、図３では、関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３が先頭の関数として選択される。次に、ステップＳ２０４において、カウンタ値ｎが”１”に初期化される。次に、ステップＳ２０６において、内部メモリＩＭＥＭｎの空き領域が初期化され、全ての領域が空き領域に設定される。ここで、内部メモリＩＭＥＭｎは、複数の関数群に対応させるためにカウンタ値ｎで識別される。各内部メモリＩＭＥＭｎのサイズは、図１のＣＰＵ内の内部メモリＩＭＥＭのサイズと同じである。
【００４０】
次に、ステップＳ２０８では、未選択の先頭関数のうち、実行回数が最も多い関数が選択される。例えば、先頭関数は図３の関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３であり、関数ＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３が未だ選択されていないとき、実行回数が１０回の関数ＦＵＮＣ１が選択される。ステップＳ２１０において、選択された関数のコードサイズが取得される。
【００４１】
次に、ステップＳ２１２において、取得したコードサイズが内部メモリＩＭＥＭｎの空き領域に収まるとき、処理はステップＳ２１４に移行する。取得したコードサイズが内部メモリＩＭＥＭｎの空き領域に収まらないとき、次の先頭関数を選択するために処理はステップＳ２０６に戻る。ステップＳ２１４では、選択された先頭関数を内部メモリＩＭＥＭｎに搭載することが決定される。
【００４２】
次に、ステップＳ２１６において、内部メモリＩＭＥＭｎの空き領域が、選択した先頭の関数のコードサイズだけ減らされる。次にステップＳ２１８では、図４に示したステップＳ１０４−Ｓ１２０が実行される。すなわち、選択された先頭関数を含む関数群について、図４のフローが実行される。次に、ステップＳ２２０において、カウンタ値ｎが最大値ｍａｘのとき、処理は終了する。カウンタ値ｎが最大値ｍａｘに達していないとき、処理はステップＳ２２２に移行する。ステップＳ２２２では、次の関数群の中から内部メモリＩＭＥＭに配置する関数を求めるため、カウンタ値ｎが”１”増加される。この後、処理は、ステップＳ２０６に戻る。以上の処理により、複数の関数群について、内部メモリＩＭＥＭに配置する関数が選択される。
【００４３】
図８は、図７に示したステップＳ１２の後に実行されるステップＳ１４（図２）により生成されるロードモジュールの例を示している。図５と同じ要素については、同じ符号を付し、詳細な説明は省略する。ロードモジュールは、図７の処理により選択された複数の関数群を含む内部ロードモジュールＩＬＤＭと、他の関数群を含む外部ロードモジュールＥＬＤＭとに分けて生成される。図８は、図７のフローにおいてカウンタ値ｎの最大値ｍａｘが”２”に設定されているときの例を示している。このため、図７の処理により、内部メモリＩＭＥＭに配置可能な２つの関数群が抽出される。
【００４４】
内部ロードモジュールＩＬＤＭのプログラムコードＣＯＤＥ（ＩＭＥＭ１）は、例えば、図３に太枠で示した関数である。内部ロードモジュールＩＬＤＭのプログラムコードＣＯＤＥ（ＥＭＥＭ１）は、例えば、関数群ＦＵＮＣ１のうち、選択されなかった関数（ＦＵＮＣ１−１−１、ＦＵＮＣ１−１−２、ＦＵＮＣ１−１−２−１、ＦＵＮＣ１−１−２−２）である。内部ロードモジュールＩＬＤＭのプログラムコードＣＯＤＥ（ＩＭＥＭ２）は、例えば、図３に示した関数ＦＵＮＣ２、ＦＵＮＣ２−２、ＦＵＮＣ２−２−２である。内部ロードモジュールＩＬＤＭのプログラムコードＣＯＤＥ（ＥＭＥＭ２）は、例えば、関数群ＦＵＮＣ２のうち、選択されなかった関数（ＦＵＮＣ２−１、ＦＵＮＣ２−２−１）である。
【００４５】
図８においても、内部ロードモジュールＩＬＤＭの生成では、まず、各関数は、別々のオブジェクトコードになるようにコンパイルされる。そして、各関数のオブジェクトコードをリンクして内部ロードモジュールＩＬＤＭが生成される。図８の内部ロードモジュールＩＬＤＭは、図７の処理で選択された２つの関数群毎にロードモジュールが生成されることを除き、図５の内部ロードモジュールＩＬＤＭと同じである。
【００４６】
図９は、図８に示したロードモジュールＥＬＤＭ、ＩＬＤＭを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する例を示している。図６と同じ要素については、同じ符号を付し、詳細な説明は省略する。
【００４７】
先ず、図６と同様に、図８に示した外部ロードモジュールＥＬＤＭが外部メモリＥＭＥＭにロードされる。次に、図８に示した内部メモリＩＭＥＭ１、ＩＭＥＭ２に配置する関数を含む２つの関数ロードモジュールが、リンク時のアドレス情報を無視して外部メモリＥＭＥＭの空き領域にロードされる（図９の左側の物理アドレスによるアドレスマップ）。
【００４８】
この後、プロセッサコアＣＯＲＥが実行するイニシャルプログラムを用いて、外部メモリＥＭＥＭにロードされた関数のうち、例えば、プログラムコードＣＯＤＥ（ＩＭＥＭ１）が、内部バスＩＢＵＳを介して内部メモリＩＭＥＭにコピーされる。さらに、図６と同様に、イニシャルプログラムを用いて、プログラムコードＣＯＤＥ（ＩＭＥＭ１）に含まれる関数(例えば、図３の関数ＦＵＮＣ１）が呼び出される前に、メモリ管理ユニットＭＭＵを利用してアドレス変換が行われる。（図９の右側の物理アドレスによるアドレスマップ）。これにより、例えば、プログラムコードＣＯＤＥ（ＥＭＥＭ１）が内部メモリＩＭＥＭのアドレス空間に近接する位置に配置される。そして、関数群ＦＵＮＣ１（プログラム）が実行される。
【００４９】
次に、関数群ＦＵＮＣ２（プログラム）が実行される前に、プロセッサコアＣＯＲＥが実行するイニシャルプログラムを用いて、プログラムコードＣＯＤＥ（ＩＭＥＭ２）が内部メモリＩＭＥＭにコピーされる。また、メモリ管理ユニットＭＭＵを利用してプログラムコードＣＯＤＥ（ＥＭＥＭ２）が内部メモリＩＭＥＭのアドレス空間に近接する位置に配置される。この後、関数ＦＵＮＣ２以下の関数群（プログラム）が実行される。以降、関数群ＦＵＮＣ１またはＦＵＮＣ２が実行される前に、内部メモリＩＭＥＭに格納しているプログラムコードＣＯＤＥ（ＩＭＥＭ）が書き換えられ、アドレス変換が行われる。このように、イニシャルプログラムは、外部メモリＥＭＥＭの記憶領域にロードされる内部ロードモジュールＩＬＤＭ内の関数がＣＰＵにより実行される前に、選択された関数を内部メモリＩＭＥＭにコピーする管理プログラムを含む。特に限定されないが、イニシャルプログラムは、外部ロードモジュールＥＬＤＭに含まれる。
【００５０】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、プロセッサコアＣＯＲＥが実行する処理に合わせて複数の関数群のいずれかを内部メモリＩＭＥＭにコピーすることで、複数の関数群のプログラムを高速に実行でき、システムＳＹＳの性能を向上できる。特に、プロセッサコアＣＯＲＥが実行する複数の関数群（例えば、関数ＦＵＮＣ１のツリーと関数ＦＵＮＣ２のツリー）の切り替え頻度が低いときに有効である。
【００５１】
図１０は、別の実施形態における関数選択プログラムＦＳＰＲＧの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。図１０は、図２に示したステップＳ１２の動作の別の例を示しており、上述した図４および図７のフローに対応している。この実施形態の関数選択プログラムＦＳＰＲＧでは、内部メモリＩＭＥＭに配置する複数の関数群が選択される。情報処理装置（ワークステーションＷＳ）およびシステムＳＹＳの構成は、図１と同じである。
【００５２】
図１０のフローは、図７のステップＳ２２０の代わりにステップＳ２２４を有している。ステップＳ２２４では、選択されていない先頭関数があるときに、ステップＳ２０６からＳ２１８を繰り返すために、処理をステップＳ２２２に移行する。これにより、メインルーチンＭＲの直下にある全ての関数群（図３のＦＵＮＣ１−３）について、内部メモリＩＭＥＭに配置する関数がサーチされる。なお、ステップＳ２２４において、実行回数が所定数以上の先頭関数のみについて内部メモリＩＭＥＭに配置する関数をサーチしてもよい。以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。
【００５３】
図１１は、別の実施形態における情報処理装置およびシステムの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。この実施形態では、システムＳＹＳに搭載されるＣＰＵは、ＤＭＡＣ（Direct Memory Access Controller）を有している。その他の構成は、コード選択プログラムＣＳＰＲＧの内容が異なることを除き図１と同じである。例えば、情報処理装置は、ワークステーションＷＳ等のコンピュータシステムである。システムＳＹＳは、組み込み向けのマイクロコンピュータ応用システムである。
【００５４】
例えば、ＤＭＡＣは、システムバスＳＢＵＳと内部バスＩＢＵＳに接続されている。ＤＭＡＣは、ＣＰＵとは非同期に動作し、外部メモリＥＭＥＭに格納されているデータを内部メモリＩＭＥＭにコピーする。
【００５５】
図１２は、図１１に示したワークステーションＷＳにより生成されるロードモジュールの例を示している。図５と同じ要素については、同じ符号を付し、詳細な説明は省略する。上述したように、ワークステーションＷＳは、コンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫを実行し、外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置するロードモジュールを生成する。外部ロードモジュールＥＬＤＭは、図５と同様に生成される。
【００５６】
この実施形態では、コード選択プログラムＣＳＰＲＧによって、３以上の関数群について内部メモリＩＭＥＭに配置する関数（ＣＯＤＥ（ＩＭＥＭ１）、ＣＯＤＥ（ＩＭＥＭ２）、ＣＯＤＥ（ＩＭＥＭ３））が抽出される。例えば、関数の抽出は、図７に示したフローを用いて行われる。但し、各プログラムコードＣＯＤＥ（ＩＭＥＭ１）、ＣＯＤＥ（ＩＭＥＭ２）、ＣＯＤＥ（ＩＭＥＭ３）のサイズは、内部メモリＩＭＥＭの記憶容量の半分に設定される。これにより、内部メモリＩＭＥＭは、常に２つの関数群のプログラムコードを保持できる。各プログラムコードＣＯＤＥのサイズは、内部メモリＩＭＥＭの記憶容量の半分より小さくてもよい。
【００５７】
図１３は、図１２に示したロードモジュールを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する例を示している。図６と同じ要素については、同じ符号を付し、詳細な説明は省略する。
【００５８】
先ず、図６と同様に、図１２に示した外部ロードモジュールＥＬＤＭおよび内部メモリＩＭＥＭ（１）、ＩＭＥＭ（２）、ＩＭＥＭ（３）に配置する関数を含む３つの関数ロードモジュールが、リンク時のアドレス情報を無視して外部メモリＥＭＥＭの空き領域にロードされる（図１３の左側の物理アドレスによるアドレスマップ）。
【００５９】
この後、プロセッサコアＣＯＲＥが実行するイニシャルプログラムを用いて、外部メモリＥＭＥＭにロードされた関数のうち、例えば、最初に実行されるプログラムコードＣＯＤＥ（ＩＭＥＭ１）が、内部メモリＩＭＥＭの最初の半分の領域にコピーされる。コピーは、プロセッサコアＣＯＲＥまたはＤＭＡＣにより行われる。また、メモリ管理ユニットＭＭＵを利用してアドレス変換が行われ、プログラムコードＣＯＤＥ（ＥＭＥＭ１）および対応するデータＣＯＮＳＴ、ＳＤＡＴＡ、ＤＡＴＡの格納領域が、内部メモリＩＭＥＭのアドレス空間に近接する領域に設定される。そして、プロセッサコアＣＯＲＥにより、最初のプログラムコードＣＯＤＥ（ＩＭＥＭ１）が実行される。
【００６０】
次に、プロセッサコアＣＯＲＥが最初のプログラムコードＣＯＤＥ（ＩＭＥＭ１）を実行中に、ＤＭＡＣにより、２番目に実行されるプログラムコードＣＯＤＥ（ＩＭＥＭ２）が、内部メモリＩＭＥＭの残りの半分の領域にコピーされる。このとき、２番目に実行する関数群へのジャンプ先アドレスは、内部メモリＩＭＥＭの残り半分の領域の先頭のアドレスに変更される。また、２番目のプログラムコードＣＯＤＥ（ＩＭＥＭ２）の実行前に、メモリ管理ユニットＭＭＵを利用してアドレス変換が行われ、プログラムコードＣＯＤＥ（ＥＭＥＭ２）および対応するデータＣＯＮＳＴ、ＳＤＡＴＡ、ＤＡＴＡの格納領域が、内部メモリＩＭＥＭのアドレス空間に近接する領域に設定される。
【００６１】
さらに、２番目のプログラムコードＣＯＤＥ（ＩＭＥＭ２）を実行中に、ＤＭＡＣにより、次に実行されるプログラムコードＣＯＤＥ（ＩＭＥＭ３）が、内部メモリＩＭＥＭの最初の半分の領域にコピーされる。そして、プログラムコードＣＯＤＥ（ＩＭＥＭ３）が実行される前に、メモリ管理ユニットＭＭＵによりアドレス変換が行われる。
【００６２】
このように、イニシャルプログラムは、関数群の１つに対応する内部ロードモジュールＩＬＤＭ内の選択された関数と、関数群の別の１つに対応する内部ロードモジュールＩＬＤＭ内の選択された関数とを、内部メモリＩＭＥＭの記憶領域にコピーし、内部メモリＩＭＥＭ上の実行されていない関数を、別の内部ロードモジュールＩＬＤＭの選択された関数に入れ替える管理プログラムを含む。また、イニシャルプログラムは、選択された関数を内部メモリＩＭＥＭにコピーし、内部メモリＩＭＥＭ内の関数から呼び出される関数をＣＰＵのアドレス変換機能を用いて内部メモリＩＭＥＭの記憶領域に近接する領域に割り当てる管理プログラムを含む。
【００６３】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、この実施形態では、内部メモリＩＭＥＭの半分の領域に２つの関数群をコピーし、ＤＭＡＣを用いて内部メモリＩＭＥＭへのコピーをバックグラウンドで行う。換言すれば、ある関数群の実行中に、ＤＭＡＣを用いて次に実行する関数群の内部メモリＩＭＥＭへのコピーを行う。これにより、複数の関数群について、内部メモリＩＭＥＭへのコピー時間を実質ゼロにしながらプログラムを高速に実行できる。この結果、システムＳＹＳの性能を向上できる。
【００６４】
図１４は、別の実施形態における関数呼び出しグラフの例を示している。図３と同じ要素については、詳細な説明は省略する。この関数呼び出しグラフは、図２に示したステップＳ１０により、図１に示したソースプログラムＳＯＵＲＣから生成される。
【００６５】
図１４では、関数ＣＦＵＮＣ１は、複数の関数ＦＵＮＣ１−２、ＦＵＮＣ２−１から呼び出される共有関数である。関数ＦＵＮＣ１−２、ＦＵＮＣ２−１が属する関数群は、互いに異なる。関数ＣＦＵＮＣ２は、複数の関数ＦＵＮＣ１−１−２、ＦＵＮＣ１−２−１から呼び出される共有関数である。関数ＦＵＮＣ１−１−２、ＦＵＮＣ１−２−１が属する関数群は、互いに同じである。
【００６６】
図１５は、共有関数を含むソースプログラムＳＯＵＲＣから内部メモリＩＭＥＭに配置する関数を選択するための関数選択プログラムＦＳＰＲＧの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。図１５は、図２に示したステップＳ１２の動作の別の例を示しており、上述した図７のフローに対応している。この実施形態の関数選択プログラムＦＳＰＲＧでは、内部メモリＩＭＥＭに配置する複数の関数群が選択される。情報処理装置（ワークステーションＷＳ）およびシステムＳＹＳの構成は、図１と同じである。
【００６７】
図１５のフローは、図７のステップＳ２１８の代わりにステップＳ３００を有している。ステップＳ３００は、後述する図１６に示すステップＳ３０２からＳ３２２を有している。なお、カウンタ値ｎの最大値ｍａｘは、”１”でもよい。この場合、１つの関数群のみが選択され、選択された関数群の中の共有関数が、効率的に内部メモリＩＭＥＭに配置される。また、ステップＳ２２０の代わりに、図１０のステップＳ２２４を適用してもよい。
【００６８】
図１６は、図１５に示したステップＳ３００の処理の例を示している。まず、ステップＳ３０２において、メインルーチンＭＲの直下の選択された関数が、先頭関数として選択される。例えば、図１４の関数ＦＵＮＣ１が最初の先頭関数として選択される。次に、ステップＳ３０４において、選択されていない子関数があるとき、処理はステップＳ３０６に移行する。全ての子関数が選択されているとき、処理はステップＳ３２０に移行する。
【００６９】
ステップＳ３０６では、未選択の子関数のうち、実行回数が最も多い子関数が選択される。例えば、図１４において、実行回数が３回の関数ＦＵＮＣ１−２が選択される。次に、ステップＳ３０８において、選択された子関数が既に選択されているとき、処理はステップＳ３０４に戻る。選択された子関数が初めて選択されたとき、処理はステップＳ３１０に移行する。ステップＳ３０８により、各関数群の中で共有される共有関数が複数回選択されることを防止できる。換言すれば、共有関数を１回のみ選択することで、共有関数が内部メモリＩＭＥＭに重複して配置されることを防止でき、内部メモリＩＭＥＭの使用効率を向上できる。
【００７０】
ステップＳ３１０において、選択された関数のコードサイズが取得される。次に、ステップＳ３１２において、取得したコードサイズが内部メモリＩＭＥＭｎの空き領域に収まるとき、処理はステップＳ３１４に移行する。取得したコードサイズが内部メモリＩＭＥＭｎの空き領域に収まらないとき、処理はステップＳ３２０に移行する。ステップＳ３１４では、選択された関数を内部メモリＩＭＥＭｎに搭載することが決定される。
【００７１】
次に、ステップＳ３１６において、内部メモリＩＭＥＭｎの空き領域が、選択した関数のコードサイズだけ減らされる。次にステップＳ３１８において、選択された関数が親関数に設定される。そして、処理はステップＳ３０４に戻る。
【００７２】
一方、ステップＳ３２０では、現在の親関数が先頭関数のとき、図１５の処理は終了し、処理は、図１５に示したステップＳ２２０に移行する。現在の親関数が先頭関数でないとき、処理はステップＳ３２２に移行する。ステップＳ３２２では、現在の親関数より１つ上位の関数が、親関数に設定され、処理はステップＳ３０４に戻る。
【００７３】
図１４において、関数ＦＵＮＣ１が先頭関数として選択されているとする。このとき、例えば、図１６のフローにより、関数ＦＵＮＣ１−２、ＣＦＵＮＣ１、ＦＵＮＣ１−２−１、ＣＦＵＮＣ２、ＦＵＮＣ１−１、ＦＵＮＣ１−１−２、ＦＵＮＣ１−１−２−１が、内部メモリＩＭＥＭに配置する関数として選択される。この後、ステップＳ３１８において、関数ＦＵＮＣ１−１−２−１が親関数に設定され、ステップＳ３２２において、関数ＦＵＮＣ１−１−２が親関数に設定される。さらに、ステップＳ３０４において、未選択の子関数として関数ＣＦＵＮＣ２が選択される。しかし、関数ＣＦＵＮＣ２は、関数ＦＵＮＣ１−２の子関数として既に選択されている。このため、処理はステップＳ３０８からステップＳ３０４に戻される。
【００７４】
このように、ステップＳ３０８により、関数群の中で共有される関数ＣＦＵＮＣ２が、複数の親関数から重複して選択されることを防止できる。この結果、関数を内部メモリＩＭＥＭに効率よく配置できる。換言すれば、内部メモリＩＭＥＭに配置される関数を増やすことができ、プログラムを高速に実行できる。
【００７５】
なお、図１４の共有関数ＣＦＵＮＣ１は、異なる関数群により共有される。このとき、共有関数ＣＦＵＮＣ１は、関数群毎に選択され、内部メモリＩＭＥＭｎに配置される。
【００７６】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、複数の親関数から呼び出される共有関数があるときに、内部メモリＩＭＥＭに関数を効率よく配置でき、プログラムを高速に実行できる。
【００７７】
図１７は、別の実施形態おける共有関数を含むソースプログラムから内部メモリＩＭＥＭに配置する関数を選択するための関数選択プログラムＦＳＰＲＧの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。図１７は、図２に示したステップＳ１２の動作の別の例を示しており、上述した図７のフローに対応している。この実施形態の関数選択プログラムＦＳＰＲＧでは、内部メモリＩＭＥＭに配置する複数の関数群が選択される。情報処理装置（ワークステーションＷＳ）およびシステムＳＹＳの構成は、図１と同じである。
【００７８】
図１７のフローは、図１５のステップＳ３００の代わりにステップＳ４００を有している。ステップＳ４００は、後述する図１８に示すステップＳ４０２からＳ４２４およびＳ５００を有している。なお、カウンタ値ｎの最大値ｍａｘは、”１”でもよい。この場合、１つの関数群のみが選択され、選択された関数群の中の共有関数が、外部メモリＥＭＥＭに配置される。また、ステップＳ２２０の代わりに、図１０のステップＳ２２４を適用してもよい。
【００７９】
図１８は、図１７に示したステップＳ４００の処理の例を示している。まず、ステップＳ４０２において、メインルーチンＭＲの直下の選択された関数が、先頭関数として選択される。例えば、図１４の関数ＦＵＮＣ１が最初の先頭関数として選択される。次に、ステップＳ４０４において、選択されていない子関数があるとき、処理はステップＳ４０６に移行する。全ての子関数が選択されているとき、処理はステップＳ４２０に移行する。
【００８０】
ステップＳ４０６では、未選択の子関数のうち、実行回数が最も多い子関数が選択される。例えば、図１４において、実行回数が３回の関数ＦＵＮＣ１−２が選択される。次に、ステップＳ４０７において、選択した関数が共有関数のとき、処理はステップＳ４２４に移行する。選択した関数が共有関数でないとき、処理はステップＳ４０８に移行する。
【００８１】
ステップＳ４０８において、選択された子関数が既に選択されているとき、処理はステップＳ４０４に戻る。選択された子関数が初めて選択されたとき、処理はステップＳ４１０に移行する。
【００８２】
ステップＳ４１０において、選択された関数のコードサイズが取得される。次に、ステップＳ４１２において、取得したコードサイズが内部メモリＩＭＥＭｎの空き領域に収まるとき、処理はステップＳ４１４に移行する。取得したコードサイズが内部メモリＩＭＥＭｎの空き領域に収まらないとき、処理はステップＳ５００に移行する。ステップＳ５００は、後述する図１９に示すステップＳ５０２からＳ５１６を有している。ステップＳ５００では、内部メモリＩＭＥＭの空き容量が足りないことによりサーチできなかった共有関数が抽出される。
【００８３】
ステップＳ４１４では、選択された関数を内部メモリＩＭＥＭｎに搭載することが決定される。次に、ステップＳ４１６において、内部メモリＩＭＥＭｎの空き領域が、選択した関数のコードサイズだけ減らされる。次にステップＳ４１８において、選択された関数が親関数に設定される。そして、処理はステップＳ４０４に戻る。
【００８４】
一方、ステップＳ４２０では、現在の親関数が先頭関数のとき、図１８の処理は終了し、処理は、図７に示したステップＳ２２０に移行する。現在の親関数が先頭関数でないとき、処理はステップＳ４２２に移行する。ステップＳ４２２では、現在の親関数より１つ上位の関数が、親関数に設定され、処理はステップＳ４０４に戻る。ステップＳ４２４では、選択された子関数は、共有関数として選択され、処理はステップＳ４２２に移行する。共有関数として選択された子関数（例えば、図１４のＣＦＵＮＣ１、ＣＦＵＮＣ２）は、後述する図２０および図２１に示すように、外部ロードモジュールＥＬＤＭとして外部メモリＥＭＥＭに配置される。
【００８５】
図１９は、図１８に示したステップＳ５００の処理の例を示している。先ず、ステップＳ５０２において、選択されていない子関数があるとき、処理はステップＳ５０４に移行する。全ての子関数が選択されているとき、処理はステップＳ５１４に移行する。
【００８６】
ステップＳ５０４では、未選択の子関数のうち、任意の子関数が選択される。次に、ステップＳ５０６において、選択した関数が共有関数のとき、処理はステップＳ５０６に移行する。選択した関数が共有関数でないとき、処理はステップＳ５０８に移行する。
【００８７】
ステップＳ５０８において、選択された子関数が既に選択されているとき、処理はステップＳ５０２に戻る。選択された子関数が初めて選択されたとき、処理はステップＳ５１０に移行する。ステップＳ５１０において、選択された関数のコードサイズが取得される。
【００８８】
一方、ステップＳ５１４では、現在の親関数より１つ上位の関数が、親関数に設定される。次に、ステップＳ５１６において、親関数が以前に選択されているとき、図１９の処理は終了し、処理は図１８に示したステップＳ４０４に移行する。親関数が以前に選択されていないとき、処理はステップＳ５０２に戻る。ステップＳ５１２では、選択された子関数は、共有関数として選択され、処理はステップＳ５１４に移行する。
【００８９】
図２０は、図１７に示したステップＳ１２の後に実行されるステップＳ１４（図２）により生成されるロードモジュールの例を示している。なお、図２０は、カウンタ値ｎの最大値ｍａｘが”２”のときに生成される内部ロードモジュールＩＬＤＭの例を示している。図５および図８と同じ要素については、同じ符号を付し、詳細な説明は省略する。この実施形態では、共有関数のプログラムコードＣＣＯＤＥは、外部ロードモジュールＥＬＤＭに配置される。その他の配置は、図８と同じである。
【００９０】
図２１は、図２０に示したロードモジュールを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する例を示している。この実施形態では、共有関数のプログラムコードＣＣＯＤＥは、メモリ管理ユニットＭＭＵを利用してアドレス変換が行われ、内部メモリＩＭＥＭのアドレス空間に近い領域に配置される。その他の配置は、図９と同じである。
【００９１】
図２２は、図１７に示したステップＳ１２の後に実行されるステップＳ１４（図２）により生成されるロードモジュールの例を示している。なお、図２２は、カウンタ値ｎの最大値ｍａｘが”１”のときに生成される内部ロードモジュールＩＬＤＭを示している。図５と同じ要素については、同じ符号を付し、詳細な説明は省略する。この実施形態では、共有関数のプログラムコードＣＣＯＤＥは、外部ロードモジュールＥＬＤＭに配置される。その他の配置は、図５と同じである。
【００９２】
図２３は、図２２に示したロードモジュールを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する例を示している。図２１と同様に、共有関数のプログラムコードＣＣＯＤＥは、メモリ管理ユニットＭＭＵを利用してアドレス変換が行われ、内部メモリＩＭＥＭのアドレス空間に近い領域に配置される。その他の配置は、図５と同じである。
【００９３】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、大量の共有関数がある場合もしくは共有関数がグローバルなデータを持つ場合は共有関数を内部メモリＩＭＥＭに配置することは適さないが、本実施形態により共有関数を外部メモリＥＭＥＭに配置しつつ、内部メモリＩＭＥＭに配置した関数の子関数として外部メモリＥＭＥＭに配置した共有関数を呼び出すことが可能になる。
【００９４】
図２４は、別の実施形態における情報処理装置およびシステムの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。この実施形態では、システムＳＹＳに搭載されるＣＰＵは、プログラムコード（命令コード）を保持するキャッシュメモリＣＡＣＨＥを有している。その他の構成は、図１と同じである。すなわち、例えば、情報処理装置は、ワークステーションＷＳ等のコンピュータシステムである。システムＳＹＳは、組み込み向けのマイクロコンピュータ応用システムである。キャッシュメモリＣＡＣＨＥは、内部バスＩＢＵＳに接続されており、内部メモリＩＭＥＭに比べて高速にアクセスできる。
【００９５】
図２５は、図２４に示したワークステーションＷＳが実行する関数選択プログラムＦＳＰＲＧの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。図２５は、図２に示したステップＳ１２の動作の別の例を示しており、上述した図４のフローに対応している。この実施形態の関数選択プログラムＦＳＰＲＧでは、命令キャッシュのキャッシュミスペナルティの多い関数が、内部メモリＩＭＥＭに配置する関数として選択される。
【００９６】
まず、ステップＳ６０２において、メインルーチンＭＲから呼び出される関数（図３のＦＵＮＣ１、ＦＵＮＣ２、ＦＵＮＣ３；先頭関数）のうち、呼び出し回数（実行回数）が最も多い関数（例えば、図３のＦＵＮＣ１）が先頭関数として選択される。
【００９７】
次に、ステップＳ６０４において、選択された関数についてキャッシュメモリＣＡＣＨＥを命令キャッシュとして用いたときのキャッシュミスペナルティが計測される。次に、ステップＳ６０６において、選択された関数のコードサイズが取得される。次に、ステップＳ６０８において、取得したコードサイズが内部メモリＩＭＥＭの空き領域に収まるとき、処理はステップＳ６１０に移行する。取得したコードサイズが内部メモリＩＭＥＭの空き領域に収まらないとき、処理はステップＳ６１８に移行する。
【００９８】
ステップＳ６１０では、選択された関数の内部メモリＩＭＥＭへの転送時間が求められる。また、内部メモリＩＭＥＭと外部メモリＥＭＥＭとのアクセス時間の差に基づいて、選択された関数を内部メモリＩＭＥＭに配置した場合に向上する性能が求められる。ここで、外部メモリＥＭＥＭのアクセス時間は、キャッシュミスしたときに必要な時間である。すなわち、内部メモリＩＭＥＭと外部メモリＥＭＥＭとのアクセス時間の差は、キャッシュミスペナルティに相当する。そして、選択された関数を内部メモリＩＭＥＭに配置するための転送時間が、選択された関数を外部メモリＥＭＥＭに配置するときのキャッシュミスペナルティに比べて優位性を持つとき、処理はステップＳ６１２に移行する。優位性と持たないとき、処理はステップＳ６１８に移行する。
【００９９】
次に、ステップＳ６１２では、選択された関数を内部メモリＩＭＥＭに搭載することが決定される。次に、ステップＳ６１４において、選択されている関数が子関数を持つとき、処理はステップＳ６１６に移行する。選択されている関数が子関数を持たないとき、処理はステップＳ６１８に移行する。
【０１００】
ステップＳ６１６では、選択されていない子関数のうち、キャッシュミスペナルティが最も大きい関数が選択され、処理は再びステップＳ６０４に移行する。この後、新たに選択された関数について、内部メモリＩＭＥＭへの転送時間とキャッシュミスペナルティとの優位性が評価され、選択された関数を内部メモリＩＭＥＭに配置するか否かが決定される。
【０１０１】
一方、ステップＳ６１８では、現在選択されている関数が先頭関数のとき、処理は終了する。現在選択されている関数が先頭関数でないとき、処理はステップＳ６２０に移行する。ステップＳ６２０では、現在選択されている関数より１つ上位の関数が新たに選択され、処理はステップＳ６１６に移行する。すなわち、先頭関数以下の別の関数について、内部メモリＩＭＥＭに配置するか否かが判定される。
【０１０２】
この実施形態において、図２のステップＳ１４で実行されるロードモジュールの生成手法は、図５と同じである。また、ロードモジュールを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する手法は、図６と同じである。なお、図２５は、メインルーチンＭＲから呼び出される関数を含む関数群のいずれかを内部メモリＩＭＥＭに配置する例について示している。しかし、メインルーチンＭＲから呼び出される関数を含む複数の関数群を内部メモリＩＭＥＭに配置してもよい。この場合、図２５のフローが関数群毎に複数回繰り返される。ロードモジュールの生成手法は、図８と同じであり、ロードモジュールを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する手法は、図９と同じである。
【０１０３】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、プログラムコードのキャッシュミスペナルティが大きいと予測される関数を内部メモリＩＭＥＭに配置することで、外部メモリＥＭＥＭのアクセス頻度を下げることができる。この結果、プログラムを高速に実行でき、システムＳＹＳの性能を向上できる。
【０１０４】
図２６は、別の実施形態における情報処理装置およびシステムの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。この実施形態では、システムＳＹＳに複数のＣＰＵ０−１が搭載されている。すなわち、システムＳＹＳは、マルチプロセッサシステムである。その他の構成は、図１と同じである。システムＳＹＳは、組み込み向けのマイクロコンピュータ応用システムである。例えば、情報処理装置は、ワークステーションＷＳ等のコンピュータシステムである。
【０１０５】
ＣＰＵ０は、図１に示したＣＰＵから内部メモリＩＭＥＭを削除しており、プロセッサコアＣＯＲＥ０およびメモリ管理ユニットＭＭＵを有している。ＣＰＵ１は、図１に示したＣＰＵと同様に、プロセッサコアＣＯＲＥ１、メモリ管理ユニットＭＭＵおよび内部メモリＩＭＥＭを有している。なお、ＣＰＵ０は、内部メモリＩＭＥＭを有していてもよい。ＣＰＵ０−１は、システムバスＳＢＵＳを介して外部メモリＥＭＥＭに接続されている。
【０１０６】
図２７は、図２６に示したワークステーションＷＳにより生成されるロードモジュールの例を示している。ロードモジュールは、プロセッサコアＣＯＲＥ０が実行する外部ロードモジュールＥＬＤＭと、プロセッサコアＣＯＲＥ１がそれぞれ実行する内部ロードモジュールＩＬＤＭ１−２とに分けて生成される。外部ロードモジュールＥＬＤＭおよび内部ロードモジュールＩＬＤＭ１−２の生成方法は、図５と同じである。
【０１０７】
例えば、図８と同様に、内部ロードモジュールＩＬＤＭ１は、関数群ＦＵＮＣ１を含み、内部ロードモジュールＩＬＤＭ２は、関数群ＦＵＮＣ２を含む。内部メモリＩＭＥＭに配置するプログラムコードＣＯＤＥ（ＩＭＥＭ１）、ＣＯＤＥ（ＩＭＥＭ２）の抽出は、例えば、図７のフローを用いてワークステーションＷＳにより実行される。
【０１０８】
ＣＰＵ１は、ＣＰＵ０からの指示を受けて内部ロードモジュールＩＬＤＭ１−２のいずれかを選択的に実行する。ＣＰＵ０によりプログラムが実行される前に、プログラムコードＣＯＤＥ（ＩＭＥＭ１またはＩＭＥＭ２）は、外部メモリＥＭＥＭからＣＰＵ１の内部メモリＩＭＥＭにコピーされる。プログラムコードＣＯＤＥ（ＥＭＥＭ１またはＥＭＥＭ２）およびデータＣＯＮＳＴ、ＳＤＡＴＡ、ＤＡＴＡの格納領域のアドレスは、メモリ管理ユニットＭＭＵにより変換される。コピーおよびアドレス変換を容易に行うために、内部ロードモジュールＩＬＤＭ１−２の各プログラムおよび各データの先頭アドレスは、互いに同一に設定される。
【０１０９】
図２８は、図２７に示したロードモジュールを外部メモリＥＭＥＭおよび内部メモリＩＭＥＭに配置する例を示している。図６および図９と同じ要素については、同じ符号を付し、詳細な説明は省略する。図２８では、外部ロードモジュールＥＬＤＭは、予め外部メモリＥＭＥＭにロードされている。
【０１１０】
例えば、内部ロードモジュールＩＬＤＭ１の実行が必要なとき、ＣＰＵ０は、プログラムコードＣＯＤＥ（ＩＭＥＭ１）の内部メモリＩＭＥＭへのコピーをＣＰＵ１に指示する。コピーの方法は、図６および図９と同じである。次に、ＣＰＵ０は、プログラムコードＣＯＤＥ（ＥＭＥＭ１）のアドレス変換（ＭＭＵ）をＣＰＵ１に指示する。アドレス変換方法は、図６および図９と同じである。そして、プログラムコードＣＯＤＥ（ＩＭＥＭ１）のコピーおよびプログラムコードＣＯＤＥ（ＥＭＥＭ１）のアドレス変換が行われた後に、ＣＰＵ１は、内部メモリＩＭＥＭの先頭アドレスにジャンプし、内部ロードモジュールＩＬＤＭ１の実行を開始する。内部ロードモジュールＩＬＤＭ１の実行後、ＣＰＵ１は、ＣＰＵ０に対して実行の終了を通知する。
【０１１１】
内部ロードモジュールＩＬＤＭ２の実行が必要なときも、上述と同様に、ＣＰＵ０からの指示により、プログラムコードＣＯＤＥ（ＩＭＥＭ２）の内部メモリＩＭＥＭへのコピーおよびプログラムコードＣＯＤＥ（ＥＭＥＭ２）のアドレス変換が行われる。この際、内部ロードモジュールＩＬＤＭ１−２の各プログラムおよび各データの先頭アドレスは、互いに同一に設定されている。このため、外部メモリＥＭＥＭ内の各プログラムおよび各データの先頭アドレスを指定することで、コピーおよびアドレス変換を容易に行うことができる。なお、システムＳＹＳが、複数の関数ロードモジュールをそれぞれ実行可能な複数のＣＰＵを有する場合、複数の関数ロードモジュールを同時に実行可能である。この場合、外部ロードモジュールＥＬＤＭから複数のＣＰＵに対して上述と同様の手順でプログラムコードのコピーおよびアドレス変換を指示し、プログラムを実行することで、複数のＣＰＵによる並列処理が可能となる。
【０１１２】
図２９は、図２８により配置されたロードモジュールの実行方法を示している。まず、ＣＰＵ０は、関数オブジェクト（図２７の関数ロードモジュールＦＤＬＭ１−２のいずれか）の実行をＣＰＵ１に指示する。この際、ＣＰＵ０は、外部メモリＥＭＥＭ上の関数オブジェクトの配置アドレスをＣＰＵ１に通知する。
【０１１３】
ＣＰＵ１は、ＣＰＵ０からの指示を受け、アドレス変換（ＭＭＵ）を行い、プログラムコードＣＯＤＥ（図２７のＣＯＤＥ（ＩＭＥＭ１）、ＣＯＤＥ（ＩＭＥＭ２）のいずれか）を内部メモリＩＭＥＭにコピーする。そして、ＣＰＵ１は、内部メモリＩＭＥＭの先頭アドレスにジャンプし、関数ロードモジュールの実行を開始する。なお、アドレス変換とコピーの順序は、逆でもよい。
【０１１４】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、システムＳＹＳが複数のプロセッサコアを有するときにも、関数の一部を内部メモリＩＭＥＭに配置することで、プログラムを高速に実行でき、システムＳＹＳの性能を向上できる。
【０１１５】
図３０は、別の実施形態における情報処理装置およびシステムの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。この実施形態では、システムＳＹＳに複数のＣＰＵ０−２が搭載されている。すなわち、システムＳＹＳは、マルチプロセッサシステムである。また、システムＳＹＳは、ログ用のバスＬＢＵＳに接続されたログバッファＬＢＵＦを有している。その他の構成は、図１と同じである。システムＳＹＳは、組み込み向けのマイクロコンピュータ応用システムである。例えば、情報処理装置は、ワークステーションＷＳ等のコンピュータシステムである。ワークステーションＷＳは、実行するコード選択プログラムＣＳＰＲＧが異なることを除き、図１と同じである。
【０１１６】
ＣＰＵ０は、図１に示したＣＰＵにログ制御回路ＬＯＧ０を追加している。ＣＰＵ１およびＣＰＵ２の機能は、ＣＰＵ０の機能と同じである。但し、内部メモリＩＭＥＭ０−３のサイズは、互いに相違してもよい。ログ制御回路ＬＯＧ０−２は、バスＬＢＵＳを介してログバッファＬＢＵＦに接続されている。各ＣＰＵ０−２は、メモリ管理ユニットＭＭＵを有している。なお、システムＳＹＳに搭載されるＣＰＵの数は、４以上でもよい。
【０１１７】
後述するように、例えば、ＣＰＵ０は、システムＳＹＳ全体の動作を制御し、ＣＰＵ１−２にプログラムの開始を指示するメインプロセッサとして動作する。ＣＰＵ１−２は、ＣＰＵ０からの開始指示を受け、複数の関数を含むプログラムを実行するサブプロセッサとして動作する。ＣＰＵ０は、プログラムの開始指示に応答してプロセッサコアＣＯＲＥ１−２により実行された関数の実行情報に基づいて、実行頻度が高い関数を内部メモリＩＭＥＭ１−２にコピーする関数に決定する機能を有する。実行された関数の情報は、ログバッファＬＢＵＦに保持される。
【０１１８】
ログ制御回路ＬＯＧ０−２は、対応するプロセッサコアＣＯＲＥ０−２が実行する関数のログを収集し、収集したログをバスＬＢＵＳを介してログバッファＬＢＵＦに書き込む。但し、この実施形態では、プロセッサコアＣＯＲＥ０が実行する関数のログは書き込まれなくてもよい。なお、ログ制御回路０−２は、収集したログに基づいて、対応するプロセッサコアＣＯＲＥ０−２が実行した各関数の実行頻度を求めてもよい。バスＬＢＵＳは、ログ制御回路ＬＯＧ０−２毎に配線されてもよく、ログ制御回路ＬＯＧ０−２に共通に配線されてもよい。
【０１１９】
図３１は、図３０に示したワークステーションＷＳの動作の例を示している。図３１のフローは、システムＳＹＳに格納されるプログラムの設計の処理を示している。図中の角の丸い四角は、プログラムやデータ等が格納されたファイルを示している。例えば、ステップＳ２０からＳ２４は、図３０に示したコード選択プログラムＣＳＰＲＧにより実施される。ステップＳ２６およびＳ２８は、図３０に示したコンパイラＣＯＭＰ、アセンブラＡＳＭおよびリンカＬＩＮＫにより実施される。但し、ステップＳ２８でのリンクテーブルＰＬＴの生成は、コード選択プログラムＣＳＰＲＧにより実施される。
【０１２０】
まず、ステップＳ２０において、ワークステーションＷＳは、設計されたソースプログラムＳＯＵＲＣを、シミュレータまたはエミュレータ等により実行する。ステップＳ２２において、ワークステーションＷＳは、ソースプログラムＳＯＵＲＣ中の実行された関数に関するプロファイル情報ＰＲＯＦを生成する。例えば、ワークステーションＷＳは、実行されたソースプログラムＳＯＵＲＣ中の関数を順次に蓄積するハードウエアカウンタを有している。プロファイル情報ＰＲＯＦは、ハードウエアカウンタに蓄積された関数を用いて生成される。ここで、ソースプログラムＳＯＵＲＣは、上述した実施形態と同様に、Ｃ言語等の構造化言語で記述されている。なお、プロファイル情報ＰＲＯＦは、図３に示した関数呼び出しグラフから生成してもよい。プロファイル情報ＰＲＯＦの例は、図３２に示す。
【０１２１】
次に、ステップＳ２４において、内部メモリＩＭＥＭ１−２に配置する関数が選択され、関数リストＦＬＩＳＴが生成される。具体的には、プロファイル情報ＰＲＯＦの中からメインルーチン直下の関数のうち処理時間率の高い関数が選択される。処理時間率の高い関数は、実行頻度の高い関数である。ステップＳ２４の例は、図３３に示す。
【０１２２】
次に、ステップＳ２６において、関数リストＦＬＩＳＴに含まれる関数のオブジェクトコードＯＢＪと、この関数にぶら下がる関数のオブジェクトコードＯＢＪがそれぞれ生成される。以降の説明では、関数と、この関数にぶら下がる関数を、関数群とも称する。オブジェクトコードＯＢＪは、任意の関数を任意の順序で内部メモリＩＭＥＭ１−２に再配置できるように、関数毎に個別に生成される。これらオブジェクトは、関数名や変数名などの各種シンボルの情報を再配置時に用いるテーブルデータとして保持し、ロード時に各シンボルに値を割り当てるオブジェクトである。
【０１２３】
また、関数リストＦＬＩＳＴに登録された関数を含む関数群を除く関数がソースプログラムＳＯＵＲＣから抽出され、１つのオブジェクトコードＯＢＪが生成される。オブジェクトコードＯＢＪは、コンパイラＣＯＭＰやアセンブラＡＳＭにより生成される。ステップＳ２６の例は、図３４に示す。
【０１２４】
次に、ステップＳ２８において、関数リストＦＬＩＳＴに登録された関数を含む関数群のオブジェクトコードＯＢＪを除くオブジェクトコードＯＢＪを用いて外部ロードモジュールＥＬＤＭが生成される。関数リストＦＬＩＳＴ登録された関数を含む関数群のオブジェクトコードＯＢＪを用いて内部ロードモジュールＩＬＤＭが生成される。この際、外部ロードモジュールＥＬＤＭは、外部メモリＥＭＥＭの領域の先頭に配置するようにリンクされる。内部ロードモジュールＩＬＤＭは、外部メモリＥＭＥＭの記憶領域のうち、内部メモリＩＭＥＭ０へコピー可能な領域に配置するようにリンクされる。ロードモジュールＥＬＤＭ、ＩＬＤＭは、リンカＬＩＮＫにより生成される。ロードモジュールＥＬＤＭ、ＩＬＤＭの例は、図３７に示す。
【０１２５】
また、内部ロードモジュールＩＬＤＭの作成時に、リンクテーブルＰＬＴ（Procedure Linkage Table）が生成される。リンクテーブルＰＬＴは、関数リストＦＬＩＳＴに登録された関数を含む関数群のオブジェクトコードＯＢＪ毎にコードサイズ、アドレスおよび呼び出す子関数の情報を有する。リンクテーブルＰＬＴの例は、図３８に示す。
【０１２６】
図３２は、図３１のステップＳ２２により生成されるプロファイル情報ＰＲＯＦの例を示している。図３２では、図３に示した関数呼び出しグラフに対応するプロファイル情報ＰＲＯＦを示している。すなわち、プロファイル情報ＰＲＯＦを作成するためのソースプログラムＳＯＵＲＣは、図３に示した関数のツリー構造を有している。
【０１２７】
プロファイル情報ＰＲＯＦは、関数名、親関数名、プログラム全体における処理時間率ＰＴＲおよびその関数から呼び出される子関数名の情報を、関数毎に有している。ここで、処理時間率ＰＴＲは、その関数の実行頻度を示す。そして、後述するように、実行頻度が高い関数が、優先的に内部メモリＩＭＥＭ１−２に配置される。
【０１２８】
図３３は、図３１のステップＳ２４の処理の例を示している。まず、ステップＳ７０２において、メインルーチンＭＲが親関数として選択される。ステップＳ７０４において、選択されていない子関数（メインルーチンの直下の関数ＦＵＮＣ１−３）があるとき、処理はステップＳ７０６に移行する。全ての子関数が選択されているとき、処理は終了する。
【０１２９】
ステップＳ７０６では、未選択の子関数のうち、任意の子関数が選択される。例えば、関数ＦＵＮＣ１が選択される。ステップＳ７０８において、選択した関数の処理時間率ＰＴＲが予め設定された閾値以上のとき、処理はステップＳ７１０に移行する。処理時間率ＰＴＲが閾値より少ないとき、処理は再びステップＳ７０４に移行する。ステップＳ７１０では、処理時間率ＰＴＲが閾値以上の関数を含む関数群を内部メモリＩＭＥＭに搭載可能であることが決定される。そして、内部メモリＩＭＥＭに搭載される関数は、関数リストＦＬＩＳＴに登録される。なお、この時点では、選択された関数を含む関数群が、内部メモリＩＭＥＭ１−２のいずれに配置されるかは決まらない。
【０１３０】
ここで、関数リストＦＬＩＳＴに登録される関数は、メインルーチンＭＲ直下の関数である。例えば、閾値が６０％に設定されるとき、図３２に示した関数ＦＵＮＣ１のみが関数リストＦＬＩＳＴに登録される。他の関数ＦＵＮＣ２、...、ＦＵＮＣＮは、処理時間率ＰＴＲが６０％より少ないため、関数リストＦＬＩＳＴに登録されない。この後、処理は、再び、ステップＳ７０４に移行する。以降では、処理時間率ＰＴＲが最も高い関数ＦＵＮＣ１が、関数リストＦＬＩＳＴに登録される例について説明する。
【０１３１】
図３４は、図３１のステップＳ２６の処理の例を示している。まず、ステップＳ７２２において、ソースプログラムＳＯＵＲＣの中で関数リストＦＬＩＳＴに登録された未処理の関数（例えば、ＦＵＮＣ１）があるとき、処理はステップＳ７２４に移行する。関数リストＦＬＩＳＴに登録された全ての関数が選択されたとき、処理はステップＳ７２６に移行する。
【０１３２】
次に、ステップＳ７２４において、関数リストＦＬＩＳＴに登録された未処理の関数が単一のファイル（プログラム）として切り出される。さらに、関数リストＦＬＩＳＴに登録された関数にぶら下がる関数（例えば、ＦＵＮＣ１−１、ＦＵＮＣ１−２等）が、単一のファイル（プログラム）としてそれぞれ切り出される。切り出されたファイルは、ソースプログラムＳＯＵＲＣから削除される。ステップＳ７２２、Ｓ７２４の処理により、関数リストＦＬＩＳＴに登録された関数ＦＵＮＣ１を先頭とする関数ツリー（関数群ＦＵＮＣ１とも称する）が、ソースプログラムＳＯＵＲＣから切り出される。
【０１３３】
次に、ステップＳ７２６において、関数群ＦＵＮＣ１が削除されたソースプログラムＳＯＵＲＣと、ソースプログラムＳＯＵＲＣから切り出された関数群ＦＵＮＣ１を含むプログラムが順次読み出される。ステップＳ７２８において、読み出されたプログラムが、関数群ＦＵＮＣ１に含まれるとき、処理はステップＳ７３０に移行する。読み出されたプログラムが、関数群ＦＵＮＣ１に含まれないとき、すなわち、ソースプログラムＳＯＵＲＣのとき、処理はステップＳ７３２に移行する。
【０１３４】
ステップＳ７３０では、関数群ＦＵＮＣ１についてＤＬＬ（Dynamic Link Library）コンパイルがそれぞれ行われ、再配置可能な複数のオブジェクトコードＯＢＪが生成される。ステップＳ７３２では、関数群ＦＵＮＣ１が削除されたソースプログラムＳＯＵＲＣがコンパイルされ、単一のオブジェクトコードＯＢＪが生成される。なお、実際の処理では、全てのプログラムのオブジェクトコードＯＢＪが生成されるまで、ステップＳ７２８、Ｓ７３０、Ｓ７３２の処理が繰り返される。
【０１３５】
図３５は、図３４の処理により生成されるオブジェクトコードＯＢＪの例を示している。図３４のステップＳ７２４により、関数群ＦＵＮＣ１の１つ１つが単一のファイルに分割される（図３５（ａ））。上述したように、分割されたファイルは、ソースプログラムＳＯＵＲＣから削除される。そして、図３４のステップＳ７３０により分割されたファイルから個別のオブジェクトコードＯＢＪが生成される（図３５（ｂ））。また、図３４のＳ７３２により、関数群ＦＵＮＣ１が削除されたソースプログラムＳＯＵＲＣから１つのオブジェクトコードＯＢＪが生成される（図３５（ｃ））。
【０１３６】
なお、１ファイル内の関数毎にオブジェクトコードＯＢＪを生成する機能を持つコンパイラを用いる場合、１つのファイルから複数の関数のオブジェクトコードが生成される。このとき、分割すべき関数は、１つのファイルに纏められ、このファイルから複数のオブジェクトコードＯＢＪが生成される。
【０１３７】
図３６は、図３１のステップＳ２８の処理の例を示している。図３６のフローにおいて、ステップＳ７５６を除く処理は、コード選択プログラムＣＳＰＲＧにより実行される。ステップＳ７５６は、リンカＬＩＮＫにより実行される。
【０１３８】
まず、ステップＳ７４２において、外部メモリＥＭＥＭの先頭アドレスがアドレスＡＤ０に設定される。また、外部メモリＥＭＥＭのアドレス空間において内部メモリＩＭＥＭ０に対応する領域の先頭アドレス（対応アドレス）がアドレスＡＤ１に設定される。ここで、内部メモリＩＭＥＭ０と、内部メモリＩＭＥＭ０に対応する外部メモリＥＭＥＭの領域は、メモリ管理ユニットＭＭＵによって関連付けられる。例えば、アドレスＡＤ０−１は、レジスタに格納される。
【０１３９】
次に、ステップＳ７４４において、アドレスＡＤ０−１で示される領域のいずれにも配置されていないオブジェクトコードＯＢＪがあるとき、処理はステップＳ７４６に移行する。全てのオブジェクトコードＯＢＪがアドレスＡＤ０−１で示される領域のいずれに配置されたとき、処理はステップＳ７５６に移行する。ステップＳ７４６では、配置されていないオブジェクトコードＯＢＪが、再配置可能なオブジェクトコードＯＢＪのとき（すなわち、関数群ＦＵＮＣ１）、処理はステップＳ７４８に移行する。配置されていないオブジェクトコードＯＢＪが再配置可能なオブジェクトコードＯＢＪでないとき（すなわち、関数群ＦＵＮＣ１以外）、処理はステップＳ７５４に移行する。
【０１４０】
ここで、再配置可能なオブジェクトコードＯＢＪは、図３４のステップＳ７３０により生成された関数リストＦＬＩＳＴに含まれる関数（例えば、ＦＵＮＣ１）およびこの関数にぶら下がる関数（例えば、ＦＵＮＣ１−１、ＦＵＮＣ１−２等）のオブジェクトコードＯＢＪである。再配置可能でないオブジェクトコードＯＢＪは、図３４のステップＳ７３２により生成された関数の一部が削除されたソースプログラムＳＯＵＲＣから生成されたオブジェクトコードＯＢＪである。
【０１４１】
ステップＳ７４８において、再配置可能なオブジェクトコードＯＢＪが、アドレスＡＤ１により示される外部メモリＥＭＥＭの領域に配置される。次に、ステップＳ７５０において、外部メモリＥＭＥＭの領域に配置されたオブジェクトコードＯＢＪの情報が、リンクテーブルＰＬＴに格納される。次に、ステップＳ７５２において、アドレスＡＤ１が外部メモリＥＭＥＭの領域に新たに配置されたオブジェクトコードＯＢＪのサイズだけ増加される。この後、処理は再びステップＳ７４４に移行する。
【０１４２】
一方、ステップＳ７５４では、ソースプログラムＳＯＵＲＣから生成されたオブジェクトコードＯＢＪが、アドレスＡＤ０により示される外部メモリＥＭＥＭの領域に配置される。この後、処理は再びステップＳ７４４に移行する。以上の処理を繰り返すことにより、オブジェクトコードＯＢＪは、アドレスＡＤ０またはＡＤ１により示される外部メモリＥＭＥＭの領域に順次に配置される。そして、全てのオブジェクトコードＯＢＪが外部メモリＥＭＥＭの領域に配置された後、処理はステップＳ７５６に移行する。ステップＳ７５６では、リンカＬＩＮＫにより全てのオブジェクトコードＯＢＪがリンクされ、ロードモジュールＬＤＭが生成される。ここで、ロードモジュールＬＤＭは、外部メモリＥＭＥＭに配置される外部ロードモジュールＥＬＤＭと、外部メモリＥＭＥＭに配置され、内部メモリＩＭＥＭ０−２にコピー可能な内部ロードモジュールＩＬＤＭを含む。
【０１４３】
図３７は、図３６のフローにより生成されるロードモジュールＥＬＤＭ、ＩＬＤＭの例を示している。図５と同じ要素については、詳細な説明は省略する。外部ロードモジュールＥＬＤＭは、図５と同じでもよい。内部ロードモジュールＩＬＤＭは、内部メモリＩＭＥＭ０に対応する外部メモリＥＭＥＭの領域の先頭から順に配置される。特に限定されないが、プロセッサコアＣＯＲＥ０の内部メモリＩＭＥＭ０に対応する領域の先頭アドレスは、０ｘ２０００００００である。プロセッサコアＣＯＲＥ１の内部メモリＩＭＥＭ１に対応する領域の先頭アドレスは、０ｘ４０００００００である。プロセッサコアＣＯＲＥ２の内部メモリＩＭＥＭ２に対応する領域の先頭アドレスは、０ｘ６０００００００である。
【０１４４】
内部ロードモジュールＩＬＤＭのサイズが、内部メモリＩＭＥＭ０に対応する領域のサイズより大きいとき、内部ロードモジュールＩＬＤＭは、内部メモリＩＭＥＭ１に対応する領域にはみ出して配置される。但し、内部メモリＩＭＥＭ１に対応する領域にはみ出した内部ロードモジュールＩＬＤＭは、内部メモリＩＭＥＭ１にコピーされるのではなく、外部メモリＥＭＥＭに配置された関数としてアクセスされる。内部ロードモジュールＩＬＤＭが、内部メモリＩＭＥＭ２に対応する領域まではみ出したときも、はみ出した関数は、外部メモリＥＭＥＭに配置された関数としてアクセスされる。
【０１４５】
図３８は、図３６のフローにより生成されるリンクテーブルＰＬＴの例を示している。リンクテーブルＰＬＴには、関数（オブジェクトコードＯＢＪ）毎に、コードサイズ、アドレスおよび呼び出す子関数の情報が格納される。また、リンクテーブルＰＬＴは、リンクテーブルＰＬＴに登録された関数を実行するプロセッサコアＣＯＲＥ（ＣＯＲＥ１またはＣＯＲＥ２）を示すＩＤを保持する領域を有している。ここで示すアドレスとは、設計時において、各コアの内部メモリＩＭＥＭへコピーを行う領域を、ＣＯＲＥ０であれば０ｘ２００００００、ＣＯＲＥ１であれば０ｘ４０００００００とするように、事前に設定しておくものである。このアドレスを基に、各関数のオブジェクトコードを配置していく。ＤＭＡＣはこのアドレスを先頭アドレスとして内部メモリＩＭＥＭへコピーを行う。
【０１４６】
図３９は、図３０に示したシステムＳＹＳの動作の例を示している。システムＳＹＳは、図３６で生成されたロードモジュール内の関数をプロセッサコアＣＯＲＥ０−２により実行することで動作する。システムＳＹＳが動作するとき、まず、プロセッサコアＣＯＲＥ０によりイニシャル処理ＩＮＩＴ（ステップＳ４０からＳ４６）が実行される。ステップＳ４０では、図３１のステップＳ２８により生成されたロードモジュールＬＤＭ（ＥＬＤＭおよびＩＬＤＭ）とリンクテーブルＰＬＴが外部メモリＥＭＥＭにロードされる（図４０（ａ））。外部ロードモジュールＥＬＤＭは、システムＳＹＳの動作中に動作するリンカ（以下、アクティブリンカＡＬＩＮＫとも称する）を含む。ステップＳ４０の処理は、例えば、プロセッサコアＣＯＲＥ０内の内蔵ＲＯＭに格納されたプログラムにより実行される。
【０１４７】
次に、ステップＳ４２において、プロセッサコアＣＯＲＥ０は、外部メモリＥＭＥＭにロードした外部ロードモジュールＥＬＤＭ内のイニシャルプログラムを実行する。ステップＳ４４において、イニシャルプログラムにより、アクティブリンカＡＬＩＮＫがプロセッサコアＣＯＲＥ０の内部メモリＩＭＥＭ０にロードされる（図４０（ｂ））。次に、ステップＳ４６において、イニシャルプログラムにより、外部メモリＥＭＥにロードされたリンクテーブルＰＬＴ内のデータは、ログバッファＬＢＵＦにロードされる（図４０（ｃ））。
【０１４８】
以降の動作において、ログバッファＬＢＵＦ内のリンクテーブルＰＬＴが参照され、更新される。例えば、ログバッファＬＢＵＦは、アクティブリンカＡＬＩＮＫが配置される内部メモリＩＭＥＭ０に近接するアドレス空間に配置される。これにより、アクティブリンカＬＩＮＫがリンクテーブルＰＬＴにアクセスするときのアドレスのビット数を最小限にできる。図４７以降に示す実施形態においても、同様の理由により、アクティブリンカＡＬＩＮＫは、内部メモリＩＭＥＭ０−２にそれぞれ配置される。このとき、ログバッファＬＢＵＦは、内部メモリＩＭＥＭ０−２に近接するアドレス空間に配置される、
次に、ステップＳ４８において、プロセッサコアＣＯＲＥ０が実行するスケジューラにより、プログラムを実行するために関数ＦＵＮＣ１が呼び出される。このとき、スケジューラは、関数ＦＵＮＣ１を実行するＣＯＲＥ（ＣＯＲＥ１またはＣＯＲＥ２）も指示する。
【０１４９】
次に、ステップＳ５０において、プロセッサコアＣＯＲＥ０が実行するアクティブリンカＡＬＩＮＫは、前回実行された関数群ＦＵＮＣ１の情報を示すログをログバッファＬＢＵＦから読み出す。また、アクティブリンカＡＬＩＮＫは、ログバッファＬＢＵＦ内のリンクテーブルＰＬＴのデータを読み出す（図４０（ｄ））。
【０１５０】
次に、ステップＳ５２において、アクティブリンカＡＬＩＮＫは、読み出したログに基づいて関数群ＦＵＮＣ１内の関数の優先度を解析し、優先度の高い関数を列記した優先度リストＰＬＩＳＴを内部メモリＩＭＥＭ０に作成する（図４０（ｅ））。具体的には、実行頻度の高い関数が、優先度の高い関数として優先度リストＰＬＩＳＴに登録される。この際、関数ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥの内部メモリＩＭＥＭにコピー可能なサイズのオブジェクコードＯＢＪが、優先度リストＰＬＩＳＴに登録される。オブジェクトコードＯＢＪのサイズは、リンクテーブルＰＬＴのデータから認識される。
【０１５１】
次に、ステップＳ５４において、アクティブリンカＡＬＩＮＫは、作成した優先度リストＰＬＩＳＴに基づいて、オブジェクトコードＯＢＪを並び替える。そして、アクティブリンカＡＬＩＮＫは、関数群ＦＵＮＣ１のうち、内部メモリＩＭＥＭ１またはＩＭＥＭ２にコピーする関数をメモリイメージＭＩＭＧとして作成する（図４０（ｆ））。メモリイメージＭＩＭＧとは、複数の関数のプログラムコードを１つにまとめ、メモリに配置するものを指す。作成されたメモリイメージＭＩＭＧは、内部メモリＩＭＥＭ０に配置される。さらに、アクティブリンカＡＬＩＮＫは、新たに作成された優先度リストＰＬＩＳＴに基づいて、ログバッファＬＢＵＦ内のリンクテーブルＰＬＴの情報を更新する。これにより、最新の優先度リストＰＬＩＳＴに対応する情報が、リンクテーブルＰＬＴに書き込まれる。
【０１５２】
次に、ステップＳ５６において、アクティブリンカＡＬＩＮＫは、作成したメモリイメージＭＩＭＧを、内部ロードモジュールＩＬＤＭとして、割当先のプロセッサコアＣＯＲＥ１の内部メモリＩＭＥＭ１にコピーする（図４０（ｇ））。あるいは、アクティブリンカＡＬＩＮＫは、作成したメモリイメージＭＩＭＧを、内部ロードモジュールＩＬＤＭとして、割当先のプロセッサコアＣＯＲＥの内部メモリＩＭＥＭ２にコピーする。
【０１５３】
次に、ステップＳ５８において、スケジューラは、関数群ＦＵＮＣ１の実行をプロセッサコアＣＯＲＥ（ＣＯＲＥ１またはＣＯＲＥ２）に指示する。指示を受けたプロセッサコアＣＯＲＥは、メモリイメージＭＩＭＧを内部メモリＩＭＥＭ（ＩＭＥＭ１またはＩＭＥＭ２）にコピーし、コピーした関数群ＦＵＮＣ１の先頭にジャンプする。これにより、関数群ＦＵＮＣ１（プログラム）の実行が開始される。呼び出し頻度の高い関数を、外部メモリＥＭＥＭではなく、内部メモリＩＭＥＭに配置することで、プログラムを高速に実行でき、システムＳＹＳの性能を向上できる。特に、システムＳＹＳの動作中に内部メモリＩＭＥＭに配置される関数を入れ替えるため、各関数の実行回数が動作中に変化するシステムＳＹＳにおいて、大きな性能向上効果を得ることができる。
【０１５４】
ステップＳ６０では、関数群ＦＵＮＣ１のうち新たに実行された関数のログが収集される。この後、処理は再びステップＳ４８に移行する。
【０１５５】
図４０は、図３９に示した主要なステップにおける動作の概要を示している。図３９で説明したように、ステップＳ４４では、外部ロードモジュールＥＬＤＭ内のアクティブリンカＡＬＩＮＫがプロセッサコアＣＯＲＥ０の内部メモリＩＭＥＭ０にコピーされる。ステップＳ４６では、設計時に作成されたリンクテーブルＰＬＴがログバッファＬＢＵＦにコピーされる。
【０１５６】
ステップＳ５０では、ログバッファＬＢＵＦに保持されているログ（関数の実行結果を示す情報）およびリンクテーブルＰＬＴの情報が内部メモリＩＭＥＭ０にコピーされる。ステップＳ５２では、実行頻度の高い関数が列記された優先度リストＰＬＩＳＴが作成される。ステップＳ５４では、内部メモリＩＭＥＭ（ＩＭＥＭ１またはＩＭＥＭ２）にコピーする関数群がメモリイメージＭＩＭＧとして作成される。ステップＳ５６では、メモリイメージＭＩＭＧが内部メモリＩＭＥＭにコピーされる。
【０１５７】
図４１は、図３０に示したシステムＳＹＳの動作の概要を示している。図４１は、図３９のステップＳ４８からＳ６０が繰り返し実行される様子を示している。プロセッサコアＣＯＲＥ０の斜線は、システムＳＹＳの動作全体を管理するスケジューラまたはアクティブリンカＡＬＩＮＫの動作を示している。アクティブリンカＡＬＩＮＫは、システムＳＹＳの実行中に動作してメモリイメージＭＩＭＧを生成するリンカである。プロセッサコアＣＯＲＥ１−２の斜線は、対応する内部メモリＩＭＥＭ１−２にメモリイメージＭＩＭＧ（関数）をコピーするための処理を示している。プロセッサコアＣＯＲＥ０−２の白抜きは、関数の実行を示している。ログバッファＬＢＵＦの白抜きは、上述した設計工程において選択された実行頻度の高い関数群ＦＵＮＣ１のうち、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２により実行された関数のログがログバッファＬＢＵＦに保持されることを示している。
【０１５８】
この実施形態では、予め選択された実行頻度の高い関数群ＦＵＮＣ１が、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２により実行される。関数群ＦＵＮＣ２−３は、プロセッサコアＣＯＲＥ０−２のいずれが実行してもよい。関数群ＦＵＮＣ１−３を実行するプロセッサコアＣＯＲＥ０−２は、プロセッサコアＣＯＲＥ０が実行するスケジューラにより決められる。
【０１５９】
まず、アクティブリンカＡＬＩＮＫは、プロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行を指示する前に、プロセッサコアＣＯＲＥ１に対応する優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧを作成し、新たなメモリイメージＭＩＭＧに対応するようにリンクテーブルＰＬＴを更新する（図４１（ａ））。優先度リストＰＬＩＳＴには、関数リストＦＬＩＳＴに含まれる関数（この例では、ＦＵＮＣ１）を含む関数群のうち、実行頻度の高い回数が登録されている。優先度リストＰＬＩＳＴは、図４２に示すように、内部メモリＩＭＥＭ１のサイズに合わせて作成される。優先度リストＰＬＩＳＴの例は、図４４に示す。
【０１６０】
この後、スケジューラは、プロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行を指示する（ＦＵＮＣ１  ｓｔａｒｔ）。プロセッサコアＣＯＲＥ１は、新たに作成されたメモリイメージＭＩＭＧを内部メモリＩＭＥＭ１にコピーする（図４１（ｂ））。この後、プロセッサコアＣＯＲＥ１は、関数群ＦＵＮＣ１（プログラム）を実行する（図４１（ｃ））。関数群ＦＵＮＣ１のうちプロセッサコアＣＯＲＥ１により実行された関数のログは、ログ制御回路ＬＯＧ１を介してログバッファＬＢＵＦに書き込まれる（図４１（ｄ））。すなわち、ＣＰＵ０からの開始指示に応答してＣＰＵ１がプログラムを実行する毎に、実行された関数のログがログバッファＬＢＵＦに順次に保持される。
【０１６１】
次に、スケジューラは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ２の実行を指示する（ＦＵＮＣ２  ｓｔａｒｔ）。関数群ＦＵＮＣ２は、実行頻度の高い関数群として選択されていない。このため、関数群ＦＵＮＣ２のメモリイメージＭＩＭＧは、外部ロードモジュールＥＬＤＭとして外部メモリＥＭＥＭに格納されている。プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ２のメモリイメージＭＩＭＧを内部メモリＩＭＥＭ２にコピーする（図４１（ｅ））。この後、プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ２（プログラム）を実行する（図４１（ｆ））。
【０１６２】
プロセッサコアＣＯＲＥ０は、スケジューラの非動作期間に、関数群ＦＵＮＣ３等のプログラムを実行可能である（図４１（ｇ））。例えば、スケジューラは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ２の実行を再び指示する（ＦＵＮＣ２  ｓｔａｒｔ）。これにより、プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ２のメモリイメージＭＩＭＧを内部メモリＩＭＥＭ２にコピーし、関数群ＦＵＮＣ２（プログラム）を実行する（図４１（ｈ））。
【０１６３】
次に、アクティブリンカＡＬＩＮＫは、スケジューラからの情報により、プロセッサコアＣＯＲＥ１が関数群ＦＵＮＣ１を実行することを検出する。アクティブリンカＡＬＩＮＫは、上述と同様に、優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成する（図４１（ｉ））。すなわち、ＣＰＵ０は、次の開始指示の前に、ログバッファＬＢＵＦに保持された関数のログに基づいて実行頻度の高い関数を選択し、選択した関数を用いて内部メモリＩＭＥＭ０にコピーするためのメモリイメージＭＩＭＧを作成し、リンクテーブルＰＬＴを更新する。
【０１６４】
この後、スケジューラは、プロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行を指示する（ＦＵＮＣ１  ｓｔａｒｔ）。プロセッサコアＣＯＲＥ１は、上述と同様に、メモリイメージＭＩＭＧを内部メモリＩＭＥＭ１にコピーし、関数群ＦＵＮＣ１を実行する（図４１（ｊ））。
【０１６５】
次に、アクティブリンカＡＬＩＮＫは、スケジューラからの情報により、プロセッサコアＣＯＲＥ２が関数群ＦＵＮＣ１を実行することを検出する。アクティブリンカＡＬＩＮＫは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ１の実行を指示する前に、プロセッサコアＣＯＲＥ２に対応する優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧを作成し、新たなメモリイメージＭＩＭＧに対応するようにリンクテーブルＰＬＴを更新する（図４１（ｋ））。この際、優先度リストＰＬＩＳＴは、内部メモリＩＭＥＭ２のサイズに合わせて作成される。
【０１６６】
この後、スケジューラは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ１の実行を指示する（ＦＵＮＣ１  ｓｔａｒｔ）。プロセッサコアＣＯＲＥ２は、新たに作成されたメモリイメージＭＩＭＧを内部メモリＩＭＥＭ２にコピーする（図４１（ｌ））。そして、プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ１（プログラム）を実行する（図４１（ｍ））。関数群ＦＵＮＣ１のうちプロセッサコアＣＯＲＥ２により実行された関数のログは、ログ制御回路ＬＯＧ２を介してログバッファＬＢＵＦに書き込まれる（図４１（ｎ））。すなわち、ＣＰＵ０からの開始指示に応答してＣＰＵ２がプログラムを実行する毎に、実行された関数のログがログバッファＬＢＵＦに順次に保持される。
【０１６７】
図４２は、図３９に示したステップＳ５２の処理の例を示している。図４２のフローは、プロセッサコアＣＯＲＥ０が実行するアクティブリンカＡＬＩＮＫにより実行される。まず、ステップＳ７６２において、関数群ＦＵＮＣ１のメモリイメージＭＩＭＧをコピーする内部メモリＩＭＥＭ（ＩＭＥＭ１またはＩＭＥＭ２）のサイズが取得される。ステップＳ７６４において、ログバッファＬＢＵＦに保持されている関数の中から実行頻度の高い関数が対象関数として選択される。例えば、選択される関数は、メインルーチンＭＲ直下の関数である。
【０１６８】
次に、ステップＳ７６６において、対象関数のコードサイズが取得される。次に、ステップＳ７６８おいて、取得したコードサイズが内部メモリＩＭＥＭの空き領域に収まるとき、処理はステップＳ７７０に移行する。取得したコードサイズが内部メモリＩＭＥＭの空き領域に収まらないとき、処理は終了する。
【０１６９】
ステップＳ７７０では、対象関数の内部メモリＩＭＥＭへの搭載が決定される。また、対象関数が優先度リストＰＬＩＳＴに登録される。次に、ステップＳ７７２において、内部メモリＩＭＥＭの空き領域が、対象関数のコードサイズだけ減らされる。
【０１７０】
次に、ステップＳ７７４において、選択されていない子関数があるとき、処理はステップＳ７７６に移行する。全ての子関数が選択されているとき、処理はステップＳ７７８に移行する。ステップＳ７７６において、未選択の子関数のうち、実行回数が最も多い子関数が、対象関数として選択される。この後、処理は、ステップＳ７６６に戻る。一方、ステップＳ７７８では、現在選択している対象関数の親関数が、新たに対象関数として選択される。この後、処理は再びステップＳ７７４に移行する。以上の処理により、実行頻度が高く、かつ内部メモリＩＭＥＭ１（またはＩＭＥＭ２）にコピー可能な最適なコードサイズの複数の関数が、優先度リストＰＬＩＳＴに登録される。
【０１７１】
図４３は、図３９に示したステップＳ５４の処理の例を示している。図４３のフローは、プロセッサコアＣＯＲＥ０が実行するアクティブリンカＡＬＩＮＫにより実行される。まず、ステップＳ８０２において、関数群ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥ（ＣＯＲＥ１またはＣＯＲＥ２）が、前回実行したプロセッサコアＣＯＲＥと同じとき、処理はステップＳ８０４に移行する。プロセッサコアＣＯＲＥが前回割り当てられたプロセッサコアＣＯＲＥと異なるとき、処理はステップＳ８０６に移行する。
【０１７２】
ステップＳ８０４において、リンクテーブルＰＬＴに格納されている関数が、優先度リストＰＬＩＳＴの関数と同じとき、新たなメモリイメージＭＩＭＧの作成は禁止され、処理は終了する。この場合、図３９に示したステップＳ５６において、前回のプログラムを実行したときに使用されたメモリイメージＭＩＭＧが再度内部メモリＩＭＥＭにコピーされる。一方、リンクテーブルＰＬＴに格納されている関数が、優先度リストＰＬＩＳＴの関数と異なるとき、処理はステップＳ８０８に移行する。
【０１７３】
ステップＳ８０６において、前回と異なるプロセッサコアＣＯＲＥ（ＣＯＲＥ１またはＣＯＲＥ２）により関数群ＦＵＮＣ１を実行するために、関数群ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥにアクセスされる内部メモリＩＭＥＭのサイズが取得される。次に、ステップＳ８０８において、リンクテーブルＰＬＴの情報が優先度リストＰＬＩＳＴに合わせて変更される。次に、ステップＳ８１０において、関数の読み出し命令が変更される。すなわち、メモリイメージＭＩＭＧ内の最初の関数を呼び出すためのジャンプ先が、メモリイメージＭＩＭＧが格納される内部メモリＩＭＥＭのアドレスに応じて変更される。この後、ステップＳ８１２において、メモリイメージＭＩＭＧが作成され、処理が終了する。
【０１７４】
図４４は、図４２のフローにより生成される優先度リストＰＬＩＳＴと、優先度リストＰＬＩＳＴに基づいてシステムＳＹＳの動作中に生成されるリンクテーブルＰＬＴの例を示している。例えば、リンクテーブルＰＬＴの初期状態は、図３８と同じである。プロセッサコアＣＯＲＥ０またはＣＯＲＥ１によるプログラムの実行により、図３９のステップＳ５２に示したように、優先度リストＰＬＩＳＴは変更される。これに伴い、図３９のステップＳ５４に示したように、リンクテーブルＰＬＴの情報は、システムＳＹＳの動作中に、優先度リストＰＬＩＳＴに合わせて変更される。
【０１７５】
図４５は、図４３に示したステップＳ８１０の処理の例を示している。例えば、ソースプログラムＳＯＵＲＣを実行するプロセッサコアＣＯＲＥがＣＯＲＥ０からＣＯＲＥ１に変わる場合、プログラムのジャンプ先は、内部メモリＩＭＥＭ０の先頭アドレス（０ｘ２０００００００）から内部メモリＩＭＥＭ１の先頭アドレス（０ｘ４０００００００）に変更される。
【０１７６】
図４６は、図３９に示したステップＳ６０の処理の例を示している。図４６の左側は、関数群ＦＵＮＣ１を前回実行したときにログバッファＬＢＵＦに格納されたログＬＯＧ（ｔ−１）を示しており、図３に対応している。図４６の右側は、関数群ＦＵＮＣ１を今回実行したときにログバッファＬＢＵＦに格納されたログＬＯＧ（ｔ）を示している。なお、図４６に示しているように、関数毎の実行回数は、図３０に示したログ制御回路ＬＯＧ１またはＬＯＧ２により求められてもよい。
【０１７７】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、システムＳＹＳがプログラムを実行中に、内部メモリＩＭＥＭ１−２内の関数を、プログラムによる関数の実行状況に合わせて入れ替えることで、常に実行頻度の高い関数を内部メモリＩＭＥＭ１−２に保持できる。この結果、プログラムを高速に実行でき、システムＳＹＳの性能を向上できる。特に、この実施形態は、入力データによって各関数の実行回数が大きく変わるシステムＳＹＳに適用する場合に有効である。
【０１７８】
また、この実施形態では、選択された関数群（例えば、ＦＵＮＣ１）の実行がＣＰＵ１またはＣＰ２に割り当てられたときに、対応する内部メモリＩＭＥＭ１またはＩＭＥＭ２のアドレスを取得する。そして、内部メモリＩＭＥＭ１またはＩＭＥＭ２のサイズを考慮して優先度リストＰＬＩＳＴを作成し、内部メモリＩＭＥＭ１またはＩＭＥＭ２に配置する関数を選択する。このため、この実施形態は、選択された関数群の実行を割り当てるＣＰＵが実行直前まで不明なシステムに適用する場合に有効である。特に、内部メモリＩＭＥＭ１−２のサイズが互いに異なるヘテロジニアスマルチコアプロセッサシステムを対象とする場合に有効である。これは、プログラムの設計時には、選択された関数群を格納する内部メモリのアドレスおよびサイズが不明なため、関数群を内部メモリに割り当てられないためである。マルチプロセッサシステムでは、実行回数の多い関数を内部メモリに最大限配置するためには、関数を実行するプロセッサコアが決定した後に、内部メモリのサイズと各関数のオブジェクトサイズを考慮して、内部メモリに配置する関数を選択する必要がある。
【０１７９】
図４７は、別の実施形態における情報処理装置の動作の概要を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。例えば、情報処理装置は、ワークステーションＷＳ等のコンピュータシステムである。ワークステーションＷＳは、実行するコード選択プログラムＣＳＰＲＧが異なることを除き、図３０と同じである。ワークステーションＷＳにより生成された外部ロードモジュールＥＬＤＭおよび内部ロードモジュールＩＬＤＭは、図３０に示したシステムＳＹＳにロードされる。ロードされた外部ロードモジュールは、プロセッサコアＣＯＲＥ０により実行される。ロードされた内部ロードモジュールＩＬＤＭは、プロセッサコアＣＯＲＥ１−２のいずれかにより実行される。
【０１８０】
図４７のフローは、図３１のフローにステップＳ３０、Ｓ３２を追加している。ステップＳ２０からＳ２８までの処理は、図３１と同じである。ステップＳ３０では、内部ロードモジュールＩＬＤＭを実行するプロセッサコアＣＯＲＥ１−２のアイドル時間の閾値ＴＬ、ＴＭ、ＴＳが設定される。例えば、閾値ＴＬ、ＴＭ、ＴＳは、クロックサイクル数で表される。クロックサイクル数は、ＴＬ（long）＞ＴＭ(middle)＞ＴＳ（short）の順で大きい。
【０１８１】
この実施形態では、後述するように、プロセッサコアＣＯＲＥ０が実行するスケジューラは、システムＳＹＳの実行中にプロセッサコアＣＯＲＥ１−２のアイドル時間を予想する。そして、プロセッサコアＣＯＲＥ０が実行するスケジューラは、予想したアイドル時間と閾値ＴＬ、ＴＭ、ＴＳとを比較し、比較結果に応じて、優先度リストＰＬＩＳＴを作成するプロセッサコアＣＯＲＥおよびリンクテーブルＰＬＴを更新するプロセッサコアＣＯＲＥを決める。
【０１８２】
ステップＳ３２では、リンクテーブルＰＬＴの有効使用率ＥＵＲの閾値Ｍを設定する。有効利用率ＥＵＲは、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２によるプログラムの実行直後のリンクテーブルＰＬＴ内の関数のうち、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２が次に実行するプログラムで利用可能な関数の割合を示す。有効利用率ＥＵＲの求め方は図５２に示す。
【０１８３】
図４８は、図４７に示したワークステーションＷＳにより設計された関数を実行するシステムＳＹＳの動作の例を示している。図４１と同じ動作については、詳細な説明は省略する。システムＳＹＳは、図３０と同じである。すなわち、システムＳＹＳは、複数のＣＰＵ０−２を有する組み込み向けのマイクロコンピュータ応用システムである。プロセッサコアＣＯＲＥ０の斜線は、システムＳＹＳの動作全体を管理するスケジューラまたはアクティブリンカＡＬＩＮＫの動作を示している。プロセッサコアＣＯＲＥ１−２の斜線は、アクティブリンカＡＬＩＮＫの動作および対応する内部メモリＩＭＥＭ１−２に関数をコピーするための処理を示している。プロセッサコアＣＯＲＥ０−２の白抜きは、関数の実行を示している。ログバッファＬＢＵＦの白抜きは、実行された関数がログバッファＬＢＵＦに保持されることを示している。
【０１８４】
この実施形態では、予め選択された実行頻度の高い関数群ＦＵＮＣ１が、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２により実行される。関数群ＦＵＮＣ２−３は、プロセッサコアＣＯＲＥ０−２のいずれが実行してもよい。関数群ＦＵＮＣ１−３を実行するプロセッサコアＣＯＲＥ０−２は、プロセッサコアＣＯＲＥ０が実行するスケジューラにより決められる。
【０１８５】
この例では、プロセッサコアＣＯＲＥ１−２が関数群ＦＵＮＣ１を実行する直前のアイドル時間Ｔｉｄｌｅは、閾値ＴＭより長い。また、前回の関数群ＦＵＮＣ１の実行により更新された優先度リストＰＬＩＳＴは、前回の関数群ＦＵＮＣ１の実行時のリンクテーブルＰＬＴと異なる。例えば、更新された優先度リストＰＬＩＳＴとリンクテーブルＰＬＴとの一致の程度を示す有効使用率ＥＵＲは、閾値Ｍ（例えば８０％）以下である。
【０１８６】
まず、スケジューラは、プロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行を指示する（ＦＵＮＣ１  ｓｔａｒｔ）。プロセッサコアＣＯＲＥ１は、関数群ＦＵＮＣ１を実行する前に、アクティブリンカＡＬＩＮＫを起動し、優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧを作成し、新たなメモリイメージＭＩＭＧに対応するようにリンクテーブルＰＬＴを更新する。優先度リストＰＬＩＳＴは、内部メモリＩＭＥＭ１のサイズに合わせて作成される。次に、プロセッサコアＣＯＲＥ１により実行されるアクティブリンカＡＬＩＮＫは、作成したメモリイメージＭＩＭＧを内部メモリＩＭＥＭ１にコピーする（図４８（ａ））。この後、プロセッサコアＣＯＲＥ１は、関数群ＦＵＮＣ１（プログラム）を実行する（図４８（ｂ））。プロセッサコアＣＯＲＥ１により実行された関数群ＦＵＮＣ１中の関数のログは、ログ制御回路ＬＯＧ１を介してログバッファＬＢＵＦに書き込まれる（図４８（ｃ））
次に、スケジューラは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ２の実行を指示する（ＦＵＮＣ２  ｓｔａｒｔ）。関数群ＦＵＮＣ２は、実行頻度の高い関数群として選択されていない。このため、関数群ＦＵＮＣ２のメモリイメージＭＩＭＧは、外部ロードモジュールＥＬＤＭとして外部メモリＥＭＥＭに格納されている。プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ２のメモリイメージＭＩＭＧを内部メモリＩＭＥＭ２にコピーする（図４８（ｄ））。この後、プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ２（プログラム）を実行する（図４８（ｅ））。
【０１８７】
プロセッサコアＣＯＲＥ０は、スケジューラの非動作期間に、関数群ＦＵＮＣ３等のプログラムを実行する（図４８（ｆ））。また、プロセッサコアＣＯＲＥ０は、関数群ＦＵＮＣ２の終了（ｒｅｔｕｒｎ）に応答して、次にプロセッサコアＣＯＲＥ２で実行するプログラムのスケジューリングを実施する。プロセッサコアＣＯＲＥ０は、関数群ＦＵＮＣ１の終了（ｒｅｔｕｒｎ）に応答して、プロセッサコアＣＯＲＥ１で実行する次のプログラムのためのスケジューリングを実施する。
【０１８８】
例えば、次にプロセッサコアＣＯＲＥ１が関数群ＦＵＮＣ１を実行するとき、スケジューラは、関数群ＦＵＮＣ１を実行するまでのプロセッサコアＣＯＲＥ１のアイドル時間Ｔｉｄｌｅを予想する。この例では、予想したアイドル時間Ｔｉｄｌｅは閾値ＴＭより長い。このため、スケジューラは、次に関数群ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥ１に、前回の関数群ＦＵＮＣ１の実行結果に基づいて優先度リストＰＬＩＳＴの作成を指示する（図４８（ｇ））。
【０１８９】
プロセッサコアＣＯＲＥ１は、アクティブリンカＡＬＩＮＫを起動して新たな優先度リストＰＬＩＳＴを作成した後、有効使用率ＥＵＲを求める。そして、有効使用率ＥＵＲの値が小さいため、プロセッサコアＣＯＲＥ１は、新たな優先度リストＰＬＩＳＴに合わせて、メモリイメージＭＩＭＧを作成し、リンクテーブルＰＬＴを更新する（図４８（ｈ））。アイドル時間Ｔｉｄｌｅが長いときに、プロセッサコアＣＯＲＥ１によりメモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成することで、プロセッサコアＣＯＲＥ０の負荷を減らすことができ、システムＳＹＳの性能を向上できる。
【０１９０】
次に、スケジューラは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ２の実行を指示する（ＦＵＮＣ２  ｓｔａｒｔ）。プロセッサコアＣＯＲＥ２は、上述と同様に、関数群ＦＵＮＣ２のメモリイメージＭＩＭＧを内部メモリＩＭＥＭ２にコピーし、関数群ＦＵＮＣ２を実行する（図４８（ｉ））。
【０１９１】
次に、スケジューラは、プロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行を指示する（ＦＵＮＣ１  ｓｔａｒｔ）。このとき、プロセッサコアＣＯＲＥ１は、アイドル時間Ｔｉｄｌｅを利用して、優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成済みである。このため、プロセッサコアＣＯＲＥ１は、関数群ＦＵＮＣ１のメモリイメージＭＩＭＧを内部メモリＩＭＥＭ１にコピーするだけで、プログラムを実行できる（図４８（ｊ））。
【０１９２】
プロセッサコアＣＯＲＥ１により関数群ＦＵＮＣ１が実行されているとき、スケジューラは、次にプロセッサコアＣＯＲＥ２により関数群ＦＵＮＣ１を実行することを決め、プロセッサコアＣＯＲＥ２のアイドル時間Ｔｉｄｌｅを予想する。スケジューラは、プロセッサコアＣＯＲＥ２に、前回の関数群ＦＵＮＣ１の実行結果に基づいて優先度リストＰＬＩＳＴの作成を指示する（図４８（ｋ））。プロセッサコアＣＯＲＥ２は、アクティブリンカＡＬＩＮＫを起動する。この例では、プロセッサコアＣＯＲＥ１が関数群ＦＵＮＣ１を実行中のため、優先度リストＰＬＩＳＴは、図４８の最初の関数群ＦＵＮＣ１の実行結果に基づいて、内部メモリＩＭＥＭ２のサイズに合わせて作成される。
【０１９３】
関数群ＦＵＮＣ１を実行するプロセッサコアは、ＣＯＲＥ１からＣＯＲＥ２に切り替えられる。このため、優先度リストＰＬＩＳＴとリンクテーブルＰＬＴとの比較（例えば、有効使用率ＥＵＲによる判定）は不要である。プロセッサコアＣＯＲＥ２は、新たな優先度リストＰＬＩＳＴに合わせて、メモリイメージＭＩＭＧを作成し、リンクテーブルＰＬＴを更新する（図４８（ｌ））。
【０１９４】
この後、スケジューラは、プロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ１の実行を指示する（ＦＵＮＣ１  ｓｔａｒｔ）。プロセッサコアＣＯＲＥ２は、関数群ＦＵＮＣ１のメモリイメージＭＩＭＧを内部メモリＩＭＥＭ１にコピーし、関数群ＦＵＮＣ１を実行する（図４８（ｍ））。関数群ＦＵＮＣ１の実行ログは、ログバッファＬＢＵＦに書き込まれる（図４８（ｎ））。
【０１９５】
図４９は、図４７に示したワークステーションＷＳにより設計された関数を実行するシステムＳＹＳの動作の別の例を示している。システムＳＹＳは、図３０と同じである。図４８と同じ動作については、詳細な説明は省略する。
【０１９６】
この例では、図４８と同様に、プロセッサコアＣＯＲＥ１−２が関数群ＦＵＮＣ１を実行する直前のアイドル時間Ｔｉｄｌｅは、閾値ＴＭより長い。一方、更新された優先度リストＰＬＩＳＴとリンクテーブルＰＬＴとの一致の程度を示す有効使用率ＥＵＲは、閾値Ｍ（例えば８０％）より大きい。例えば、前回の関数群ＦＵＮＣ１の実行により更新された優先度リストＰＬＩＳＴは、前回の関数群ＦＵＮＣ１の実行時のリンクテーブルＰＬＴと一致している。
【０１９７】
有効使用率ＥＵＲが高いとき、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成は禁止され、前回使用したものが利用される（図４９（ａ））。その他の動作は、図４８と同様である。有効使用率ＥＵＲが高いときに、前回使用したメモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを利用することで、プロセッサコアＣＯＲＥ０−２が行う処理を軽減でき、システムＳＹＳの性能を向上できる。
【０１９８】
なお、関数群ＦＵＮＣ１を実行するプロセッサコアがＣＯＲＥ１からＣＯＲＥ２に切り替えられるとき、プロセッサコアＣＯＲＥ２は、図４８と同様に、新たな優先度リストＰＬＩＳＴに合わせて、メモリイメージＭＩＭＧを作成し、リンクテーブルＰＬＴを更新する（図４９（ｂ））。
【０１９９】
図５０は、図４７に示したワークステーションＷＳにより設計された関数を実行するシステムＳＹＳの動作の別の例を示している。システムＳＹＳは、図３０と同じである。図４８と同じ動作については、詳細な説明は省略する。
【０２００】
この例では、プロセッサコアＣＯＲＥ１−２が関数群ＦＵＮＣ１を実行する直前のアイドル時間Ｔｉｄｌｅは、閾値ＴＳより長く閾値ＴＭ以下である。更新された優先度リストＰＬＩＳＴとリンクテーブルＰＬＴとの一致の程度を示す有効使用率ＥＵＲは、図４８と同様に、閾値Ｍ（例えば８０％）以下である。
【０２０１】
アイドル時間Ｔｉｄｌｅが比較的短いため、プロセッサコアＣＯＲＥ１は、アクティブリンカＡＬＩＮＫを起動して新たな優先度リストＰＬＩＳＴを作成した後、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成しない（図５０（ａ））。メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは、スケジューラからプロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行が指示されたときに作成される（図５０（ｂ））。
【０２０２】
例えば、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを短いアイドル時間Ｔｉｄｌｅ内に作成する場合、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成が完了する前に、関数群ＦＵＮＣ１の実行が指示される可能性がある。実際には、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成と、関数群ＦＵＮＣ１の実行指示とが衝突することを防止するために、スケジューラは、関数群ＦＵＮＣ１の実行指示の発行タイミングを、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成時間を考慮して調整しなくてはならない。この実施形態では、このようなスケジューラの余計な処理を省くことができ、システムＳＹＳの性能を向上できる。
【０２０３】
同様に、関数群ＦＵＮＣ１を実行するプロセッサコアがＣＯＲＥ１からＣＯＲＥ２に切り替えられるときも、プロセッサコアＣＯＲＥ２は、アクティブリンカＡＬＩＮＫを起動して新たな優先度リストＰＬＩＳＴを作成した後、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成しない（図５０（ｃ））。メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは、スケジューラからプロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ１の実行が指示されたときに作成される（図５０（ｄ））。
【０２０４】
図５１は、図４７に示したワークステーションＷＳにより設計された関数を実行するシステムＳＹＳの動作の別の例を示している。システムＳＹＳは、図３０と同じである。図４８と同じ動作については、詳細な説明は省略する。
【０２０５】
この例では、図５０と同様に、プロセッサコアＣＯＲＥ１−２が関数群ＦＵＮＣ１を実行する直前のアイドル時間Ｔｉｄｌｅは、閾値ＴＳより長く閾値ＴＭ以下である。一方、更新された優先度リストＰＬＩＳＴとリンクテーブルＰＬＴとの一致の程度を示す有効使用率ＥＵＲは、閾値Ｍ（例えば８０％）より大きい。例えば、前回の関数群ＦＵＮＣ１の実行により更新された優先度リストＰＬＩＳＴは、前回の関数群ＦＵＮＣ１の実行時のリンクテーブルＰＬＴと一致している。
【０２０６】
アイドル時間Ｔｉｄｌｅが比較的短く、かつ有効使用率ＥＵＲが高いため、プロセッサコアＣＯＲＥ１は、アクティブリンカＡＬＩＮＫを起動して新たな優先度リストＰＬＩＳＴのみを作成する（図５１（ａ））。メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは更新されず、前回使用したものが利用される。
【０２０７】
関数群ＦＵＮＣ１を実行するプロセッサコアがＣＯＲＥ１からＣＯＲＥ２に切り替えられるとき、プロセッサコアＣＯＲＥ２は、アクティブリンカＡＬＩＮＫを起動して新たな優先度リストＰＬＩＳＴのみを作成する（図５１（ｂ））。メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは、スケジューラからプロセッサコアＣＯＲＥ２に関数群ＦＵＮＣ１の実行が指示されたときに作成される（図５１（ｃ））。
【０２０８】
図５２は、図４７に示したワークステーションＷＳにより設計された関数を実行するシステムＳＹＳの動作の別の例を示している。システムＳＹＳは、図３０と同じである。図４８と同じ動作については、詳細な説明は省略する。
【０２０９】
この例では、プロセッサコアＣＯＲＥ１−２が関数群ＦＵＮＣ１を実行する直前のアイドル時間Ｔｉｄｌｅは、閾値ＴＳ以下である。このとき、アイドル時間Ｔｉｄｌｅ中に優先度リストＰＬＩＳＴやメモリイメージＭＩＭＧ等を作成することが困難である。このため、優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは、スケジューラからプロセッサコアＣＯＲＥ１に関数群ＦＵＮＣ１の実行が指示されたときに作成される（図５２（ａ））。これは、関数群ＦＵＮＣ１を実行するプロセッサコアがＣＯＲＥ１からＣＯＲＥ２に切り替えられるときも同じである（図５２（ｂ））。このように、アイドル時間Ｔｉｄｌｅが極めて短いときに、アイドル時間Ｔｉｄｌｅ内に優先度リストＰＬＩＳＴを作成することが禁止される。これにより、図５０と同様に、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成と、関数群ＦＵＮＣ１の実行指示とが衝突することを防止できる。あるいは、スケジューラによる関数群ＦＵＮＣ１の実行指示の発行タイミングを、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成時間を考慮して調整することを不要にできる。この結果、スケジューラの余計な処理を省くことができ、システムＳＹＳの性能を向上できる。
【０２１０】
図５３は、図４８から図５２までの動作の概要を示している。図５３において、プロセッサコアＣＯＲＥの丸印は、同じプロセッサコアＣＯＲＥで選択された関数群ＦＵＮＣ１が実行されることを示す。プロセッサコアＣＯＲＥのＸ印は、異なるプロセッサコアＣＯＲＥで選択された関数群ＦＵＮＣ１が実行されることを示す。フラグＦＬＧは、図５４および図５５に示すフローの制御に使用される。
【０２１１】
この実施形態では、アイドル時間Ｔｉｄｌｅが比較的長いとき（閾値ＴＭより長い）、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２のアイドルｉｄｌｅ中に、次に関数群ＦＵＮＣ１を実行するための準備が行われる。すなわち、優先度リストＰＬＩＳＴが作成され、あるいは、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴが作成される。新たに作成された優先度リストＰＬＩＳＴとリンクテーブルＰＬＴが一致するとき、あるいは、有効使用率ＥＵＲが閾値Ｍより大きいとき、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成は不要である。
【０２１２】
アイドル時間Ｔｉｄｌｅが比較的短いとき（閾値ＴＳより長く閾値ＴＭ以下）、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２のアイドルｉｄｌｅ中に、優先度リストＰＬＩＳＴのみが生成される。メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは、関数群ＦＵＮＣ１の実行が指示された後（ＦＵＮＣ１  ｓｔａｒｔ）に作成される。但し、たに作成された優先度リストＰＬＩＳＴとリンクテーブルＰＬＴが一致するとき、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴの作成は不要である。アイドル時間Ｔｉｄｌｅが短いとき（閾値ＴＳ以下）、優先度リストＰＬＩＳＴ、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴは、関数群ＦＵＮＣ１の実行が指示された後（ＦＵＮＣ１  ｓｔａｒｔ）に作成される。
【０２１３】
図５４は、図４７に示したワークステーションＷＳにより設計された関数を実行するシステムＳＹＳの動作の例を示している。図５４のフローは、図３９のフローにステップＳ４８２、Ｓ４８４、Ｓ４８６およびＳ６２を追加している。ステップＳ４０−４８、Ｓ５０−６０の処理は、図３９と同じである。ステップＳ６２で実施されるステップＳ８２２からＳ８５８は、図５５に示す。
【０２１４】
ステップＳ４８２では、呼び出された関数のメモリイメージＭＩＭＧおよびリンクテーブルＰＬＴが保持されているとき、処理はステップＳ４８４に移行する。呼び出された関数のメモリイメージＭＩＭＧおよびリンクテーブルＰＬＴが、他の関数の実行により失われているとき、処理はステップＳ５２に移行する。
【０２１５】
ステップＳ４８４では、フラグＦＬＧが”０”のとき、処理はステップＳ５０に移行する。フラグＦＬＧが”０”でないとき、すなわち、”１”または”２”のとき、処理はステップＳ４８６に移行する。ステップＳ４８６では、フラグＦＬＧが”１”のとき、処理はステップＳ５４に移行する。フラグＦＬＧが”１”でないとき、すなわち、”２”のとき、処理はステップＳ５６に移行する。
ステップＳ４８４、Ｓ４８６により、図５３に示したように、関数群ＦＵＮＣ１の実行が指示された後に行われる処理が選択される。
【０２１６】
図５５は、図５４に示したステップＳ６２の処理の例を示している。図５５では、図５３に示したアイドルｉｄｌｅ中に実施される処理が選択される。なお、内部メモリＩＭＥＭ１またはＩＭＥＭ２にコピーする関数として、関数群ＦＵＮＣ１が選択されている。
【０２１７】
まず、ステップＳ８２２では、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２による関数群ＦＵＮＣ１の実行が完了する。ステップＳ８２４では、フラグＦＬＧが”０”にリセットされ、関数群ＦＵＮＣ１を前回実行したプロセッサコアＣＯＲＥ１またはＣＯＲＥ２のＩＤが登録される。
【０２１８】
ステップＳ８２６では、アイドルｉｄｌｅ中のプロセッサコアＣＯＲＥ１またはＣＯＲＥ２がサーチされる。ステップＳ８２８では、サーチされたプロセッサコアＣＯＲＥ１またはＣＯＲＥ２のアイドル時間Ｔｉｄｌｅが予測される。
【０２１９】
ステップＳ８３０では、アイドル時間Ｔｉｄｌｅが閾値ＴＳより大きいとき、アイドルｉｄｌｅ中に実行可能な処理を探すため、処理はステップＳ８３２に移行する。アイドル時間Ｔｉｄｌｅが閾値ＴＳ以下のときに、処理は終了し、図５４のステップＳ４８に戻る。
【０２２０】
ステップＳ８３２では、ログバッファＬＢＵＦから関数群ＦＵＮＣ１の実行ログが読み出され、リンクテーブルＰＬＴからデータが読み出される。ステップＳ８３４では、関数群ＦＵＮＣ１の実行ログから優先度リストＰＬＩＳＴが新たに作成される。
【０２２１】
次に、ステップＳ８３６では、アイドル時間Ｔｉｄｌｅが閾値ＴＬより大きいとき、処理はステップＳ８３８に移行する。アイドル時間Ｔｉｄｌｅが閾値ＴＬ以下のときに、処理はステップＳ８４６に移行する。ステップＳ８３８では、関数群ＦＵＮＣ１を前回実行したプロセッサコアＣＯＲＥが、関数群ＦＵＮＣ１を次回実行するプロセッサコアＣＯＲＥと同じとき、処理はステップＳ８４０に移行する。関数群ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥが互いに異なるとき、処理はステップＳ８４２に移行する。
【０２２２】
ステップＳ８４０では、ステップＳ８３４で作成された優先度リストＰＬＩＳＴの内容がリンクテーブルＰＬＴの内容と一致するとき、ステップＳ８４２を省略して、処理はステップＳ８４４に移行する。優先度リストＰＬＩＳＴの内容がリンクテーブルＰＬＴの内容と異なるとき、処理はステップＳ８４２に移行する。
【０２２３】
ステップＳ８４２では、ステップＳ８３４で作成された優先度リストＰＬＩＳＴに基づいて、メモリイメージＭＩＭＧが作成され、リンクテーブルＰＬＴが更新される。ステップＳ８４４では、フラグＦＬＧが”２”に設定され、関数群ＦＵＮＣ１を次に実行するプロセッサコアＣＯＲＥ１またはＣＯＲＥ１を示すＩＤが更新される。
【０２２４】
一方、ステップＳ８４６では、アイドル時間Ｔｉｄｌｅが閾値ＴＭより大きいとき、処理はステップＳ８４８に移行する。アイドル時間Ｔｉｄｌｅが閾値ＴＭ以下のときに、処理はステップＳ８５４に移行する。ステップＳ８４８では、関数群ＦＵＮＣ１を前回実行したプロセッサコアＣＯＲＥが、関数群ＦＵＮＣ１を次回実行するプロセッサコアＣＯＲＥと同じとき、処理はステップＳ８５０に移行する。関数群ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥが互いに異なるとき、処理はステップＳ８４２に移行する。
【０２２５】
ステップＳ８５０では、ステップＳ８３４で作成された優先度リストＰＬＩＳＴと、関数群ＦＵＮＣ１を前回実行したリンクテーブルＰＬＴを用いて、有効利用率ＥＵＲが求められる。ステップＳ８５２では、有効使用率ＥＵＲが閾値Ｍより大きいとき、ステップＳ８４２を省略して、処理はステップＳ８４４に移行する。有効使用率ＥＵＲが閾値Ｍ以下のとき、処理はステップＳ８４２に移行する。
【０２２６】
ステップＳ８５４では、関数群ＦＵＮＣ１を前回実行したプロセッサコアＣＯＲＥが、関数群ＦＵＮＣ１を次回実行するプロセッサコアＣＯＲＥと同じとき、処理はステップＳ８５６に移行する。関数群ＦＵＮＣ１を実行するプロセッサコアＣＯＲＥが互いに異なるとき、処理はステップＳ８５８に移行する。
【０２２７】
ステップＳ８５６では、ステップＳ８３４で作成された優先度リストＰＬＩＳＴの内容がリンクテーブルＰＬＴの内容と一致するとき、処理はステップＳ８５８に移行する。優先度リストＰＬＩＳＴの内容がリンクテーブルＰＬＴの内容と異なるとき、処理はステップＳ８４４に移行する。ステップＳ８５８では、フラグＦＬＧが”１”に設定され、関数群ＦＵＮＣ１を次に実行するプロセッサコアＣＯＲＥ１またはＣＯＲＥ１を示すＩＤが更新される。
【０２２８】
図５６は、図４７に示したフローにより生成されるリンクテーブルＰＬＴの例を示している。図５６のリンクテーブルＰＬＴは、図３８のリンクテーブルＰＬＴにフラグＦＬＧの値を格納する領域を追加している。その他の構成は、図３８と同じである。
【０２２９】
図５７は、図５５に示したステップＳ８５０の処理の例を示している。まず、ステップＳ８７０では、関数群ＦＵＮＣ１を次に実行するプロセッサコアＣＯＲＥ１またはＣＯＲＥ２によりアクセスされる内部メモリＩＭＥＭ１またはＩＭＥＭ２に有効使用領域ＥＳＡが”０”にリセットされる。次に、ステップＳ８７２において、新たに作成された優先度リストＰＬＩＳＴ内の対象関数の１つが、リンクテーブルＰＬＴに登録されているとき、処理はステップＳ８７４に移行する。新たに作成された優先度リストＰＬＩＳＴ内の対象関数の１つが、リンクテーブルＰＬＴに登録されていないとき、処理はステップＳ８７６に移行する。
【０２３０】
ステップＳ８７４では、有効使用領域ＥＳＡのサイズが対象関数のオブジェクトサイズだけ増加される。ステップＳ８７６では、未解析な関数があるとき、処理はステップＳ８７８に移行する。未解析な関数がないとき、処理はステップＳ８８０に移行する。ステップＳ８７８では、未解析な関数の１つが対象関数に設定され、処理はステップＳ８７２に戻る。ステップＳ８８０では、内部メモリＩＭＥＭ１またはＩＭＥＭ２に対する有効使用領域ＥＳＡの割合が有効使用率ＥＵＲとして設定される。
【０２３１】
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、この実施形態では、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２のアイドル時間Ｔｉｄｌｅを利用して、前回のプログラムの実行結果から次のプログラムの実行時に内部メモリＩＭＥＭ１またはＩＭＥＭ２にコピーする関数を選択する。これにより、プロセッサコアＣＯＲＥ０がやるべき処理を、プロセッサコアＣＯＲＥ１−２に分散させることができる。プロセッサコアＣＯＲＥ０の負担を減らすことで、システムＳＹＳ全体としてプログラムを高速に実行でき、システムＳＹＳの性能を向上できる。
【０２３２】
さらに、アイドル時間Ｔｉｄｌｅの長さに応じて、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成するプロセッサコアＣＯＲＥ０−２を切り替え、メモリイメージＭＩＭＧおよびリンクテーブルＰＬＴを作成するタイミングを変更する。これにより、アイドル時間Ｔｉｄｌｅの長さに応じて、内部メモリＩＭＥＭ１−２に格納する関数の選択処理の負荷を分散できる。特に、アイドル時間Ｔｉｄｌｅが短いときに、選択処理をプロセッサコアＣＯＲＥ０で行うことで、プロセッサコアＣＯＲＥ１またはＣＯＲＥ２で実行するプログラムの開始タイミングが遅れることを防止できる。この結果、システムＳＹＳ全体としてプログラムを高速に実行でき、システムＳＹＳの性能を向上できる。
【０２３３】
以上の実施形態において説明した発明を整理して、付記として開示する。
（付記１）
プログラムが格納される内部メモリを有するプロセッサにより実行されるプログラムを生成するプログラム生成方法であって、
情報処理装置が、階層構造を有する複数の関数を含むソースプログラムを実行し、実行頻度の高い関数を、前記内部メモリに格納する選択関数として順次に選択し、
前記情報処理装置が、前記選択関数を前記内部メモリの記憶領域に割り当て、前記選択関数から呼び出される前記選択関数以外の関数を前記内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成し、
前記情報処理装置が、残りの関数を前記プロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成すること
を特徴とするプログラム生成方法。
（付記２）
前記外部ロードモジュールおよび前記内部ロードモジュールの少なくともいずれかは、前記外部メモリの記憶領域にロードされる前記内部ロードモジュールのうち、前記選択関数を前記内部メモリにコピーし、前記選択関数から呼び出される前記選択関数以外の関数を前記プロセッサのアドレス変換機能を用いて前記内部メモリの記憶領域に近接する領域に割り当てる管理プログラムを含むこと
を特徴とする付記１記載のプログラム生成方法。
（付記３）
前記情報処理装置が、前記ソースプログラムのメインルーチン直下にぶらさがる関数群毎に、前記内部メモリに格納する前記選択関数を順次に選択し、
前記情報処理装置が、前記関数群毎に前記内部ロードモジュールを生成し、
前記外部ロードモジュールは、前記外部メモリの記憶領域にロードされる前記内部ロードモジュール内の関数が前記プロセッサにより実行される前に、前記選択関数を前記内部メモリにコピーする管理プログラムを含むこと
を特徴とする付記１記載のプログラム生成方法。
（付記４）
前記関数群は、３以上であり、
前記内部ロードモジュール内の前記選択関数のサイズは、前記内部メモリの記憶容量の半分以下であり、
前記管理プログラムは、前記関数群の１つに対応する前記内部ロードモジュール内の前記選択関数と、前記関数群の別の１つに対応する前記内部ロードモジュール内の前記選択関数とを、前記内部メモリの記憶領域にコピーし、前記内部メモリ上の実行されていない前記選択関数を、別の内部ロードモジュールの前記選択関数に入れ替える機能を有していること
を特徴とする付記３記載のプログラム生成方法。
（付記５）
前記情報処理装置が、前記各関数群の中で複数の関数から呼び出される共有関数を、前記選択関数として１回のみ選択すること
を特徴とする付記３記載のプログラム生成方法。
（付記６）
前記情報処理装置が、複数の前記関数群から呼び出される共有関数を選択し、選択した前記共有関数を前記外部ロードモジュール内に含めること
を特徴とする付記３記載のプログラム生成方法。
（付記７）
プログラムが格納される内部メモリおよびキャッシュメモリを有するプロセッサにより実行されるプログラムの生成方法であって、
情報処理装置が、階層構造を有する複数の関数を含むソースプログラムを実行し、キャッシュミスペナルティの大きい関数を、前記内部メモリに格納する選択関数として順次に選択し、
前記情報処理装置が、前記選択関数を前記内部メモリの記憶領域に割り当て、前記選択関数から呼び出される前記選択関数以外の関数を前記内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成し、
前記情報処理装置が、残りの関数を前記プロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成すること
を特徴とするプログラム生成方法。
（付記８）
複数のプロセッサにより実行されるプログラムの生成方法であって、
情報処理装置が、階層構造を有する複数の関数を含むソースプログラムを実行し、実行頻度の高い関数を、前記プロセッサのいずれかの内部メモリに格納する選択関数として順次に選択し、
前記情報処理装置が、前記選択関数を前記内部メモリの記憶領域に割り当て、前記選択関数から呼び出される前記選択関数以外の関数を前記内部メモリの記憶領域に近接する領域に割り当てて、前記内部メモリを有する前記プロセッサが実行するための内部ロードモジュールを生成し、
前記情報処理装置が、残りの関数を前記プロセッサに接続される外部メモリに割り当てて、前記内部ロードモジュールを実行するプロセッサ以外のプロセッサが実行するための外部ロードモジュールを生成すること
を特徴とするプログラム生成方法。
（付記９）
メインプロセッサおよび階層構造を有する複数の関数を含むプログラムが格納される内部メモリを有する少なくとも１つのサブプロセッサを含むシステムの動作方法であって、
前記メインプロセッサからの開始指示に応答して前記サブプロセッサがプログラムを実行する毎に、実行された関数のログを保持し、
前記メインプロセッサからの次の開始指示の前に、保持された関数のログに基づいて実行頻度の高い関数を前記メインプロセッサにより選択するとともに、選択した関数を用いて前記メインプロセッサにより前記内部メモリにコピーするためのメモリイメージを作成し、
前記メインプロセッサからの前記開始指示に応答して、新たに選択された関数を前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とするシステムの動作方法。
（付記１０）
今回のプログラムを実行するサブプロセッサが、前回のプログラムを実行したサブプロセッサと同じで、かつ、保持された関数のログに基づいて選択された実行頻度の高い関数が、前回のプログラムを実行するときに選択された関数と同じとき、前記メモリイメージの作成を禁止し、
前記メインプロセッサからの前記開始指示に応答して前記サブプロセッサにより、前回のプログラムを実行するときに作成したメモリイメージを前記内部メモリにコピーすること
を特徴とする付記９記載のシステムの動作方法。
（付記１１）
メインプロセッサおよび階層構造を有する複数の関数を含むプログラムが格納される内部メモリを有する少なくとも１つのサブプロセッサを含むシステムの動作方法であって、
前記メインプロセッサからの開始指示に応答して前記サブプロセッサがプログラムを実行する毎に、実行された関数のログを保持し、
前記サブプロセッサのアイドル期間を前記メインプロセッサにより予想し、
予想した前記アイドル期間が第１期間より長いときに、前記アイドル期間に、保持された関数のログに基づいて実行頻度の高い関数を前記サブプロセッサにより選択するとともに、選択した関数を用いて前記内部メモリにコピーするためのメモリイメージを前記サブプロセッサにより作成し、前記メインプロセッサからの前記開始指示に応答して、作成されたメモリイメージを前記サブプロセッサにより前記内部メモリにコピーし、
予想した前記アイドル期間が第１期間以下のときに、前記アイドル期間に、保持された関数のログに基づいて実行頻度の高い関数を前記サブプロセッサにより選択し、前記メインプロセッサからの前記開始指示に応答して、選択した関数を用いて前記内部メモリにコピーするためのメモリイメージを前記サブプロセッサにより作成し、作成されたメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とするシステムの動作方法。
（付記１２）
予想した前記アイドル期間が前記第１期間より長い第２期間より長く、今回のプログラムを実行するサブプロセッサが、前回のプログラムを実行したサブプロセッサと同じで、かつ、保持された関数のログに基づいて選択された実行頻度の高い関数が、前回のプログラムを実行するときに選択された関数と同じとき、
前記メモリイメージの作成を禁止し、
前記メインプロセッサからの前記開始指示に応答して、前回のプログラムを実行するときに作成したメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とする付記１１記載のシステムの動作方法。
（付記１３）
予想した前記アイドル期間が前記第１期間より長く、前記第２期間以下であり、今回のプログラムを実行するサブプロセッサが、前回のプログラムを実行したサブプロセッサと同じで、かつ、保持された関数のログに基づいて選択された実行頻度の高い関数と前回のプログラムを実行するときに選択された関数との一致の程度を示す有効使用率が予め設定された閾値より高いときに、
前記メモリイメージの作成を禁止し、
前記メインプロセッサからの前記開始指示に応答して、前回のプログラムを実行するときに作成したメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とする付記１２記載のシステムの動作方法。
（付記１４）
予想した前記アイドル期間が前記第１期間より短い第３期間以下のとき、前記アイドル期間に、実行頻度の高い関数を選択することおよび前記メモリイメージを作成することを禁止し、
前記メインプロセッサからの前記開始指示に応答して、実行頻度の高い関数を前記サブプロセッサにより選択し、前記サブプロセッサにより前記メモリイメージを作成し、作成したメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とする付記１１ないし付記１３のいずれか１項記載のシステムの動作方法。
（付記１５）
プログラムが格納される内部メモリを有するプロセッサにより実行されるプログラムを生成する情報処理装置であって、
階層構造を有する複数の関数を含むソースプログラムを実行し、実行頻度の高い関数を、前記内部メモリに格納する選択関数として順次に選択する関数選択部と、
前記選択関数を前記内部メモリの記憶領域に割り当て、前記選択関数から呼び出される前記選択関数以外の関数を前記内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成するとともに、残りの関数を前記プロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成するプログラム生成部と
を備えていることを特徴とする情報処理装置。
（付記１６）
メインプロセッサと、
階層構造を有する複数の関数を含むプログラムが格納される内部メモリを有する少なくとも１つのサブプロセッサと、
前記サブプロセッサが実行する関数のログを保持するログバッファと、
を備え、
前記メインプロセッサからの開始指示に応答して前記サブプロセッサがプログラムを実行する毎に、実行された関数のログを保持し、
前記メインプロセッサからの次の開始指示の前に、保持された関数のログに基づいて実行頻度の高い関数を前記メインプロセッサにより選択するとともに、選択した関数を用いて前記メインプロセッサにより前記内部メモリにコピーするためのメモリイメージを作成し、
前記メインプロセッサからの前記開始指示に応答して、新たに選択された関数を前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とするシステム。
（付記１７）
メインプロセッサと、
階層構造を有する複数の関数を含むプログラムが格納される内部メモリを有する少なくとも１つのサブプロセッサと、
前記サブプロセッサが実行する関数のログを保持するログバッファと、
を備え、
前記メインプロセッサからの開始指示に応答して前記サブプロセッサがプログラムを実行する毎に、実行された関数のログを保持し、
前記サブプロセッサのアイドル期間を前記メインプロセッサにより予想し、
予想した前記アイドル期間が第１期間より長いときに、前記アイドル期間に、保持された関数のログに基づいて実行頻度の高い関数を前記サブプロセッサにより選択するとともに、選択した関数を用いて前記内部メモリにコピーするためのメモリイメージを前記サブプロセッサにより作成し、前記メインプロセッサからの前記開始指示に応答して、作成されたメモリイメージを前記サブプロセッサにより前記内部メモリにコピーし、
予想した前記アイドル期間が第１期間以下のときに、前記アイドル期間に、保持された関数のログに基づいて実行頻度の高い関数を前記サブプロセッサにより選択し、前記メインプロセッサからの前記開始指示に応答して、選択した関数を用いて前記内部メモリにコピーするためのメモリイメージを前記サブプロセッサにより作成し、作成されたメモリイメージを前記サブプロセッサにより前記内部メモリにコピーすること
を特徴とするシステム。
（付記１８）
階層構造を有する複数の関数を含むソースプログラムを実行し、実行頻度の高い関数を、内部メモリに格納する選択関数として順次に選択する手順と、
前記選択関数を前記内部メモリの記憶領域に割り当て、前記選択関数から呼び出される前記選択関数以外の関数を前記内部メモリの記憶領域に近接する領域に割り当てて内部ロードモジュールを生成する手順と、
残りの関数を前記プロセッサに接続される外部メモリに割り当てて外部ロードモジュールを生成する手順と
をプログラムが格納される内部メモリを有するプロセッサに実行させるためのプログラムを記録した前記プロセッサにより読み取り可能な記録媒体。
【０２３４】
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずであり、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。
【符号の説明】
【０２３５】
ＡＳＭ‥アセンブラ；ＣＡＣＨＥ‥キャッシュメモリ；ＣＯＭＰ‥コンパイラ；ＣＯＲＥ、ＣＯＲＥ０−２‥プロセッサコア；ＣＳＰＲＧ‥コード選択プログラム；ＥＬＤＭ‥外部ロードモジュール；ＥＭＥＭ‥外部メモリ；ＥＳＡ‥有効使用領域；ＥＵＲ‥有効使用率；ＥＸＥ‥プログラム；ＦＬＩＳＴ‥関数リスト；ＩＬＤＭ‥内部ロードモジュール；ＩＭＥＭ、ＩＭＥＭ０−２‥内部メモリ；ＬＢＵＦ‥ログバッファ；ＬＩＮＫ‥リンカ；ＬＯＧ０−２‥ログ制御回路；ＭＩＭＧ‥メモリイメージ；ＭＭＵ‥メモリ管理ユニット；ＯＢＪ‥オブジェクトコード；ＰＬＩＳＴ‥優先度リスト；ＰＬＴ‥リンクテーブル；ＰＲＯＦ‥プロファイル情報；ＰＴＲ‥処理時間率；ＳＭ‥記録媒体；ＳＯＵＲＣ‥ソースプログラム；Ｔｉｄｌｅ‥アイドル時間；ＷＳ‥ワークステーション
【図１】
2011076218.tif 000003
【図２】
2011076218.tif 000004
【図３】
2011076218.tif 000005
【図４】
2011076218.tif 000006
【図５】
2011076218.tif 000007
【図６】
2011076218.tif 000008
【図７】
2011076218.tif 000009
【図８】
2011076218.tif 000010
【図９】
2011076218.tif 000011
【図１０】
2011076218.tif 000012
【図１１】
2011076218.tif 000013
【図１２】
2011076218.tif 000014
【図１３】
2011076218.tif 000015
【図１４】
2011076218.tif 000016
【図１５】
2011076218.tif 000017
【図１６】
2011076218.tif 000018
【図１７】
2011076218.tif 000019
【図１８】
2011076218.tif 000020
【図１９】
2011076218.tif 000021
【図２０】
2011076218.tif 000022
【図２１】
2011076218.tif 000023
【図２２】
2011076218.tif 000024
【図２３】
2011076218.tif 000025
【図２４】
2011076218.tif 000026
【図２５】
2011076218.tif 000027
【図２６】
2011076218.tif 000028
【図２７】
2011076218.tif 000029
【図２８】
2011076218.tif 000030
【図２９】
2011076218.tif 000031
【図３０】
2011076218.tif 000032
【図３１】
2011076218.tif 000033
【図３２】
2011076218.tif 000034
【図３３】
2011076218.tif 000035
【図３４】
2011076218.tif 000036
【図３５】
2011076218.tif 000037
【図３６】
2011076218.tif 000038
【図３７】
2011076218.tif 000039
【図３８】
2011076218.tif 000040
【図３９】
2011076218.tif 000041
【図４０】
2011076218.tif 000042
【図４１】
2011076218.tif 000043
【図４２】
2011076218.tif 000044
【図４３】
2011076218.tif 000045
【図４４】
2011076218.tif 000046
【図４５】
2011076218.tif 000047
【図４６】
2011076218.tif 000048
【図４７】
2011076218.tif 000049
【図４８】
2011076218.tif 000050
【図４９】
2011076218.tif 000051
【図５０】
2011076218.tif 000052
【図５１】
2011076218.tif 000053
【図５２】
2011076218.tif 000054
【図５３】
2011076218.tif 000055
【図５４】
2011076218.tif 000056
【図５５】
2011076218.tif 000057
【図５６】
2011076218.tif 000058
【図５７】
2011076218.tif 000059