(57)【要約】【課題】命令キャッシュ競合の回数を効果的に削減する。【解決手段】関数を単位で構成されるプログラムに対し、ターゲットプロセッサの命令キャッシュラインサイズをＣＳとすると、各関数をサイズがＣＳの命令コードブロック（＝ＩＣＢ）に分割し、各関数Ｆの先頭から数えてＸ番目のＩＣＢを(Ｆ，Ｘ)とした場合に、関数プログラムの実行プロファイルより（Ｆ，Ｘ）を識別名とするノードのフロー情報を抽出する。識別名毎にフロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求める。近傍重み情報に基づいて、命令キャッシュ競合回数が少なくなるように、複数の関数をメモリ空間に配置する。【選択図】図１
2010218218.tif 000002
【特許請求の範囲】
【請求項１】
複数の関数で構成されるプログラムの前記関数を、命令キャッシュを搭載したプロセッサシステムのメモリ空間に配置する方法であって、
ターゲットプロセッサの命令キャッシュラインサイズをＣＳとして、各関数をサイズがＣＳの命令コードブロックに分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現した場合に、前記プログラムの実行時に前記命令コードブロックの呼出し関係をトレースすることにより、前記プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成することと、
前記ノードのフロー情報に基づいて、識別名毎に前記フロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求めることと、
前記近傍重み情報に基づいて、前記命令キャッシュの競合回数が少なくなるように、前記複数の関数をメモリ空間に配置することと、
を有する、プログラムメモリ空間配置方法。
【請求項２】
関数iに属する命令コードブロックで識別名がixの参照から、その後、同じixが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属する命令コードブロックで識別名がjyの参照までの区間をixjy、前記フロー情報全体に渡るその集合をＲixjyとすると、ixjy区間毎について、区間内でi以外の関数に属する命令コードブロックで相異なる識別名を持つものが、jy自身を入れ計Ｎ種類存在した場合にスコアを１÷Ｎとし、Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、前記近傍重みＷixjyとして求める、請求項１に記載のプログラム関数のメモリ空間配置方法。
【請求項３】
個々の命令コードブロックの、他関数に属する全命令コードブロックに対する近傍重みの合計値を当該命令コードブロックのノード重みとし、さらに、各関数内の全命令コードブロックの前記ノード重みの合計として関数重みを求め、該関数重みの大きい関数から順にメモリへ空間の配置を行う、請求項１または２に記載のプログラムメモリ空間配置方法。
【請求項４】
既に配置済みの関数に対し、現在配置の対象となる配置対象関数を、各キャッシュライン番号の先頭から配置した場合に、配置対象関数に属する各命令コードブロックixと、配置済み関数に属する命令コードブロックjyが同じキャッシュラインにロードされる場合に、前記近傍重みＷixjyと前記近傍重みＷjyixのうち、値の大きい方をキャッシュ競合スコアとして計上していくことで計算される、配置対象関数のキャッシュライン配置毎でのキャッシュ競合スコアのうち、最小のキャッシュ競合スコアを与えるキャッシュライン配置を、当該配置対象関数のキャッシュライン配置とする、請求項１から３のいずれか1項に記載のプログラムメモリ空間配置方法。
【請求項５】
複数の関数で構成されるプログラムの前記関数を、命令キャッシュを搭載したプロセッサシステムのメモリ空間に配置する装置であって、
ターゲットプロセッサの命令キャッシュラインサイズをＣＳとして、各関数をサイズがＣＳの命令コードブロックに分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現した場合に、前記プログラムの実行時に前記命令コードブロックの呼出し関係をトレースすることにより、前記プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成するフロー情報作成手段と、
前記ノードのフロー情報に基づいて、識別名毎に前記フロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求める近傍重み情報作成手段と、
前記近傍重み情報に基づいて、前記命令キャッシュの競合回数が少なくなるように、前記複数の関数をメモリ空間に配置する関数配置位置決定手段と、
を有する、プログラムメモリ空間配置装置。
【請求項６】
前記近傍重み情報作成手段は、前記関数iに属する命令コードブロックで識別名がixの参照から、その後、同じixが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属する命令コードブロックで識別名がjyの参照までの区間をixjy、前記フロー情報全体に渡るその集合をＲixjyとすると、ixjy区間毎について、区間内でi以外の関数に属する命令コードブロックで相異なる識別名を持つものが、jy自身を入れ計Ｎ種類存在した場合にスコアを1÷Ｎとし、Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、前記近傍重みＷixjyとして求める、請求項５に記載のプログラムメモリ空間配置装置。
【請求項７】
前記関数配置位置決定手段は、個々の命令コードブロックの、他関数に属する全命令コードブロックに対する近傍重みの合計値を当該命令コードブロックのノード重みとし、さらに、各関数内の全命令コードブロックの前記ノード重みの合計として関数重みを求め、該関数重みの大きい関数から順にメモリ空間への配置を行う、請求項５または６に記載のプログラムメモリ空間配置装置。
【請求項８】
前記関数配置位置決定手段は、既に配置済みの関数に対し、現在配置の対象となる配置対象関数を、各キャッシュライン番号の先頭から配置した場合に、配置対象関数に属する各命令コードブロックixと、配置済み関数に属する命令コードブロックjyが同じキャッシュラインにロードされる場合に、前記近傍重みＷixjyと前記近傍重みＷjyixのうち、値の大きい方をキャッシュ競合スコアとして計上していくことで計算される、配置対象関数のキャッシュライン配置毎でのキャッシュ競合スコアのうち、最小のキャッシュ競合スコアを与えるキャッシュライン配置を、当該配置対象関数のキャッシュライン配置とする、請求項５から７のいずれか1項に記載のプログラムメモリ空間配置装置。
【請求項９】
複数の関数で構成されるプログラムの前記関数を、命令キャッシュを搭載したプロセッサシステムのメモリ空間に配置することをコンピュータに実行させるためのプログラムであって、
ターゲットプロセッサの命令キャッシュラインサイズをＣＳとして、各関数をサイズがＣＳの命令コードブロックに分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現した場合に、前記プログラムの実行時に前記命令コードブロックの呼出し関係をトレースすることにより、前記プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成する手順と、
前記ノードのフロー情報に基づいて、識別名毎に前記フロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求める手順と、
前記近傍重み情報に基づいて、前記命令キャッシュの競合回数が少なくなるように、前記複数の関数をメモリ空間に配置する手順と、
をコンピュータに実行させるためのプログラム。
【請求項１０】
前記のフロー情報を作成する手順は、関数iに属する命令コードブロックで識別名がixの参照から、その後、同じixが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属する命令コードブロックで識別名がjyの参照までの区間をixjy、前記フロー情報全体に渡るその集合をＲixjyとすると、ixjy区間毎について、区間内でi以外の関数に属する命令コードブロックで相異なる識別名を持つものが、jy自身を入れ計N種類存在した場合にスコアを１÷Ｎとし、Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、前記近傍重みＷixjyとして求める、請求項９に記載のプログラム。
【請求項１１】
前記のメモリ空間に配置する手順は、個々の命令コードブロックの、他関数に属する全命令コードブロックに対する近傍重みの合計値を当該命令コードブロックのノード重みとし、さらに、各関数内の全命令コードブロックの前記ノード重みの合計として関数重みを求め、該関数重みの大きい関数から順にメモリ空間への配置を行う、請求項９または１０に記載のプログラム。
【請求項１２】
前記のメモリ空間に配置する手順は、既に配置済みの関数に対し、現在配置の対象となる配置対象関数を、各キャッシュライン番号の先頭から配置した場合に、配置対象関数に属する各命令コードブロックixと、配置済み関数に属する命令コードブロックjyが同じキャッシュラインにロードされる場合に、前記近傍重みＷixjyと前記近傍重みＷjyixのうち、値の大きい方をキャッシュ競合スコアとして計上していくことで計算される、配置対象関数のキャッシュライン配置毎でのキャッシュ競合スコアのうち、最小のキャッシュ競合スコアを与えるキャッシュライン配置を、当該配置対象関数のキャッシュライン配置とする、請求項９から１１のいずれか1項に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の関数で構成されるプログラムの関数を、命令キャッシュを搭載したコンピュータシステムのメモリ空間に配置する方法に関する。
【背景技術】
【０００２】
コンピュータシステムにおいては一般に、外部メモリ（＝主記憶メモリ）とは別に小容量で高速な内蔵メモリ(キャッシュ)が設けられる。外部メモリに記憶される情報の一部をキャッシュにコピーしておき、この情報をアクセスする場合には外部メモリからではなくキャッシュから読み出すことで、高速な情報の読み出しが可能となる。キャッシュは外部メモリに比較して高速でコスト高であるために、通常その記憶容量は外部メモリと比べ非常に小さい。キャッシュは複数のキャッシュラインを含み、外部メモリからキャッシュへの情報のコピーはキャッシュライン単位で実行される。このために、外部メモリのメモリ空間をキャッシュライン単位で分割し、分割されたメモリ領域を順番にキャッシュラインに割当てておく。キャッシュの容量は外部メモリの容量よりも小さいので、外部メモリのメモリ領域を同一のキャッシュラインに繰り返して割当てることになる。一方、あるアドレスに最初のアクセスが実行されると、そのアドレスの情報（データやプログラム）をキャッシュ内の対応するキャッシュラインにコピーし、同一アドレスに対して次のアクセスを実行する場合にはキャッシュから直接に情報を読み出す。そこで、プログラム実行において、外部メモリの異なるアドレスに配置されたプログラム（＝命令コード列）が同一のキャッシュラインに割当てられている場合、これらの命令コード列が交互に読み出されるたびに、命令コード列をキャッシュにコピーする必要が生じる。これを命令キャッシュ競合という。命令キャシュ競合が頻繁に起こるとプログラムの実行速度が遅くなるという問題がある。この問題を解決するために、同時期に動作する可能性の高い命令コード列同士は同一のキャッシュラインに載らないよう配置する方法が研究されている。なお、キャッシュには命令キャッシュとデータキャッシュとがあるが、上記のような命令コード列読み出しの問題は命令キャッシュにおいて生じるものである。また、キャッシュメモリのマッピング方式には一般に、ダイレクト方式、セットアソシエイティブ方式、およびフルアメシエイティブ方式の３つがあるが、何れの方式においても上記のキャッシュ競合の問題を考える上では基本的に同一であるので、以降においてはダイレクトマップを例にとり説明する。
【０００３】
これまで、命令キャッシュ競合の問題を解決するために、プログラムが関数単位で構成されていることに着目し、関数間の呼出し回数や特定の関数呼出しパターンの呼出し回数を示す関数強度を定義し、関数強度が高い（即ち互いに読み出す可能性が高い）関数同士が同一の命令キャッシュラインに割当てられないようにする方法が従来からある。例えば特許文献１は、関数の中で複数の関数が連続して呼ばれる場合やループの中で呼ばれている等の特定パターンでの実行回数の多いものを仮配置により求める手法を開示している。また、特許文献２は、複数の関数からなるプログラムの実行時における関数の呼出し順を時系列として表現した動的関数フローに基づいて、関数のうちの任意の関数と他の全ての関数との実行時の呼出し関係についての情報を含むように関数強度の情報を生成し、該関数強度の情報に基づいて命令キャッシュ競合が少なくなるように関数をメモリ空間に配置する手法を開示している。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００１−２８２５４７号公報
【特許文献２】特開２００５−２６６９４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
このように従来の方法では、ある関数内の命令系列における他の関数の読み出し回数に基づいて求められた単なる呼出し回数、あるいは呼出し順を考慮した特定の関数呼出しパターンの呼出し回数に基づき、または実行時における関数相互の時系列的な相関関係を考慮の上、関数強度を定め、関数強度が高い関数同士が同一の命令キャッシュラインに割当てられないように関数をメモリ空間に配置していた。しかし、組込みシステム等のように、命令キャッシュ容量が小さい、すなわちキャッシュライン当たりのサイズが小さく、かつキャッシュライン数も少ないため、一つの関数といっても多くの場合、複数のキャッシュラインを跨るように関数を配置せざるを得ないケースがある。このケースでは、関数間でキャッシュラインの利用を排他的にすることは、そもそも多くの場合、困難である。例えばある関数が全キャッシュラインを占有してしまうと、もとより、それと排他に別の関数をメモリ空間に配置しようにも不可能である。そのため命令キャッシュ容量が小さい場合、従来の方法のように関数単位で求められた関数強度の情報を元に配置を行っただけでは、キャッシュ競合回数を効果的に削減できないケースが多発することが予想される。なぜなら、キャッシュ競合は通常、関数よりももっと細かな（キャッシュライン）単位でその発生位置が存在するのに対し、従来の方法ではそうしたキャッシュライン単位での相互呼出し関係という粒度での情報が、関数強度を求める際に利用されてないからである。
【０００６】
本発明の目的は、キャッシュラインのサイズの単位での競合情報を元に、関数のメモリへの配置を決定することで、命令キャッシュ容量が小さいシステムにおいても、命令キャッシュ競合回数を効果的に削減できる、プログラムのメモリ空間配置方法、装置、およびプログラムを提供することにある。
【課題を解決するための手段】
【０００７】
ターゲットプロセッサの命令キャッシュラインサイズをＣＳする。各関数をサイズが命令キャッシュラインサイズＣＳの命令コードブロック（ＩＣＢ）に分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現する。プログラムの実行時に命令コードブロックの呼出し関係をトレースすることにより、プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成する。次に、ノードのフロー情報に基づいて、識別名毎にフロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求める。最後に、近傍重み情報に基づいて、命令キャッシュの競合回数が少なくなるように、複数の関数をメモリ空間に配置する。
【発明の効果】
【０００８】
本発明によれば、プログラムを、命令キャッシュを搭載したコンピュータシステムのメモリ空間に、命令キャッシュ競合回数が少なくなるように配置することができ、プログラムの実行サイクル数を削減することができる。
【図面の簡単な説明】
【０００９】
【図１】図１は本発明の一実施形態のプログラムメモリ空間配置装置のブロック図である。
【図２】図２は図１のプログラムメモリ空間配置の処理の流れを示すフローチャートである。
【図３】図３は、図１のプログラムメモリ空間配置装置で利用するプログラムの一例の構造を示す図である。
【図４】図４は、図３のプログラムを実行することにより得られるフロー情報を示す図である。
【図５Ａ】図５Ａは、近傍重みＷa7b0を計算するのに利用する、フロー情報のa7b0区間を示す図である。
【図５Ｂ】図５Ｂは、近傍重みＷa7b1を計算するのに利用する、フロー情報のa7b1区間を示す図である。
【図５Ｃ】図５Ｃは、近傍重みＷa7c0を計算するのに利用する、フロー情報のa7c0区間を示す図である。
【図５Ｄ】図５Ｄは、近傍重みＷa7c1を計算するのに利用する、フロー情報のa7c1区間を示す図である。
【図６Ａ】図６Ａは、関数ＡのＩＣＢａ０〜ａ５の、関数Ｂ、Ｃ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｂ】図６Ｂは、関数ＡのＩＣＢａ６の、関数Ｂ、Ｃ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｃ】図６Ｃは、関数ＡのＩＣＢａ７の、関数Ｂ、Ｃ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｄ】図６Ｄは、関数ＡのＩＣＢａ８の、関数Ｂ、Ｃ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｅ】図６Ｅは、関数ＡのＩＣＢｂ０、ｂ１の、関数Ａ、Ｃ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｆ】図６Ｆは、関数ＡのＩＣＢｃ０の、関数Ａ、Ｂ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｇ】図６Ｇは、関数ＡのＩＣＢｃ１、ｃ２の、関数Ａ、Ｂ、Ｄに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図６Ｈ】図６Ｈは、関数ＡのＩＣＢｄ０の、関数Ａ、Ｂ、Ｃに属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報を示す図である。
【図７】図７は、各ＩＣＢの、図６Ａから図６Ｈの近傍重み表情報から求まるノード重みおよび関数重みを示す図である。
【図８Ａ】図８Ａは、関数Ｃを配置した後、関数Ａをキャッシュライン０番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｂ】図８Ｂは、関数Ｃを配置した後、関数Ａをキャッシュライン１番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｃ】図８Ｃは、関数Ｃを配置した後、関数Ａをキャッシュライン２番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｄ】図８Ｄは、関数Ｃを配置した後、関数Ａをキャッシュライン３番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｅ】図８Ｅは、関数Ｃを配置した後、関数Ａをキャッシュライン４番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｆ】図８Ｆは、関数Ｃを配置した後、関数Ａをキャッシュライン５番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｇ】図８Ｇは、関数Ｃを配置した後、関数Ａをキャッシュライン６番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図８Ｈ】図８Ｈは、関数Ｃを配置した後、関数Ａをキャッシュライン７番から配置した場合のキャッシュ競合スコアの計算の様子を示す図である。
【図９】図９は、図８Ａから図８Ｈで算出された、関数Ａの、キャッシュライン毎への配置に伴って発生するキャッシュ競合スコアを示す図である。
【図１０】図３のプログラムに対する、本発明の実施の形態により生成された関数配置指定情報を示す図である。
【図１１】図１０の関数配置指定情報に従って各関数のメモリ配置を行った場合の、プログラム実行終了時点に、各キャッシュラインに格納されているＩＣＢの識別名を示す図である。
【図１２】従来の方法で図３のプログラムの関数へのメモリ配置を決定するのに用いられる動的関数フロー情報を示す図である。
【図１３】従来の方法で図３のプログラムの関数へのメモリ配置を決定するのに用いられる関数強度情報のマトリクスを示す図である。
【図１４】従来の方法を利用した場合の、図３のプログラムの関数のメモリ配置を示す図である。
【発明を実施するための形態】
【００１０】
次に、本発明を実施するための形態について図面を参照して詳細に説明する。
【００１１】
図１は本発明の一実施の形態によるプログラムメモリ空間配置装置のブロック図、図２はその処理の流れを示すフローチャートである。
【００１２】
本実施の形態のプログラムメモリ空間配置装置はプログラム実行部１１とフロー情報作成部１２とフロー情報記憶部１３と近傍重み情報作成部１４と近傍重み表情報記憶部１５と関数配置決定部１６と関数配置指定情報記憶部１７とを有する。
【００１３】
プログラム実行部１１は、命令キャッシュ競合回数削減の対象となるプログラムをシミュレータ等により実行する(ステップ１０１)。
【００１４】
フロー情報作成部１２はステップ１０２に、ＩＣＢの入口／出口をトレースすることにより、ＩＣＢのフロー情報２１を生成し、フロー情報記憶部１３に格納する。ここでいうフロー情報２１とは、プログラム実行時に利用されたＩＣＢの順番（実行された順番）を時系列に並べたものであり、実行時のＩＣＢ間の呼出し関係をそのまま反映した情報である。なお、フロー情報２１の生成については、後程詳細に説明する。
【００１５】
近傍重み情報作成部１４はステップ１０３に、フロー情報２１に基づいて近傍重み表情報２２を作成し、近傍重み表情報記憶部１５に格納する。この近傍重み表情報２２は、従来の関数呼出し回数、呼出し順、そして全関数に対する時系列的な情報から求められる関数強度情報とは異なり、関数を単位とするのではなくＩＣＢを単位としＩＣＢ間の呼出し回数および時系列的な呼出し関係から求められる情報である。なお、近傍重み表情報２２の作成については、後程詳細に説明する。
【００１６】
関数配置決定部１６はステップ１０４に、近傍重み表情報２２を参照することで、命令キャッシュ競合回数を最小にするような関数毎のメモリ配置を決定し、命令キャッシュへの関数配置指定情報２３を関数配置指定情報記憶部１７に記憶する。配置対象関数Ｆに属する各ＩＣＢであるＵと、既に配置済みの全関数に属するＩＣＢであるＶとの間でキャッシュライン配置競合が発生する可能性Ｐを示す値とする。配置対象関数Ｆに対し、計命令キャッシュライン数だけ存在する、個々のメモリ配置をとった場合について、Ｕとキャッシュラインを共有するＶが存在すれば、近傍重み表情報２２に記載されているＵに対するＶの近傍重み、あるいはＶに対するＵの近傍重み、あるいは両方の平均値、のいずれかを累算していくことで、Ｆが当該メモリ配置を取った場合のキャッシュ競合スコアとしてのＳを算出する。そして、命令キャッシュライン数だけ存在するＳの値のうち、最小のＳ値を与えるメモリ配置を関数Ｆに割り当てることで、全関数に対する関数配置指定情報２３を生成する。その後、命令キャッシュへのこの関数配置指定情報２３に基づき、リンカが実際に各関数を記憶空間に割当ててリンクすることにより、実行形式モジュールを生成すればよい。なお、関数配置指定情報２３の作成については、後程より詳細に説明する。
【００１７】
このように、本実施の形態においては、プログラムの実行時にＩＣＢの呼出し関係をトレースすることにより、実行時のＩＣＢ間の呼出し関係を時系列として表現したフロー情報２１を生成し、このフロー情報２１に基づいて、全てのＩＣＢ間の実行時の呼出し回数や呼出し関係についての情報を含む近傍重み表情報２２を生成する。この近傍重み表情報２２は、従来では考慮されていなかったＩＣＢ間の相互情報（任意のＩＣＢとその他の全ＩＣＢとの関係）を表現するものであり、これを用いることで命令キャシュ競合回数を最小限にするような最適な関数配置を実現することができる。なお、以降の説明では、ダイレクト方式はキャッシュのウェイ数が１のセットアソシエイティブ方式とみなすことができるので、ダイレクト方式を含んだセットアソシエイティブ方式を例として用いる。
【００１８】
なお、フロー情報記憶部１３、近傍重み表情報記憶部１５、関数配置指定情報記憶部１７は１つにまとめてもよい。
【００１９】
まず、フロー情報２１の抽出について説明する。対象となるプログラムが図３に示す関数Ａ、Ｂ、Ｃ、およびＤからなるとして、このプログラムをシミュレータで実行する。図３においては、関数Ａ、Ｂ、Ｃ、Ｄが、サイズがターゲットプロセッサのキャッシュラインサイズＣＳのコードブロック（＝ＩＣＢ）に分割され、それぞれキャッシュラインを９ライン分、２ライン分、３ライン分、１ライン分占有している。そして、関数Ａの６番目のＩＣＢ内から関数Ｂを呼び出し、次に関数Ａの６番目のＩＣＢから関数Ｃを呼び出し、次に関数Ａの７番目のＩＣＢ内から関数Ｂを呼び出し、次に関数Ａの７番目のＩＣＢから関数Ｃを呼び出す。これを４回反復する。さらに、関数Ｃの先頭のＩＣＢから関数Ｄを呼び出すことを３回反復する。各関数Ｆ（＝Ａ〜Ｄ）の先頭から数えてＸ番目のＩＣＢにＦＸという識別子を与える。そしてシミュレーション実行中に発生した、相異なる関数に属するＩＣＢ間の全ての遷移を順番に記録することでフロー情報２１を生成する。図４は、関数Ａ、Ｂ、Ｃ、Ｄからなる、図３のプログラムを実行した場合のフロー情報２１を示している。図４において、ａ、ｂ、ｃ、ｄはそれぞれ関数Ａ、Ｂ、Ｃ、Ｄを意味し、続く数字は各関数内のＩＣＢ番号を意味する。また、「［・・・］＃」は、［・・・］内を＃回反復することを意味する。最初に関数Ａが実行され、関数Ａの６番目のICBすなわちa6内で関数Ｂを呼び出すことで関数Ｂが実行され、その後関数Ｂから関数Ａに戻った後に、同じa6内で今度は関数Ｃを呼び出すことで関数Ｃが実行され、関数Ｃ内では先頭のＩＣＢすなわちc0内で関数Ｄを呼び出すことで関数Ｄが実行される。こうした呼出がc0内で3反復発生している。その後、関数Ｃから関数Ａに戻った後に、今度は関数Ａの７番目のＩＣＢすなわちa7内で、前述の関数Ｂを呼出し次に関数Ｃを呼び出すシーケンスが再度繰り返されている。また、こうした関数Ａの６番目と７番目のＩＣＢが計４反復実行されている。
【００２０】
次にフロー情報２１に基づく近傍重み表情報２２の生成について説明する。
【００２１】
まず、近傍重み表情報２２の例について説明する。ある関数iに属するＩＣＢで識別名がixのＩＣＢの参照から、その後、同じixのＩＣＢが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属するＩＣＢで識別名がjyのＩＣＢの参照までの区間をixjy、フロー情報２１全体に渡るその集合をＲixjyとする。ixjy区間毎について、区間内で関数i以外の関数に属するＩＣＢで相異なる識別名を持つものがjy自身を入れ計Ｎ種類存在した場合のスコアを1/Ｎとする。Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、ＩＣＢixからみたＩＣＢjyの「近傍重みＷixjy」とする。このようにして、全ての関数(=i)に属する各ＩＣＢ(=x)について、自分と異なる関数(=j)に属する全てのＩＣＢ(=y)についての近傍重みＷixjyを求めたものを、近傍重み表情報２２と定義する。
【００２２】
近傍重みＷixjyは、フロー情報２１おいて、関数ｉのＩＣＢであるixと関数ｊ（≠ｉ）のＩＣＢであるjyが、同じキャシュラインに配置された場合にキャシュ競合が起きる可能性の大きさを表現するため、個々のＩＣＢixから始まって次のＩＣＢixに出会うまでの間に存在するＩＣＢjyまでの区間ixjyにおいて、ＩＣＢixからＩＣＢjyまでの間に他の関数に属するノードが多く存在すればするほどスコアが小さくなるようにしている。すなわち、他の関数に属する命令コードへの参照がＩＣＢixとＩＣＢjy間で発生する頻度が高ければ高いほど、ＩＣＢixとＩＣＢjyが直接キャッシュライン競合を引き起こす可能性も低下する状況をスコアの値で表現している。その結果、フロー情報２１内に存在する全てのixjy区間に渡る前記スコアの合計としての近傍重みＷixjyは、プログラム実行全体でみた場合の、ＩＣＢixとＩＣＢjyを同じキャシュラインに配置した場合にキャシュ競合が起きる可能性の大きさを表現するものとなる。そのため、近傍重みＷixjyが大きいＩＣＢixとＩＣＢjyを同じキャシュラインに配置せず、近傍重みＷixjyが小さいＩＣＢixとＩＣＢjy同士をできるだけ同じキャシュラインに配置するようにすれば、キャッシュ競合回数を少なくすることができるようになる。
【００２３】
図５は例として、図４のフロー情報２１から求められる近傍重みＷixjyのうち、関数Ａの７番目のＩＣＢ（＝a7）の、他の関数のＩＣＢに対する近傍重みの求め方を説明した図である。なお、説明をしやすくするため、図５に示したフロー情報２１は展開して記述している。まず、図５Ａは、関数Ｂの先頭のＩＣＢb0に対する近傍重みＷa7b0を計算するために考慮される全てのa7b0区間を下線で示している。この場合、a7の直ぐ後にb0が現れる区間の個数の合計が４、a7の後a6を挟んでb0が現れる区間の個数の合計が３である。いずれの区間もa7からb0の出現までに、関数Ａ以外の関数に属するＩＣＢが出現しないため、各区間のスコアは共に１となり、したがって、近傍重みＷa7b0は７として求められる。次に、図５Ｂは、関数Ｂの次のＩＣＢb1の近傍重みWa7b1を計算するために考慮される全てのa7b1区間を下線で示している。この場合、a7b1区間は計７区間存在し、また各区間共に、a7の直ぐ後からb1が現れるまでの間、関数Ａ以外の関数に属するＩＣＢとしてb0が１回出現していることから、各区間のスコアは共に１/２となる。その結果、近傍重みＷa7b1は７×１/２、すなわち７/２として求められる。図５Ｃは、関数Ｃの先頭のＩＣＢc0に対する近傍重みＷa7c0を計算するために考慮される全てのa7c0区間を下線で示している。この場合、a7の直ぐ後にc0が現れる区間の合計が４、a7の後c0を挟んでb0、b1が現れる区間の合計が３である。したがって、近傍重みＷa7c0は４＋３×１/３、すなわち５として求められる。図５Ｄは、関数Ｃの次のＩＣＢc1に対する近傍重みＷa7c1を計算するために考慮される全てのa7c1区間を下線で示している。この場合、最初の区間のスコアは、a7の後c1を挟んで他の関数のＩＣＢであるc0とd0が現れるため、１/３である。以下、同様にして、各区間のスコアは１/５、１/３、１/５、１/３、１/５、１/３となる。したがって、近傍重みＷa7c1は１/３＋１/５＋１/３＋１/５＋１/３＋１/５＋１/３、すなわち２９/１５として求められる。このようにして求めた、フロー情報１０に出現する全ＩＣＢの、相異なる関数に属する他の全ＩＣＢに対する近傍重みを求めた結果である近傍重み表情報２２を図６Ａから図６Ｈに示す。
【００２４】
次に、近傍重み表情報２２への参照による関数配置指定情報２３の生成例について説明する。対象となるプログラムが図３に示す関数Ａ、Ｂ、Ｃ、およびＤからなり、またそのフロー情報２１が図４および図５からなり、かつ各近傍重み表情報２２が図６Ａから図６Ｈのように求められているとして、関数配置指定情報２３の生成例について説明する。まず、どの関数から配置を始めるかを決めるために、個々のＩＣＢの（他の関数に属するＩＣＢに対する）近傍重みの合計値であるノード重みを、各関数内の全ＩＣＢに渡って合計した関数重みを求め、関数重みの大きい関数から順に配置を行う。これは、関数重みの値が大きいことは、当該関数に含まれているＩＣＢがプログラム実行全体からみた場合に、他関数との相関度が高いことを示すため、そうした関数の配置をより早い段階で確定させておくことは、後続する関数の配置決定に当該関数の配置が考慮される確率を高められるためである。図７に、図６の近傍重み表情報２２から求まるノード重みおよび関数重みを示す。
【００２５】
次に、前記のノード重みおよび関数重みの情報を元に、キャッシュライン数が８であるプロセッサをターゲットとした場合を例に、関数配置指定情報１２を生成する例を示す。まず、関数重みが最大である関数Ｃを適当に（この場合はキャッシュライン0番に対応するメモリアドレスに）配置した後、関数重みが次点の関数Ａを配置対象関数として、既配置関数Ｃに対する関数Ａの、各キャッシュライン番号への配置に対するキャッシュ競合スコアの計算の様子を図８に示す。図８Ａ、８Ｂ、８Ｃ、８Ｄ、８Ｅ、８Ｆ、８Ｇ、８Ｈはそれぞれ関数Ａをキャッシュライン０番から、１番から、２番から、３番から、４番から、５番から、６番から、７番から配置した場合を示している。ここで、「キャッシュライン＃番から配置する」とは、「キャッシュライン＃番に対応するメモリアドレスへ関数の先頭を配置する」ことを意味する。また、ｍａｘ(Ｘ,Ｙ)はＸとＹの大きい方の値を利用する意味の表記とする。図８に示すように、本例では、あるキャッシュライン配置に対するキャッシュ競合スコアとして、配置対象関数に属するＩＣＢであるixと、配置済み関数に属するＩＣＢであるjyが同じキャッシュラインにロードされる場合に、近傍重みＷixjyとＷjyixの大きい方の値をキャッシュ競合スコアとして加算するようにしている。このように大きい方の値のみを計上するのは、近傍重みＷixjyはixが既にキャッシュライン上にある状況下でjyへの参照が発生する可能性、逆に近傍重みＷjyixはjyが既にキャッシュライン上にある状況下でixへの参照が発生する可能性を意味しており、両者の可能性は通常排他的にしか発生しないことから、キャッシュ競合スコアとしてはいずれか大きい方を計上するのが妥当なためである。
【００２６】
図９は、図８で求めた、関数Ａを各キャッシュライン番号から配置した場合のキャッシュ競合スコアをまとめた表である。本表より、関数Ａをキャッシュライン０番、あるいはキャッシュライン５番、あるいはキャッシュライン７番の先頭から配置した場合にキャッシュ競合スコアが最も低くなることがわかる。この場合、いずれのキャッシュラインに関数Ａを割り当てるかは任意であるが、ここではキャッシュライン０番へ関数Ａを配置するように決定するものとする。同様に、既配置関数ＡとＣに対し関数Ｂ、最後に既配置関数ＡとＣとＢに対し関数Ｄ、を次々と配置していくことで、図１０に示す最終配置結果が得られる。すなわち関数Ｃをキャッシュライン０番、関数Ａも同様にキャッシュライン０番、一方関数Ｂをキャッシュライン３番、最後に関数Ｄをキャッシュライン５番、に配置するという関数配置指定情報２３が得られる。
【００２７】
図１０に示す関数配置指定情報２３に基づき、リンカが実際に各関数をメモリ空間に割当ててリンクすることにより生成した実行形式モジュールを、キャッシュライン数が８であるターゲットプロセッサ上で実行させた場合、各ＩＣＢは一度だけ対応するキャッシュラインに読み込まれるだけになる。したがって、命令キャッシュ競合回数（一度命令キャッシュに読み込まれたＩＣＢが、他のＩＣＢの読み込みによって上書きされたために、当該ＩＣＢを再度参照するのに、もう一度当該ＩＣＢを命令キャッシュに読み込んだ回数）は０回である。
【００２８】
図１１はこの場合い、プログラム実行終了時点に命令キャッシュの各ラインにどのＩＣＢが格納されているかを示す。
【００２９】
このように、本発明の方法を用いることで命令キャッシュ競合回数を大きく削減することができる。これに対し、例えば図３の実行フローを持つプログラムを、関数単位で求められた関数強度の情報を元にメモリ配置を行う従来の方法、例えば特許文献２に示されている手法の基本的な実施形態を用いて、キャッシュライン数が８であるターゲットプロセッサを対象に、図３の実行フローを持つプログラムのメモリ配置を決定した場合の結果を以下に示す。まず、図１２、図１３に、特許文献２に述べられている動的関数フロー情報および関数強度情報のマトリクスを求めた結果を示す。ここで、動的関数フロー情報とは、対象プログラムをシミュレータで実行し、各関数Ａ、Ｂ、Ｃ、およびＤの入口／出口をトレースすることにより、プログラムの実行開始から終了まで、呼び出された全ての関数を順番に記録することにより得られる関数の時系列情報を指す。また、基本形としての関数強度情報とは、ある関数ｉの参照から、その後、最初に参照された関数ｊまでの区間（ｉを含みｊを含まず）の集合をＲijとした場合、動的関数フローから、Ｒiiである全ての区間のうちで、関数ｊを少なくとも１回参照するような区間の数としてｎ（ｉ,j）を求め（ｉ＝ｊの場合、ｎ（ｉ,j）は関数ｉの総参照回数となる）、関数強度情報と定義する。
【００３０】
次に、図１２、図１３での動的関数フローおよび関数強度情報に基づいて、メモリ配置を行った結果例として、関数強度の大きい順から配置を実施した場合、あるいは関数強度ペア値の大きい順から配置を実施した場合の結果を図１４に示す。なお、いずれの場合も結果的には関数Ｃ、Ｄ、Ａ、Ｂの順番で配置を実施することになるため、同一のメモリ配置が得られる。図１４で得られたメモリ配置の下、図３の実行フローを持つプログラムをキャッシュライン数が８であるターゲットプロセッサ上で実行した場合の命令キャッシュ競合回数は１３となる。これに対し、本発明の方法を用いた場合では命令キャッシュ競合回数が０回であることから、本発明を用いることで、従来の方法と比べはるかに効果的に、命令キャッシュ競合回数を削減できることがわかる。
【００３１】
なお、従来の方法、例えば特許文献２においても、例えばキャッシュライン毎の実行頻度分布を考慮した上で、関数間で実行頻度の高いキャッシュライン同士が重ならないように配置する実施例が開示されている。しかし、そもそもキャッシュライン毎の実行頻度情報そのものは、例えば関数内にその関数内だけで閉じたループ部分があれば、対応の命令コードを含むキャッシュラインの実行頻度が高くなってしまうように、キャッシュ競合の発生の有無とは直接関係のない情報である。そのため、もしそうした情報を考慮に入れたとしても、関数同士の呼び出し関係を中心とする手法は本質的には、命令キャッシュ容量が小さいためにキャッシュライン数が少ないケース、すなわち一つの関数が複数のキャッシュラインを跨る頻度が高いケースに対しては、キャッシュ競合回数の削減に貢献できないことは明らかである。
【００３２】
なお、本プログラムメモリ空間配置装置の機能は、その機能を実現するためのプログラムを、コンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータに読み込ませ、実行するものであってもよい。コンピュータ読み取り可能な記録媒体とは、フレキシブルディスク、光磁気ディスク、ＣＤ−ＲＯＭ等の記録媒体、コンピュータシステムに内蔵されるハードディスク装置等の記憶装置を指す。さらに、コンピュータ読み取り可能な記録媒体は、インターネットを介してプログラムを送信する場合のように、短時間、動的にプログラムを保持するもの（伝送媒体もしくは伝送波）、その場合のサーバとなるコンピュータ内の揮発性メモリのように、一定時間プログラムを保持しているものを含む。
【符号の説明】
【００３３】
１１  プログラム実行部
１２  フロー情報作成部
１３  フロー情報作成記憶部
１４  近傍重み情報生成部
１５  近傍重み表情報記憶部
１６  関数配置決定部
１７  関数配置指定情報記憶部
２１  フロー情報
２２  近傍重み表情報
２３  関数配置指定情報
１０１〜１０４  ステップ
【図１】
2010218218.tif 000003
【図２】
2010218218.tif 000004
【図３】
2010218218.tif 000005
【図４】
2010218218.tif 000006
【図５Ａ】
2010218218.tif 000007
【図５Ｂ】
2010218218.tif 000008
【図５Ｃ】
2010218218.tif 000009
【図５Ｄ】
2010218218.tif 000010
【図６Ａ】
2010218218.tif 000011
【図６Ｂ】
2010218218.tif 000012
【図６Ｃ】
2010218218.tif 000013
【図６Ｄ】
2010218218.tif 000014
【図６Ｅ】
2010218218.tif 000015
【図６Ｆ】
2010218218.tif 000016
【図６Ｇ】
2010218218.tif 000017
【図６Ｈ】
2010218218.tif 000018
【図７】
2010218218.tif 000019
【図８Ａ】
2010218218.tif 000020
【図８Ｂ】
2010218218.tif 000021
【図８Ｃ】
2010218218.tif 000022
【図８Ｄ】
2010218218.tif 000023
【図８Ｅ】
2010218218.tif 000024
【図８Ｆ】
2010218218.tif 000025
【図８Ｇ】
2010218218.tif 000026
【図８Ｈ】
2010218218.tif 000027
【図９】
2010218218.tif 000028
【図１０】
2010218218.tif 000029
【図１１】
2010218218.tif 000030
【図１２】
2010218218.tif 000031
【図１３】
2010218218.tif 000032
【図１４】
2010218218.tif 000033
【手続補正書】
【提出日】平成22年8月2日(2010.8.2)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
フロー情報作成手段と、近傍重み情報作成手段と、関数配置位置決定手段と、を有するプログラムメモリ空間配置装置において、複数の関数で構成されるプログラムの前記関数を、命令キャッシュを搭載したプロセッサシステムのメモリ空間に配置する方法であって、
前記フロー情報作成手段が、ターゲットプロセッサの命令キャッシュラインサイズをＣＳとして、各関数をサイズがＣＳの命令コードブロックに分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現した場合に、前記プログラムの実行時に前記命令コードブロックの呼出し関係をトレースすることにより、前記プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成することと、
前記近傍重み情報作成手段が、前記ノードのフロー情報に基づいて、識別名毎に前記フロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求めることと、
前記関数配置位置決定手段が、前記近傍重み情報に基づいて、前記命令キャッシュの競合回数が少なくなるように、前記複数の関数をメモリ空間に配置することと、
を有する、プログラムメモリ空間配置方法。
【請求項２】
前記近傍重み情報作成手段は、関数iに属する命令コードブロックで識別名がixの参照から、その後、同じixが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属する命令コードブロックで識別名がjyの参照までの区間をixjy、前記フロー情報全体に渡るその集合をＲixjyとすると、ixjy区間毎について、区間内でi以外の関数に属する命令コードブロックで相異なる識別名を持つものが、jy自身を入れ計Ｎ種類存在した場合にスコアを１÷Ｎとし、Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、前記近傍重みＷixjyとして求める、請求項１に記載のプログラムメモリ空間配置方法。
【請求項３】
前記関数配置位置決定手段は、個々の命令コードブロックの、他関数に属する全命令コードブロックに対する近傍重みの合計値を当該命令コードブロックのノード重みとし、さらに、各関数内の全命令コードブロックの前記ノード重みの合計として関数重みを求め、該関数重みの大きい関数から順にメモリへ空間の配置を行う、請求項１または２に記載のプログラムメモリ空間配置方法。
【請求項４】
前記関数配置位置決定手段は、既に配置済みの関数に対し、現在配置の対象となる配置対象関数を、各キャッシュライン番号の先頭から配置した場合に、配置対象関数に属する各命令コードブロックixと、配置済み関数に属する命令コードブロックjyが同じキャッシュラインにロードされる場合に、前記近傍重みＷixjyと前記近傍重みＷjyixのうち、値の大きい方をキャッシュ競合スコアとして計上していくことで計算される、配置対象関数のキャッシュライン配置毎でのキャッシュ競合スコアのうち、最小のキャッシュ競合スコアを与えるキャッシュライン配置を、当該配置対象関数のキャッシュライン配置とする、請求項１から３のいずれか1項に記載のプログラムメモリ空間配置方法。
【請求項５】
複数の関数で構成されるプログラムの前記関数を、命令キャッシュを搭載したプロセッサシステムのメモリ空間に配置する装置であって、
ターゲットプロセッサの命令キャッシュラインサイズをＣＳとして、各関数をサイズがＣＳの命令コードブロックに分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現した場合に、前記プログラムの実行時に前記命令コードブロックの呼出し関係をトレースすることにより、前記プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成するフロー情報作成手段と、
前記ノードのフロー情報に基づいて、識別名毎に前記フロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求める近傍重み情報作成手段と、
前記近傍重み情報に基づいて、前記命令キャッシュの競合回数が少なくなるように、前記複数の関数をメモリ空間に配置する関数配置位置決定手段と、
を有する、プログラムメモリ空間配置装置。
【請求項６】
前記近傍重み情報作成手段は、前記関数iに属する命令コードブロックで識別名がixの参照から、その後、同じixが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属する命令コードブロックで識別名がjyの参照までの区間をixjy、前記フロー情報全体に渡るその集合をＲixjyとすると、ixjy区間毎について、区間内でi以外の関数に属する命令コードブロックで相異なる識別名を持つものが、jy自身を入れ計Ｎ種類存在した場合にスコアを1÷Ｎとし、Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、前記近傍重みＷixjyとして求める、請求項５に記載のプログラムメモリ空間配置装置。
【請求項７】
前記関数配置位置決定手段は、個々の命令コードブロックの、他関数に属する全命令コードブロックに対する近傍重みの合計値を当該命令コードブロックのノード重みとし、さらに、各関数内の全命令コードブロックの前記ノード重みの合計として関数重みを求め、該関数重みの大きい関数から順にメモリ空間への配置を行う、請求項５または６に記載のプログラムメモリ空間配置装置。
【請求項８】
前記関数配置位置決定手段は、既に配置済みの関数に対し、現在配置の対象となる配置対象関数を、各キャッシュライン番号の先頭から配置した場合に、配置対象関数に属する各命令コードブロックixと、配置済み関数に属する命令コードブロックjyが同じキャッシュラインにロードされる場合に、前記近傍重みＷixjyと前記近傍重みＷjyixのうち、値の大きい方をキャッシュ競合スコアとして計上していくことで計算される、配置対象関数のキャッシュライン配置毎でのキャッシュ競合スコアのうち、最小のキャッシュ競合スコアを与えるキャッシュライン配置を、当該配置対象関数のキャッシュライン配置とする、請求項５から７のいずれか1項に記載のプログラムメモリ空間配置装置。
【請求項９】
複数の関数で構成されるプログラムの前記関数を、命令キャッシュを搭載したプロセッサシステムのメモリ空間に配置することをコンピュータに実行させるためのプログラムであって、
ターゲットプロセッサの命令キャッシュラインサイズをＣＳとして、各関数をサイズがＣＳの命令コードブロックに分割し、各関数Ｆの先頭から数えてＸ番目の命令コードブロックを(Ｆ,Ｘ)と表現した場合に、前記プログラムの実行時に前記命令コードブロックの呼出し関係をトレースすることにより、前記プログラムの実行時の命令コードブロック間の呼出し関係を時系列に表現した、(Ｆ,Ｘ)を識別名とするノードのフロー情報を作成する手順と、
前記ノードのフロー情報に基づいて、識別名毎に前記フロー情報におけるその出現ノード毎の近傍内に、自分と異なる関数に属する各識別名の出現頻度を考慮した情報を、自分からみた他の各識別名の近傍重みとして求める手順と、
前記近傍重み情報に基づいて、前記命令キャッシュの競合回数が少なくなるように、前記複数の関数をメモリ空間に配置する手順と、
をコンピュータに実行させるためのプログラム。
【請求項１０】
前記のフロー情報を作成する手順は、関数iに属する命令コードブロックで識別名がixの参照から、その後、同じixが出現するまでの間に最初に参照された関数ｊ（ただしj≠i）に属する命令コードブロックで識別名がjyの参照までの区間をixjy、前記フロー情報全体に渡るその集合をＲixjyとすると、ixjy区間毎について、区間内でi以外の関数に属する命令コードブロックで相異なる識別名を持つものが、jy自身を入れ計N種類存在した場合にスコアを１÷Ｎとし、Ｒixiyに含まれる全てのixjy区間のスコアの合計値を、前記近傍重みＷixjyとして求める、請求項９に記載のプログラム。
【請求項１１】
前記のメモリ空間に配置する手順は、個々の命令コードブロックの、他関数に属する全命令コードブロックに対する近傍重みの合計値を当該命令コードブロックのノード重みとし、さらに、各関数内の全命令コードブロックの前記ノード重みの合計として関数重みを求め、該関数重みの大きい関数から順にメモリ空間への配置を行う、請求項９または１０に記載のプログラム。
【請求項１２】
前記のメモリ空間に配置する手順は、既に配置済みの関数に対し、現在配置の対象となる配置対象関数を、各キャッシュライン番号の先頭から配置した場合に、配置対象関数に属する各命令コードブロックixと、配置済み関数に属する命令コードブロックjyが同じキャッシュラインにロードされる場合に、前記近傍重みＷixjyと前記近傍重みＷjyixのうち、値の大きい方をキャッシュ競合スコアとして計上していくことで計算される、配置対象関数のキャッシュライン配置毎でのキャッシュ競合スコアのうち、最小のキャッシュ競合スコアを与えるキャッシュライン配置を、当該配置対象関数のキャッシュライン配置とする、請求項９から１１のいずれか1項に記載のプログラム。