JP3698949B2 - 命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体 - Google Patents

命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体 Download PDF

Info

Publication number
JP3698949B2
JP3698949B2 JP2000089382A JP2000089382A JP3698949B2 JP 3698949 B2 JP3698949 B2 JP 3698949B2 JP 2000089382 A JP2000089382 A JP 2000089382A JP 2000089382 A JP2000089382 A JP 2000089382A JP 3698949 B2 JP3698949 B2 JP 3698949B2
Authority
JP
Japan
Prior art keywords
function
call
information
cache
basic block
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2000089382A
Other languages
English (en)
Other versions
JP2001282547A (ja
Inventor
英信 田中
Original Assignee
Necマイクロシステム株式会社
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Necマイクロシステム株式会社 filed Critical Necマイクロシステム株式会社
Priority to JP2000089382A priority Critical patent/JP3698949B2/ja
Publication of JP2001282547A publication Critical patent/JP2001282547A/ja
Application granted granted Critical
Publication of JP3698949B2 publication Critical patent/JP3698949B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体に関し、特にキャッシュを搭載したマイクロプロセッサシステムにおける命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体に関する。
【0002】
【従来の技術】
この種のマイクロプロセッサシステムの処理速度においては、CPU速度に加えて主記憶である外部メモリに対するアクセス、すなわち、メモリアクセスの処理速度(以下メモリアクセス速度)が大きく影響する。しかしながら、最近のCPU速度の著しい向上に対して、メモリアクセス速度の向上はそれほど大きくなく、CPU速度とメモリアクセス速度との差は年々開く一方である。例えば、DRAMのアクセス時間の向上率は年率7%程度であるのに対し、CPU速度の向上率は50〜100%というデータもある(ダビド・エー・パターソン、ジョンエル・ヘネシー(David A.Patterson、John.L.Hennessy)著、成田光彰訳、「コンピュータの構成と設計」、日経BP社、1996年4月19日)。
【0003】
従って、システム処理速度の向上のためには、キャッシュの有効利用が、非常に重要な問題となってきている。なお、キャッシュとは、公知の通り、外部メモリを高速にアクセスするための小容量高速メモリであるバッファから成る機構である。一般にプログラムは、メモリに配置された関数をアドレス順に処理していく。しかし、外部メモリのメモリアクセス速度はCPUの処理速度に比べて非常に遅いため、結果として実行速度が遅くなるという問題がある。
【0004】
上記の問題点を解消するため、関数実行の際に、外部メモリに格納してあるプログラムを、高速アクセス可能なバッファであるキャッシュにコピーして実行することにより、高速なプログラム実行を実現することが可能となる。この理由は、一般に、プログラムを実行すると、一度アクセスされたメモリは、近いうちに再度アクセスされる可能性が高いという性質があるからである。
【0005】
ただし、一般的にキャッシュ用の高速メモリは外部メモリに比較して高価であり、その構成にはコストがかかるため、外部メモリに比べて非常に容量(サイズ)は小さい。このため、キャッシュを用いる処理システムは、外部メモリをキャッシュのサイズで区切った領域に分割し、分割した領域毎に外部メモリをキャッシュに割り当てる。あるアドレスに対する最初のアクセスでそのアドレスのプログラムを上記キャッシュ割り当て領域にコピーし、次に外部メモリの同一アドレスをアクセスした場合はキャッシュを直接アクセスする。このことで、高速なプログラム実行を実現する。
【0006】
このとき、外部メモリからキャッシュメモリへのコピーは特定のサイズの単位で行われ、このサイズでキャッシュを分割した領域をキャッシュラインと呼ぶ。従って、同一のキャッシュラインに割り当てられた外部メモリのアドレスに配置された関数同士は、関数が切り替わる度に、キャッシュにプログラムををコピーし直す必要が生じてくる。これをキャッシュコンフリクトという。このキャッシュコンフリクトが頻繁に起きると、結果としてプログラムの実行速度が遅くなってしまうという問題がある。よって、昨今では、この問題を解消すべく同時に動く可能性の高い関数同士は、同一のキャッシュラインには載らないように配置する方法が研究されている。
【0007】
なお、キャッシュには命令キャッシュとデータキャッシュがあるが、本発明は、命令キャッシュに着目するものである。
【0008】
外部メモリのキャッシュへの割当て方式には、もっとも単純で安価なダイレクトマップ方式や、セットアソシアティブ/フルアソシアティブといった方式があるが、基本的な問題は全て同じであるため、以降、ダイレクトマップ方式を例にとり説明する。
【0009】
また、従来の言語処理系プログラムでは、ある処理単位(関数)毎にメモリに適当に配置していた。このため、キャッシュ搭載のシステムにおいては、それが必ずしも最適に利用されているとは限らなかった。
【0010】
最新の従来技術では、命令キャッシュに関し、キャッシュコンフリクトの回数を確率的に減らすために、関数の呼び出し回数情報に基づいて関数のメモリ配置を最適化することにより、キャッシュを有効に利用する研究がなされており、いくつかのアルゴリズムが論文発表されている。
【0011】
例えば、エー・エッチ・ハッシェミ、デー・アール・カエリ、ビー・カルダ、「キャッシュラインカラーリングを用いた効率的マッピング手順」(A.H.Hashemi,D.R.Kaeli,B.Calder”Efficient Procedure Mapping Using Cache Line Colorling”) ACM SIGPLAN、1997年6月、(文献1)においては、呼び出し回数の多い関数から順にキャッシュコンフリクトを避けるように関数のメモリ配置を最適にしていく手法が公開されている。
【0012】
また、特開平11−232117号公報(文献2)記載の従来の第1の命令キャッシュへの関数割付最適化方法においては、キャッシュメモリを効率よく使用するための関数配置方法の実施例として、上記文献1の方法が採用され、詳しく説明されている。
【0013】
本従来技術のアルゴリズムでは、関数の呼出グラフを作成し、呼び出し回数をその辺(関数の組み合わせ)に対する重みとして優先順位をつけてメモリ空間に配置する。このことにより、まず関数を最初に配置した時のキャッシュコンフリクトを避けることができる。さらに、各関数が配置された「使用色」(すなわち、使用されているキャッシュライン)と、その関数が現在利用できない「利用不可色」の集合を記録しておき、後者、すなわち、利用不可色を使わないように関数を配置し、既に配置した関数についても、その関数の利用できない利用不可色を使わないという条件の下で、別の場所に移動する。これにより、直接の「親」あるいは「子」との間で発生するキャッシュコンフリクトを除去するものである。
【0014】
次に、後述する本発明の実施の形態で適用するアプリケーションプログラムに対する従来例での動作を確認する。このことにより、従来例における問題点をより詳細に説明する。
【0015】
従来の第1の命令キャッシュへの関数割付最適化装置をブロックで示す図10を参照すると、この従来の第1の命令キャッシュへの関数割付最適化装置は、アプリケーションプログラム110から関数呼出情報を読み込み、関数呼び出し時に呼出元と呼出先の各関数情報とその呼出回数を関数呼出組合せ情報111に出力する関数呼出情報出力部1と、関数呼出組合せ情報111に基づき関数の配置を最適化してアドレス空間に配置し関数メモリ配置結果104を出力する関数メモリ配置最適化部103とを備える。
【0016】
図10、関数メモリ配置最適化部103の処理フローをフローチャートで示す図11、及び上記アプリケーションプログラムの一例を示す図3を参照して、従来の第1の命令キャッシュへの関数割付最適化装置の動作である従来の第1の命令キャッシュへの関数割付最適化方法について説明すると、まず、図3に示すアプリケーションプログラム110を適用した場合、関数呼び出し情報出力部1は、プロファイルにより関数呼び出し時に呼出元と呼出先の各関数情報とその呼出回数を関数呼出組合せ情報111に出力する。なお、図10及び図11において、実線の矢印は処理の流れを示し、点線の矢印はデータの流れを示す。
【0017】
関数呼出組合せ情報111の一例を示す図2を参照すると、この関数呼出組合せ情報111は、関数の呼出元、呼出先、呼出回数の各欄から成る。
【0018】
次に、関数メモリ配置最適化部103は、関数呼出組合せ情報111を呼出回数の多い順にソートし、この順番にアドレス空間に配置すると同時に配置した関数が利用できないキャッシュライン対応の「利用不可色」の集合を認識し、これを避けて後続の関数を配置する。
【0019】
すなわち、図9において、ステップP1では関数呼出組合せ情報111から図12に示す関数呼出グラフ120を作成し、ステップP2では作成した関数関数呼出グラフ120を呼び出し回数の多いものと少ないものとに分割する。ここでは、func−funcA,func−funcB,func−funcCが前者の「多いもの」、main−func,funcA−funcD,funcB−funcD、が後者の「少ないもの」となる。
【0020】
ここで作成した関数呼出グラフ120においては、関数の組合せが辺となり、その両端のノードが組合せにおける2つの関数となる。
【0021】
なお、図3における各関数の占めるキャッシュライン数すなわち「色」の数は、funcが2個、funcA,funcB,funkC,mainが各1個であるものとする。
【0022】
次に、ステップP3において、呼出回数の多いもののグループを呼出回数の多い順にソートし、その順番でステップP4以降の処理を行う。ステップP4では呼出回数の多い辺が残っているか確認し、残っているのでステップP5に進み、func−funcAの辺に対して両側のノードが未配置であるかを確認する。この確認において未配置であるのでステップP9に進み、funcとfuncAをメモリ空間上の任意の場所に隣接して配置し、ステップP15においてfuncとfuncAの利用できない「色」を利用不可能集合として認識した後、再びステップP4に戻る。隣接して配置されたfunc−funcAの辺は、複合ノードとして今後ひとつのノードとして扱われる。この時点で、既に配置済みの関数とキャッシュラインの関係および各関数の利用不可能集合の状態は、図13(A)に示すようになっている。
【0023】
続いて、呼出回数の多い辺がまだ残っているのでステップP5に進み、func−funcCの辺に対して両側のノードが未配置であるかを確認する。この確認において、funcは配置済みであるのでステップP6に進み、2個の異なる複合ノードに属するノードを結ぶ辺かどうかを確認する。この確認において、funcCは複合ノードに属していないので、ステップP7に進み、一方のノードが複合ノードに属し他方のノードが未配置かどうか確認すると、条件に当てはまるのでステップP11に進む。
【0024】
ステップP11では未配置のfuncCをfuncに近い場所に配置し、ステップP13において関数配置の際に利用不可能集合の影響で隙間が空いてないかを確認すると空いていないので、ステップP15においてfuncとfuncCを利用できない「利用不可色」を利用不可能集合として認識した後に、再びステップP4に戻る。
【0025】
この時点で、既に配置済みの関数とキャッシュラインの関係及び各関数の利用不可能集合の状態は、図13(B)に示すようになっている。
【0026】
ステップP4において、まだ未配置の辺があるので、ステップP5に進み、func−funcBの辺に対し、両側のノードが未配置であるかを確認する。この確認において、funcは配置済みであるので、ステップP6に進み、2個の異なる複合ノードに属するノードを結ぶ辺かどうかを確認する。この確認において、funcBは複合ノードに属していないので、ステップP7に進み、一方のノードが複合ノードに属し他方のノードが未配置かどうか確認する。この確認において、条件に当てはまるので、ステップP11に進む。
【0027】
ステップP11では、未配置のfuncBと対を成すfuncの中心から複合ノードの両端までの距離が同じであるため、任意に左側に配置し、ステップP13において関数配置の際、利用不可能集合の影響で隙間が空いてないか確認する。すると、空いていないので、ステップP15に進み、funcとfuncBの利用できない「利用不可色」を利用不可能集合として認識したのち、再びステップP4に戻る。
【0028】
ステップP4において、未配置の辺が無くなったことを確認すると、ステップP16に進み、未配置ノードmain、funcDを任意のキャッシュラインに配置する。
【0029】
図13(C)は最終的な関数配置とキャッシュラインの関係、及び各関数の利用不可能集合の状態、すなわち、関数メモリ配置結果104であるが、funcA、funcBが同一キャッシュライン「青」を共有しており、それぞれの利用不可能集合には「青」が含まれていない。よって、呼び出し元関数と呼び出し先関数の間のキャッシュコンフリクトは削減できる。
【0030】
上記の従来の第1の技術では、手続き、関数、あるいはサブルーチン同士が、互いを呼び出す際のキャッシュメモリ上での衝突およびキャッシュミスを防止することが目的である。この目的において、手続き、関数、あるいはサブルーチンが実際に呼び出される回数を示す情報と、手続き、関数、あるいはサブルーチン同士が、互いを呼び出す関係を示す情報とを利用している。これにより、手続き、関数、あるいはサブルーチン同士が、互いを呼び出す際のキャッシュメモリ上での衝突を防止できる。
【0031】
このように、従来の第1の技術においては呼出元関数と呼出先関数の間のキャッシュコンフリクトは削減できるが、(1)ある関数の中で複数の関数が連続して呼ばれている場合、あるいは(2)ループの中で呼ばれている場合等には、これら複数の関数間のキャッシュコンフリクトを削減できず、極めて多くのキャッシュコンフリクトが生じてしまうという第1の問題がある。
【0032】
つまり、funcAとfuncBは直接の呼出関係がないため、関数呼出組み合わせ情報を元にした関数配置を行う従来技術では、これらの関数が同一キャッシュラインに乗ってしまう場合があり得る。しかし、図3の上記アプリケーションプログラム例より明らかな通り、funcAとfuncBはループ中で連続して呼ばれ、さらにfuncBでは、funcDを経由してfuncAを呼び出すというプログラム記述となっており、funcAとfuncBが頻繁に遷移を繰り返すため、このループ処理において、極めて多くのキャッシュコンフリクトが生じてしまう。
【0033】
また、以上の第1の問題を解決するため、特願2000−027218号明細書(文献3)記載の従来の第2の命令キャッシュへの関数割付最適化方法は、プロファイルにより直接の関数呼出組み合わせ情報を出力する代わりに、関数実行の時系列情報を出力し、この時系列情報から、連続した関数呼出しなど直接の関数呼出し以外にキャッシュコンフリクトを発生する可能性のある関数の組み合わせ実行パターンを検出し、検出した関数間キャッシュコンフリクト組み合わせ情報に対して、従来技術の関数配置最適化を適用する。これにより、従来削減できなかった、(1)ある関数の中で複数の関数が連続して呼ばれている場合、あるいは(2)ループの中で呼ばれている場合など、これら複数の関数間のキャッシュコンフリクトを削減し、アプリケーションプログラムの実行スピードを向上する手段を提供するものである。
【0034】
しかしながら、この従来の第2の技術は、プログラムの遷移が単純な場合は、単純な処理で実現可能であり、極めて有効な手段であるが、この例で示したように、(3)ループ中で呼ばれる関数がまた別の関数を呼んでいるような場合などでは、パターンマッチングができなくなり、最適化ができないという第2の問題がある。
【0035】
【発明が解決しようとする課題】
上述した従来の第1の命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体は、ある関数の中で複数の関数が連続して呼ばれている場合、あるいはループの中で呼ばれている場合等には、これら複数の関数間のキャッシュコンフリクトを削減できるとは限らず、最悪の場合には極めて多くのキャッシュコンフリクトが生じてしまうというという欠点があった。
【0036】
また、上記欠点の解決を図った従来の第2の命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体は、プログラムの遷移が単純な場合は、単純な処理で実現可能であり、極めて有効な手段であるが、ループ中で呼ばれる関数がまた別の関数を呼んでいるような場合などでは、パターンマッチングができなくなり、最適化が不可能となるという欠点があった。
【0037】
本発明の目的は、上記第1及び第2の従来技術の欠点を除去し、複数の関数間のキャッシュコンフリクトを削減し、アプリケーションプログラムの実行スピードの向上を図った命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体を提供することにある。
【0038】
【課題を解決するための手段】
請求項1の発明の命令キャッシュへの関数割付最適化装置は、命令キャッシュを搭載したマイクロプロセッサシステム用の所定のアプリケーションプログラムを入力し前記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化装置において、
前記アプリケーションプログラムを入力しプロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報に出力する関数呼出情報出力部と、
前記アプリケーションプログラムを入力し前記プロファイルによる関数呼出に応じた関数の遷移に対して該関数のID及び該関数の基本ブロックの順番の組合せを関数遷移毎に並べた関数基本ブロック遷移情報に出力する関数基本ブロック遷移情報出力部と、
前記関数呼出組合せ情報を参照し前記関数呼出組合せ相互間で前記関数遷移の回数である遷移回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、次に生成した前記呼出回数入替情報を参照して関数をメモリ空間上のアドレスに仮配置した後、前記関数基本ブロック遷移情報を参照してキャッシュコンフリクトの回数を検出し、前記呼出回数入替データの中で、前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定し対応する関数メモリ配置結果を出力する関数メモリ配置最適化部とを備えて構成されている。
【0039】
また、前記関数呼出組合せ情報及び前記呼出回数入替情報の各々が、関数の呼出元の関数名を記述した呼出元欄と、
前記関数の呼出先の関数名を記述した呼出先欄と、
前記関数の呼出回数を設定する呼出回数欄とをそれぞれ有しても良い。
【0040】
請求項3の命令キャッシュへの関数割付最適化方法は、命令キャッシュを搭載したマイクロプロセッサシステム用のアプリケーションプログラムを入力し前記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化方法において、
前記アプリケーションプログラムを入力し前記プロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報を生成し、
前記アプリケーションプログラムを入力し前記プロファイルにより得られた前記関数の基本ブロック単位の実行に関する関数基本ブロック遷移情報を生成した後、
前記関数呼出組合せ情報を参照し前記関数呼出組合せ相互間で前記関数遷移の回数である遷移回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、前記関数基本ブロック遷移情報を参照して各関数のキャッシュコンフリクトの回数を検出し、前記呼出回数入替データの中で前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定する関数メモリ配置最適化工程を有することを特徴とするものである。
【0041】
また、前記関数メモリ配置最適化工程が、前記関数呼出組合せ情報を参照して前記呼出回数入替情報を生成する呼出回数入替ステップと、
生成した前記呼出回数入替情報を参照して関数をメモリ空間上のアドレスに仮配置する関数メモリ仮配置ステップと、
前記関数基本ブロック遷移情報を参照して仮配置した各関数のキャッシュコンフリクト回数を検出するキャッシュコンフリクト回数算出処理ステップと、
前記関数呼出回数入替データの中で前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定する関数メモリ配置ステップとを有することを特徴としても良い。
【0042】
また、前記関数メモリ配置最適化工程における前記呼出回数入替ステップが、前記関数呼出組合せ情報を参照して呼出回数の入替対象とする前記関数呼出組合せの数である引数を読み込み第1の変数を設定する第1のステップと、
前記第1の変数が0か否かを判定する第2のステップと、
前記第2のステップで前記第1の変数が0の場合現在の内容の呼出回数入替情報を出力する第3のステップと、
前記第2のステップで前記第1の変数が0以外の場合呼出回数入替処理を行い前記第1の変数−1に対応する引数を設定して再帰呼出を行う第4のステップと、
第2の変数に0を設定する第5のステップと、
前記第2の変数が前記第1の変数−1より小さいか否かの判定を行い否の場合は処理を終了する第6のステップと、
前記第6のステップで諾の場合前記第2の変数と前記第1の変数−1である第1のインッデクスの各々の前記呼出回数を交換する第7のステップと、
前記引数を1デクリメントして前記呼出回数入替処理を行い前記第1の変数−1に対応する引数を設定して再帰呼出を行う第8のステップと、
前記第2の変数である第2のインデックスと前記第1の変数−1の各々の前記呼出回数を交換する第9のステップと、
前記第2の変数を1インクリメントし前記第6のステップ以降を反復する第10のステップとを有することを特徴としても良い。
【0043】
さらに、前記関数メモリ配置最適化工程における前記キャッシュコンフリクト回数算出処理ステップが、キャッシュコンフリクト回数をカウントする変数を0に初期化する第1のステップと、
前記関数基本ブロック遷移情報を順次読み込み、関数IDと基本ブロックの順番情報であるID順番情報を求める第2のステップと、
前記関数基本ブロック遷移情報は終了したかを判定し諾の場合は処理を終了する第3のステップと、
前記第3のステップで否の場合は前記ID順番情報のキャッシュ上の配置を求める第4のステップと、
先頭の前記関数基本ブロック遷移情報かを判定し諾の場合は前記第2のステップに戻る第5のステップと、
前記第5のステップで否の場合以前のブロックとアドレス上の重なりがあるかを判定し否の場合は前記第2のステップに戻る第6のステップと、
前記第6のステップで諾の場合は前記キャッシュコンフリクト回数をカウントする変数を1インクリメントし前記第2のステップに戻る第7のステップとを有することを特徴としても良い。
【0044】
請求項7の命令キャッシュへの関数割付最適化手順を記録した記録媒体は、命令キャッシュを搭載したマイクロプロセッサシステム用のアプリケーションプログラムを入力し前記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化手順を記録した記録媒体において、
前記アプリケーションプログラムを入力し前記プロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報を生成する手順と、
前記アプリケーションプログラムを入力し前記プロファイルにより得られた前記関数の基本ブロック単位の実行に関する関数基本ブロック遷移情報を生成する手順と、
前記関数呼出組合せ情報を参照し前記関数呼出組合せ相互間で前記関数遷移の回数である遷移回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、前記関数基本ブロック遷移情報を参照して各関数のキャッシュコンフリクトの回数を検出し、前記呼出回数入替データの中で前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定する関数メモリ配置最適化手順とを実行させるプログラムを記録したことを特徴とするものである。
【0045】
【発明の実施の形態】
次に、本発明の実施の形態について図面を参照して説明する。
【0046】
本発明は、命令キャッシュを搭載したマイクロプロセッサシステム用のアプリケーションプログラムを入力し、上記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化方法において、プロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報を生成し、プロファイルにより得られた関数の基本ブロック単位の実行に関する関数基本ブロック遷移情報を生成し、関数呼出組合せ情報を参照し関数呼出組合せ相互間で関数遷移の回数である遷移回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、関数基本ブロック遷移情報を参照して命令キャッシュのキャッシュコンフリクト回数を検出して、呼出回数入替データの中で最もキャッシュコンフリクト回数の少なくなるように関数をメモリ空間上のアドレスに配置することにより、プログラムの実行スピードを向上させるものである。
【0047】
本発明の実施の形態を図10と共通の構成要素には共通の参照文字/数字を付して同様にブロックで示す図1を参照すると、この図に示す本実施の形態の命令キャッシュへの関数割付最適化装置は、従来と共通のアプリケーションプログラム110を入力し、プロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報111に出力する関数呼出情報出力部1に加えて、アプリケーションプログラム110を入力し、プロファイルによる関数呼出に応じた関数の遷移に対して、関数のID(識別)及びその関数の基本ブロックの順番の組合せを関数遷移毎に並べた関数基本ブロック遷移情報112に出力する関数基本ブロック遷移情報出力部2と、関数呼出組合せ情報111を参照して関数呼出組合せ相互間で上記関数遷移の回数である遷移回数を入替えて関数呼出回数入替データから成る呼出回数入替情報113を生成し、次に生成した呼出回数入替情報113を参照して関数をメモリ空間上のアドレスに仮配置した後、関数基本ブロック遷移情報112を参照してキャッシュコンフリクトの回数を検出し、関数呼出回数を入替えたもの、すなわち、関数呼出回数入替データの中で、キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定し対応する関数メモリ配置結果4を出力する関数メモリ配置最適化部3とを備える。
【0048】
なお、図1において、実線の矢印は処理の流れを示し、点線の矢印はデータの流れを示す。
【0049】
関数呼出組合せ情報111の一例を示す図2を参照すると、この関数呼出組合せ情報111は、関数の呼出元の関数名を記述した呼出元欄、関数の呼出先の関数名を記述した呼出先欄、及びその呼出回数を設定する呼出回数欄の各欄から成る。
【0050】
また、呼出回数入替情報113も、その構成は関数呼出組合せ情報111と全く同じであり、関数の呼出元の関数名を記述した呼出元欄、関数の呼出先の関数名を記述した呼出先欄、及びその呼出回数を設定する呼出回数欄の各欄から成る。
【0051】
次に、図1、図2、上記アプリケーションプログラムの一例を示す図3、及び関数メモリ配置最適化部の処理フローをフローチャートで示す図5を参照して本実施の形態の動作について説明すると、まず、関数呼出情報出力部1は、アプリケーションプログラム110を入力し、従来と同様に、プロファイルにおける関数呼び出し時に呼出元と呼出先の各関数情報とその呼出回数を関数呼出組合せ情報111に出力する。ここで、プロファイルとは、関数の基本ブロックの先頭及び呼出関数からの復帰時に、関数IDと基本ブロックの順番を出力するコードをアプリケーションプログラム110に挿入して実行することである。
【0052】
次に、関数基本ブロック遷移情報出力部2は、アプリケーションプログラム110を入力し、プロファイル、すなわち、関数の基本ブロックの先頭、及び呼出関数から復帰時に、関数IDと基本ブロックの順番を出力するコードをアプリケーションプログラム110に挿入して実行することにより、これらの情報を関数基本ブロック遷移情報112に出力する。
【0053】
図3を再度参照すると、この図に示すアプリケーションプログラム110はC言語によるアプリケーションプログラムの例であり、関数mainの関数IDを0、関数funcの関数IDを1、関数funcAの関数IDを2、関数funcBの関数IDを3、関数funcCの関数IDを4、関数funcDの関数IDを5とそれぞれ想定する。
【0054】
さらに関数funcは、関数の基本処理単位である基本ブロックがループ文2つから構成され、また、関数main,funcA,funcB,funcC,funcDの各々の基本ブロックが各1つの構成とする。
【0055】
まず、先頭の関数mainの呼出時点でmainのIDである0と基本ブロックの1番目の組合せである0−1(以下、組合せ0−1等)とを出力する。次に、関数mainから関数funcに処理が移り、funcのIDである1と基本ブロック1番目の組合せ1−1とを出力する。次に、関数funcからfuncAに処理が移り、funcAの関数IDである2と基本ブロック1番目の組合せ2−1とを出力する。次に、関数funcAからfuncに処理が復帰し、funcのIDである1と基本ブロックの1番目の組合せ1−1とを出力する。以降、同様にしてプログラムの終了まで関数IDと基本ブロックの順番の組合せを出力する。
【0056】
本例のアプリケーションプログラム110は、関数mainから関数funcを呼出し、関数funcでは関数funcAと関数funcBを連続して呼出す処理を20回繰返す(反復)処理と、続いて関数funcAと関数funcCを連続して呼出す処理を30回繰返す処理を行い、関数mainに戻って終了するプログラムである。ここで、関数funcBは関数funcDを呼出し、さらに、関数funcDは関数funcAを呼出す構成である。この処理により、プログラムの終了までプロファイルを実行すると、図4に示すような関数IDと基本ブロックの順番の情報の配列である関数基本ブロック遷移情報112が作成される。
【0057】
次に、関数メモリ配置最適化部3は、関数呼出組合せ情報111を参照して呼出回数を入替えて関数呼出回数入替データから成る呼出回数入替情報113を生成する。次に、生成した呼出回数入替情報113を参照して、関数をメモリ空間上のアドレスに仮配置する。その後、関数基本ブロック遷移情報112を参照して仮配置した各関数のキャッシュコンフリクトの回数を検出し、呼出回数を入替たもの、すなわち、関数呼出回数入替データの中で、キャッシュコンフリクトの最も回数の少ないものに関数のメモリ配置を決定する。
【0058】
すなわち、図5を併せて参照して関数メモリ配置最適化部3の動作の詳細を説明すると、まず関数呼出組合せ情報111を参照して呼出回数入替処理ステップS1を行う。本処理では引数として呼出回数の多い組合せの数を与える。この多い少ないの基準は、従来技術である関数メモリ配置最適化部おける関数呼出グラフ分割と同様である。本例では関数呼出組合せ情報111において、func−funcA、func−funcB、func−funcCの各組合せを関数呼出回数が多いと判断し、その他の組合せを少ないと判断する。よって呼出回数の多い組合せの数は3種類となり、これを引数として渡すこととなる。以後、呼出回数の入替対象は、この3組となる。
【0059】
ここで、呼出回数入替処理ステップS1の詳細をフローチャートで示す図6及び呼出回数入替情報113の一例を示す図7を併せて参照して呼出回数入替処理ステップS1の詳細動作について説明すると、まず、ステップS101で引数3を読み込む。次に、ステップS102で変数nに引数3を設定する。次に、ステップS103の条件判定「nが0か」を行い、変数nが0でないので、ステップS105に分岐し、変数n−1とする呼出回数入替処理を行い、n−1に対応する引数2として再帰呼出を行う。
【0060】
次に、再度ステップS101で引数2を読み込み、ステップS102で変数nに2を設定する。次に、ステップS103の条件判定を行い、変数nが0でないので、ステップS105に分岐し、変数n−1とする呼出回数入替処理を行い、引数1として再び再帰呼出を行う。
【0061】
次に、ステップS101で引数1を読み込み、ステップS102で変数nに1を設定する。ステップS103の条件判定を行い、変数nが0でないので、ステップS105に分岐し、変数n−1とする呼出回数入替処理を行い、引数0としてさらに再帰呼出を行う。
【0062】
次に、ステップS101で引数0を読み込み、ステップS102で変数nに引数0を設定する。ステップS103の条件判定を行い、変数nが0であるので、ステップS104に進み、現在の内容である呼出回数入替情報113を出力する。ここまでは呼出回数は全く入替えていないので、呼出回数入替情報113として図7(A)に示す関数呼出組合せ情報111と全く同じものを出力し、引数0における処理は終了する。
【0063】
次に、引数1における処理に戻り、ステップS106で変数iに初期値0を設定し、ステップS107の条件判定「i<(n−1)」を行う。n−1は0であり従って変数iは(n−1)より小さくはないので、引数1における処理は終了する。
【0064】
次に、引数2における処理に戻り、ステップS106で変数iに初期値0を設定し、ステップS107の条件判定を行う。n−1は1であり従って変数iは(n−1)より小さいので、ステップS108に進む。ステップS108で、インデックスn−1及びiの要素、すなわち、呼出回数を交換する。この例では、インデックス0(i)対応のfunc−funcAの呼出回数50と、インデックス1(n−1)対応のfunc−funcBの呼出回数20とを交換する。その後、ステップS109で引数を1として再び再帰呼出を行う。
【0065】
次に、ステップS101で引数1を読み込み、ステップS102で変数nに1を設定する。ステップS103の条件判定を行い、変数nが0でないので、ステップS105に分岐し、呼出回数入替処理ステップS109を引数0としてさらに再帰呼出を行う。
【0066】
次にステップS101で、引数0を読み込み、ステップS102で変数nに引数0を設定する。ステップS103の条件判定を行い、変数nが0であるので、ステップS104に進み、図7(B)に示す呼出回数入替情報113を出力し、引数0における処理は終了する。
【0067】
次に、引数1における処理に戻り、ステップS106で変数iに初期値0を設定し、ステップS107の条件判定「i<(n−1)」を行う。n−1は0であり従って変数iは(n−1)より小さくはないので、引数1における処理を終了する。
【0068】
次に、引数2における処理に戻り、ステップS110でインデックス0対応のfunc−funcAの呼出回数20と、インデックス1対応のfunc−funcBの呼出回数50とを交換して元に戻す。その後、ステップS110で変数iを0から1とし、ステップS107の条件判定を行う。n−1は0であり従って変数iは(n−1)より小さくはないので、引数2における処理を終了する。
【0069】
以降、同様の処理を繰り返し、図7(C)、(D)、(E)、(F)をそれぞれ出力して、呼出回数入替処理ステップS1を終了する。
【0070】
次に、図5に戻り、ステップS2で、呼出回数入替情報113を参照し、この情報が(A)から(F)までの6個出力されていることを認識し、(A)から順に以後の処理を行っていく。
【0071】
以降、ステップS4からステップS19まで、従来のステップP1〜P16と同一処理を行う。
【0072】
このステップS4〜S19のアルゴリズムは、従来の技術で説明したように、関数の呼出グラフを作成し、呼び出し回数をその辺(関数の組み合わせ)に対する重みとして優先順位をつけてメモリ空間に配置することにより、関数を最初に配置した時のキャッシュコンフリクトを避けることができる。各関数が配置された「使用色」(すなわち、使用されているキャッシュライン)と、その関数が現在利用できない「利用不可色」の集合を記録しておき、後者、すなわち、利用不可色を使わないように関数を配置し、既に配置した関数についても、その関数の利用できない利用不可色を使わないという条件の下で、別の場所に移動する。これにより、直接の「親」あるいは「子」との間で発生するキャッシュコンフリクトを除去するものである。
【0073】
まず、ステップS4で、関数呼出組合せ情報111から図12に示す関数呼出グラフ120を作成し、ステップS5では作成した関数関数呼出グラフ120を呼出回数の多いものと少ないものとに分割する。ここでは、func−funcA,func−funcB,func−funcCの各組合せが呼出回数の「多いもの」、main−func,funcA−funcD,funcB−funcD、が呼出回数の「少ないもの」となる。
【0074】
ここで作成した関数呼出グラフ120においては、関数の組合せが辺となり、その両端のノードが組合せにおける2つの関数となる。
【0075】
なお、図3における各関数の占めるキャッシュライン数、すなわち「色」の数は、funcが2個、funcA,funcB,funkC,mainが各1個であるものとする。
【0076】
次に、ステップS6において、呼出回数の多いもののグループを呼出回数の多い順にソートし、その順番でステップS7以降の処理を行う。ステップS7では呼出回数の多い辺が残っているか確認し、残っているのでステップS8に進み、func−funcAの辺に対して両側のノードが未配置であるかを確認する。この確認において未配置であるのでステップS9に進み、funcとfuncAをメモリ空間上の任意の場所に隣接して配置し、ステップS18においてfuncとfuncAの利用できない「色」を利用不可能集合として認識した後、再びステップS7に戻る。隣接して配置されたfunc−funcAの辺は、複合ノードとして今後ひとつのノードとして扱われる。この時点で、既に配置済みの関数とキャッシュラインの関係および各関数の利用不可能集合の状態は、図13(A)に示すようになっている。
【0077】
続いて、呼出回数の多い辺がまだ残っているのでステップS8に進み、func−funcCの辺に対して両側のノードが未配置であるかを確認する。この確認において、funcは配置済みであるのでステップS9に進み、2個の異なる複合ノードに属するノードを結ぶ辺かどうかを確認する。この確認において、funcCは複合ノードに属していないので、ステップS10に進み、一方のノードが複合ノードに属し他方のノードが未配置かどうか確認すると、条件に当てはまるのでステップS14に進む。
【0078】
ステップS14では未配置のfuncCをfuncに近い場所に配置し、ステップS16において関数配置の際に利用不可能集合の影響で隙間が空いてないかを確認すると空いていないので、ステップS18においてfuncとfuncCを利用できない「利用不可色」を利用不可能集合として認識した後に、再びステップS7に戻る。
【0079】
この時点で、既に配置済みの関数とキャッシュラインの関係及び各関数の利用不可能集合の状態は、図13(B)に示すようになっている。
【0080】
ステップS7において、まだ未配置の辺があるので、ステップS8に進み、func−funcBの辺に対し、両側のノードが未配置であるかを確認する。この確認において、funcは配置済みであるので、ステップS9に進み、2個の異なる複合ノードに属するノードを結ぶ辺かどうかを確認する。この確認において、funcBは複合ノードに属していないので、ステップS10に進み、一方のノードが複合ノードに属し他方のノードが未配置かどうか確認する。この確認において、条件に当てはまるので、ステップS14に進む。
【0081】
ステップS14では、未配置のfuncBと対を成すfuncの中心から複合ノードの両端までの距離が同じであるため、任意に左側に配置し、ステップS16において関数配置の際、利用不可能集合の影響で隙間が空いてないか確認する。すると、空いていないので、ステップS18に進み、funcとfuncBの利用できない「利用不可色」を利用不可能集合として認識したのち、再びステップS7に戻る。
【0082】
ステップS7において、未配置の辺が無くなったことを確認すると、ステップS46に進み、未配置ノードmain、funcDを任意のキャッシュラインに配置する。
【0083】
以上のステップS4〜S19の処理結果、図7(A)に示す呼出回数入替情報113に対しては、従来の図13(C)と同様の、本実施の形態の関数メモリ配置結果4を色で示す図9(A)の配置となる。
【0084】
本実施の形態の関数配置とキャッシュラインの関係及び各関数の利用不可能集合の状態すなわち、関数メモリ配置結果4を示す図9を参照すると、図7に示す呼出回数入替情報113(A)〜(F)の各々に対応して図9(A)〜(F)に示すようになる。
【0085】
本実施の形態の例では、処理の対象とする6つの関数main、func、funcA、funcB、funcC、funcDのうち、呼出回数入替の対象とする4つの関数func、funcA、funcB、funcCに利用不可能集合対応の色すなわち、利用不可能色を割り付ける。この例では、関数funcに青及び黄を、関数funcA、funcB及びfuncCに赤及び緑をそれぞれ利用不可能色として割り付ける。
【0086】
次に、ステップS20に進み、関数基本ブロック遷移情報112を参照してキャッシュコンフリクト回数算出処理を行う。
【0087】
以下の説明では、上述したように、関数main、func、funcA、funcB、funcC、及びfuncDの各々の関数IDを0,1,2,3,4,5と設定してあるものとする。
【0088】
キャッシュコンフリクト回数算出処理ステップS20の詳細をフローチャートで示す図8を参照してこのキャッシュコンフリクト回数算出処理の詳細動作について説明すると、まず、ステップS201で、コンフリクト回数をカウントする変数を0に初期化する。
【0089】
次に、関数基本ブロック遷移情報読み込みステップS202で、関数基本ブロック遷移情報112を順次読み込み、関数IDと基本ブロックの順番情報(以下ID順番情報)0−1、すなわち、main−1番を得る。次に、ステップS203の条件判定「関数基本ブロック遷移情報は終了」で、関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204に進む。ステップS204で、ID順番情報0−1のキャッシュ上の配置を求め、図9(A)を参照して、関数main対応のキャッシュラインの色「黄」を得る。次に、ステップS205の条件判定「先頭の関数基本ブロック遷移情報か」で、ID順番情報0−1は先頭の関数基本ブロック遷移情報であるため、ステップS202に戻る。
【0090】
次に、再度ステップS202で、関数基本ブロック遷移情報112を順次読み込み、ID順番情報1−1、すなわち、func−1番を得る。次に、ステップS203で、関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204に進み、ID順番情報1−1のキャッシュ上の配置として、図9(A)を参照して、関数func対応のキャッシュラインの色「赤」を得る。次に、ステップS205の条件判定で、ID順番情報1−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次にステップS206の条件判定「以前のブロックとアドレス上の重なりがあるか」で、「赤」に配置されたものは以前にはなかったので、ステップS202に戻る。
【0091】
次に、再度ステップS202で、関数基本ブロック遷移情報112を順次読み込み、次のID順番情報2−1、すなわち、funcA−1を得る。以下、上記処理と同様にステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204でID順番情報2−1のキャッシュ上の配置を、図9(A)を参照して、関数funcA対応のキャッシュライン「青」を得る。次に、ステップS205の条件判定で、このID順番情報2−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次にステップS206の条件判定で、「青」に配置されたものは以前にはなかったので、ステップS202に戻る。
【0092】
次に、ステップS202で、関数基本ブロック遷移情報112を順次読み込み、次のID順番情報1−1、すなわち、func−1を得る。次に、ステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204でID順番情報1−1のキャッシュ上の配置として、図9(A)を参照して、関数func対応のキャッシュライン「赤」を得る。次にステップS205の条件判定で、ID順番情報1−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次にステップS206の条件判定で、「赤」に配置された以前のブロックは今回と同様1−1なので、ステップS202に戻る。
【0093】
次に、ステップS202で関数基本ブロック遷移情報112を順次読み込み、ID順番情報3−1、すなわち、funcB−1を得る。次に、ステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204でID順番情報3−1のキャッシュ上の配置を、図9(A)を参照して、関数funcB対応のキャッシュライン「青」を得る。次に、ステップS205の条件判定で、ID順番情報3−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次に、ステップS206の条件判定で、「青」に配置された以前のブロックは今回と異なりID順番情報2−1であったので、ステップS207に進む。次に、ステップS207で、コンフリクト回数をカウントする変数(以下、コンフリクト回数)を1インクリメントし、ステップS202に戻る。
【0094】
次にステップS202で関数基本ブロック遷移情報112を順次読み込み、ID順番情報5−1、すなわち、funcD−1を得る。次に、ステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204でID順番情報5−1のキャッシュ上の配置を、図9(A)を参照して、関数funcD対応のキャッシュライン「緑」と得る。次に、ステップS205の条件判定で、ID順番情報5−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次にステップS206の条件判定で、「緑」に配置されたものは以前にはなかったので、ステップS202に戻る。
【0095】
次に、ステップS202で関数基本ブロック遷移情報112を順次読み込み、ID順番情報2−1、すなわち、funcA−1を得る。次に、ステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204で2−1のキャッシュ上の配置を、図9(A)を参照して、関数funcA対応のキャッシュライン「青」と得る。次に、ステップS205の条件判定で、ID順番情報2−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次に、ステップS206の条件判定で、「青」に配置された以前のブロックは今回と異なりID順番情報3−1であったので、ステップS207に進む。次に、ステップS207で、コンフリクト回数を1インクリメントし、ステップS202に戻る。
【0096】
次にステップS202で関数基本ブロック遷移情報112を順次読み込み、ID順番情報5−1、すなわち、funcD−1を得る。次に、ステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204でID順番情報5−1のキャッシュ上の配置を、図9(A)を参照して、関数funcD対応のキャッシュライン「緑」を得る。次に、ステップS205の条件判定で、ID順番情報5−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次に、ステップS206の条件判定で、「緑」に配置された以前のブロックは今回と同様ID順番情報5−1なので、ステップS202に戻る。
【0097】
次に、ステップS202で関数基本ブロック遷移情報112を順次読み込み、ID順番情報3−1、すなわち、funcB−1を得る。次に、ステップS203で関数基本ブロック遷移情報はまだ終了ではないと判定して、ステップS204でID順番情報3−1のキャッシュ上の配置を、図9(A)を参照して、関数funcB対応のキャッシュライン「青」を得る。次に、ステップS205の条件判定で、ID順番情報3−1は先頭の関数基本ブロック遷移情報ではないため、ステップS206に進む。次に、ステップS206の条件判定で、「青」に配置された以前のブロックは今回と異なりID順番情報2−1だったので、ステップS207に進む。次に、ステップS207で、コンフリクト回数を1インクリメントし、ステップS202に戻る。
【0098】
以下、同様の処理を繰り返して関数基本ブロック遷移情報112の最後まで処理を行なうと、キャッシュライン「青」(以下、「青」等と省略)におけるコンフリクト回数は79回、「黄」におけるコフリクト回数は2回、「緑」におけるコンフリクト回数は1回、「赤」におけるコンフリクト回数は0回となり、合計82回のコンフリクトが発生することを算出する。
【0099】
以上により、キャッシュコンフリクト回数算出処理ステップS20を終了する。
【0100】
次に、ステップS2に戻り、以後同様の処理を行い、図7に示す呼出回数入替情報113(図7(A)〜(F))の各々に対する関数配置とキャッシュラインの関係及び各関数の利用不可能集合の状態(以下キャッシュメモリ配置)はそれぞれ図9(A)〜(F)となる。
【0101】
例えば、図9(B)のキャッシュメモリ配置の場合は、(A)の場合と同一の82回のコンフリクトが発生することを算出する。
【0102】
また、図9(C)と(F)のキャッシュメモリ配置の場合は、「青」におけるコンフリクト回数は1回、「黄」におけるコフリクト回数は2回、「緑」におけるコンフリクト回数は1回、「赤」におけるコンフリクト回数は0回となり、合計4回のコンフリクトが発生することを算出する。
【0103】
さらに、図9(D)と(E)のキャッシュメモリ配置の場合は、「青」におけるコンフリクト回数は79回、「黄」におけるコフリクト回数は2回、「緑」におけるコンフリクト回数は1回、「赤」におけるコンフリクト回数は0回となり、合計82回のコンフリクトが発生することを算出する。
【0104】
よって、図9(C)と(F)のキャッシュメモリ配置の場合にキャッシュコンフリクトの発生回数が一番少ないことが分かる。
【0105】
ステップS3において、関数のキャッシュメモリ配置をこのうちの一方である図9(C)の配置に最終決定する。
【0106】
従来の第1の技術では、funcA、funcBが同一キャッシュライン「青」を共有しており、それぞれの利用不可能集合には「青」が含まれておらず、従ってこれらfuncA、funcBは直接の呼出関係がないため、関数呼出組み合わせ情報を元にした関数配置を行うと、これらの関数が同一キャッシュラインに乗ってしまう場合があり得、アプリケーションプログラムによっては、必ずしもこれら両関数間のキャッシュコンフリクトを削減することができなかった。これに対し、本実施の形態では、図9(C)に示す通り、funcAは「黄」、funcBは「青」にそれぞれ配置されるため、funcAとfuncBとが遷移を繰り返してもキャッシュコンフリクトが起きず、アプリケーションプログラムの実行スピードを向上することができる。
【0107】
【発明の効果】
以上説明したように、本発明の命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体は、関数呼出情報出力部と、関数呼出に応じた関数の遷移に対して該関数のID及び該関数の基本ブロックの順番の組合せを関数遷移毎に並べた関数基本ブロック遷移情報に出力する関数基本ブロック遷移情報出力部と、上記関数呼出組合せ情報を参照し関数呼出組合せ相互間で遷移回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、次に生成した呼出回数入替情報を参照して関数をメモリ空間上のアドレスに仮配置した後、関数基本ブロック遷移情報を参照してキャッシュコンフリクトの回数を検出し、呼出回数入替データの中で、キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定し対応する関数メモリ配置結果を出力する関数メモリ配置最適化部とを備えているので、以下の効果を奏する。
【0108】
まず、第1の効果は、(1)ある関数の中で複数の関数が連続して呼ばれている場合、あるいは、(3)ループの中で呼ばれている場合等に対しても、キャッシュコンフリクトを削減するよう関数をメモリ空間上に配置することにより、アプリケーションプログラムの実行スピードを向上できることである。
【0109】
その理由は、関数が連続して呼ばれている場合やループ中で呼ばれている等の呼出回数の多いものに着目して関数の呼出情報における呼出回数を入れ替え、それぞれの情報の重み付けを変更してから従来と同様の関数の配置処理を行なって仮配置をし、変更した中でもっともキャッシュコンフリクトの回数が少ないものを、関数の最終的なメモリ配置として決定するため、ある関数の中で複数の関数が連続して呼ばれている場合、あるいはループの中で呼ばれている場合などのようなアプリケーションプログラムの複雑さには依存しない処理であるからである。
【0110】
また、第2の効果は、(3)ループ中で呼ばれる関数がまた別の関数を呼んでいる場合などに対しても、キャッシュコンフリクトを削減するよう関数をメモリ空間上に配置することにより、アプリケーションプログラムの実行スピードを向上できることである。
【0111】
その理由は、関数の呼出情報における呼出回数を入れ替え、それぞれの情報の重み付けを変更してから従来の関数の配置処理を行なって仮配置をし、変更した中でもっともキャッシュコンフリクトの回数が少ないものを関数の最終的なメモリ配置を決定するため、ループ中で呼ばれる関数がまた別の関数を呼んでいる場合などのようなアプリケーションプログラムの複雑さには依存しない処理であるからである。
【図面の簡単な説明】
【図1】本発明の命令キャッシュへの関数割付最適化装置及びその処理手順の一実施の形態を示すブロック図である。
【図2】本実施の形態の関数呼出組合せ情報の一例を示す図である。
【図3】アプリケーションプログラムの一例を示す図である。
【図4】本実施の形態の関数基本ブロック遷移情報の一例を示す図である。
【図5】本実施の形態の命令キャッシュへの関数割付最適化装置の動作である関数割付最適化方法の一例を示すフローチャートである。
【図6】図5の呼出回数入替処理ステップの詳細処理を示すフローチャートである。
【図7】本実施の形態の呼出回数入替情報の一例を示す図である。
【図8】図5のキャッシュコンフリクト回数算出処理ステップの詳細処理を示すフローチャートである。
【図9】本実施の形態の関数メモリ配置結果を示す図である。
【図10】従来の命令キャッシュへの関数割付最適化装置及びその処理手順の一例を示すブロック図である。
【図11】従来の命令キャッシュへの関数割付最適化装置の動作である関数割付最適化方法の一例を示すフローチャートである。
【図12】従来の関数呼出グラフの構成を説明するための図である。
【図13】従来の関数配置とキャッシュラインの関係及び各関数の利用不可能集合の状態及び関数メモリ配置結果の一例を示す図である。
【符号の説明】
1 関数呼出情報出力部
2 関数基本ブロック遷移情報出力部
3,103 関数メモリ配置最適化部
4,104 関数メモリ配置結果
110 アプリケーションプログラム
111 関数呼出組合せ情報
112 関数基本ブロック遷移情報
113 呼出回数入替情報
120 関数呼出グラフ

Claims (7)

  1. 命令キャッシュを搭載したマイクロプロセッサシステム用の所定のアプリケーションプログラムを入力し前記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化装置において、
    前記アプリケーションプログラムを入力しプロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報に出力する関数呼出情報出力部と、
    前記アプリケーションプログラムを入力し前記プロファイルによる関数呼出に応じた関数の遷移に対して該関数のID及び該関数の基本ブロックの順番の組合せを関数遷移毎に並べた関数基本ブロック遷移情報に出力する関数基本ブロック遷移情報出力部と、
    前記関数呼出組合せ情報を参照し前記関数呼出組合せ相互間で呼出回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、次に生成した前記呼出回数入替情報を参照して関数をメモリ空間上のアドレスに仮配置した後、前記関数基本ブロック遷移情報を参照してキャッシュコンフリクトの回数を検出し、前記呼出回数入替データの中で、前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定し対応する関数メモリ配置結果を出力する関数メモリ配置最適化部とを備えることを特徴とする命令キャッシュへの関数割付最適化装置。
  2. 前記関数呼出組合せ情報及び前記呼出回数入替情報の各々が、関数の呼出元の関数名を記述した呼出元欄と、
    前記関数の呼出先の関数名を記述した呼出先欄と、
    前記関数の呼出回数を設定する呼出回数欄とをそれぞれ有することを特徴とする請求項1記載の命令キャッシュへの関数割付最適化装置。
  3. 命令キャッシュを搭載したマイクロプロセッサシステム用のアプリケーションプログラムを入力し前記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化方法において、
    前記アプリケーションプログラムを入力し前記プロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報を生成し、前記アプリケーションプログラムを入力し前記プロファイルにより得られた前記関数の基本ブロック単位の実行に関する関数基本ブロック遷移情報を生成した後、
    前記関数呼出組合せ情報を参照し前記関数呼出組合せ相互間で呼出回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、前記関数基本ブロック遷移情報を参照して各関数のキャッシュコンフリクトの回数を検出し、前記呼出回数入替データの中で前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定する関数メモリ配置最適化工程を有することを特徴とする命令キャッシュへの関数割付最適化方法。
  4. 前記関数メモリ配置最適化工程が、前記関数呼出組合せ情報を参照して前記呼出回数入替情報を生成する呼出回数入替ステップと、
    生成した前記呼出回数入替情報を参照して関数をメモリ空間上のアドレスに仮配置する関数メモリ仮配置ステップと、
    前記関数基本ブロック遷移情報を参照して仮配置した各関数のキャッシュコンフリクト回数を検出するキャッシュコンフリクト回数算出処理ステップと、
    前記関数呼出回数入替データの中で前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定する関数メモリ配置ステップとを有することを特徴とする請求項3記載の命令キャッシュへの関数割付最適化方法。
  5. 前記呼出回数入替ステップが、前記関数呼出組合せ情報を参照して呼出回数の入替対象とする前記関数呼出組合せの数である引数を読み込み第1の変数を設定する第1のステップと、
    前記第1の変数が0か否かを判定する第2のステップと、
    前記第2のステップで前記第1の変数が0の場合現在の内容の呼出回数入替情報を出力する第3のステップと、
    前記第2のステップで前記第1の変数が0以外の場合呼出回数入替処理を行い前記第1の変数−1に対応する引数を設定して再帰呼出を行う第4のステップと、
    第2の変数に0を設定する第5のステップと、
    前記第2の変数が前記第1の変数−1より小さいか否かの判定を行い否の場合は処理を終了する第6のステップと、
    前記第6のステップで諾の場合前記第2の変数と前記第1の変数−1である第1のインッデクスの各々の前記呼出回数を交換する第7のステップと、
    前記引数を1デクリメントして前記呼出回数入替処理を行い前記第1の変数−1に対応する引数を設定して再帰呼出を行う第8のステップと、
    前記第2の変数である第2のインデックスと前記第1の変数−1の各々の前記呼出回数を交換する第9のステップと、
    前記第2の変数を1インクリメントし前記第6のステップ以降を反復する第10のステップとを有することを特徴とする請求項4記載の命令キャッシュへの関数割付最適化方法。
  6. 前記キャッシュコンフリクト回数算出処理ステップが、キャッシュコンフリクト回数をカウントする変数を0に初期化する第1のステップと、
    前記関数基本ブロック遷移情報を順次読み込み、関数IDと基本ブロックの順番情報であるID順番情報を求める第2のステップと、
    前記関数基本ブロック遷移情報は終了したかを判定し諾の場合は処理を終了する第3のステップと、
    前記第3のステップで否の場合は前記ID順番情報のキャッシュ上の配置を求める第4のステップと、
    先頭の前記関数基本ブロック遷移情報かを判定し諾の場合は前記第2のステップに戻る第5のステップと、
    前記第5のステップで否の場合以前のブロックとアドレス上の重なりがあるかを判定し否の場合は前記第2のステップに戻る第6のステップと、
    前記第6のステップで諾の場合は前記キャッシュコンフリクト回数をカウントする変数を1インクリメントし前記第2のステップに戻る第7のステップとを有することを特徴とする請求項4記載の命令キャッシュへの関数割付最適化方法。
  7. 命令キャッシュを搭載したマイクロプロセッサシステム用のアプリケーションプログラムを入力し前記命令キャッシュに関しキャッシュコンフリクトの回数を確率的に低減するように関数の呼出回数情報に基づいて関数のメモリ配置を最適化する命令キャッシュへの関数割付最適化処理をコンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
    前記アプリケーションプログラムを入力し前記プロファイルによる関数呼出時に呼出元及び呼出先の各関数とその呼出回数とを関数呼出組合せとして関数呼出組合せ情報を生成するステップと、
    前記アプリケーションプログラムを入力し前記プロファイルにより得られた前記関数の基本ブロック単位の実行に関する関数基本ブロック遷移情報を生成するステップと、
    前記関数呼出組合せ情報を参照し前記関数呼出組合せ相互間で呼出回数を入替えた関数呼出回数入替データから成る呼出回数入替情報を生成し、前記関数基本ブロック遷移情報を参照して各関数のキャッシュコンフリクトの回数を検出し、前記呼出回数入替データの中で前記キャッシュコンフリクトの回数の最も少ないものに関数のメモリ配置を決定する関数メモリ配置最適化ステップとを実行させる命令キャッシュへの関数割付最適化ステップとをコンピュータに実行させるプログラムを記録したことを特徴とするコンピュータ読み取り可能な記録媒体。
JP2000089382A 2000-03-28 2000-03-28 命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体 Expired - Fee Related JP3698949B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2000089382A JP3698949B2 (ja) 2000-03-28 2000-03-28 命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2000089382A JP3698949B2 (ja) 2000-03-28 2000-03-28 命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体

Publications (2)

Publication Number Publication Date
JP2001282547A JP2001282547A (ja) 2001-10-12
JP3698949B2 true JP3698949B2 (ja) 2005-09-21

Family

ID=18605151

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000089382A Expired - Fee Related JP3698949B2 (ja) 2000-03-28 2000-03-28 命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体

Country Status (1)

Country Link
JP (1) JP3698949B2 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7085890B2 (en) 2004-02-19 2006-08-01 International Business Machines Corporation Memory mapping to reduce cache conflicts in multiprocessor systems
JP4554241B2 (ja) 2004-03-16 2010-09-29 富士通セミコンダクター株式会社 キャッシュカラーリング方法
JP2007148556A (ja) * 2005-11-24 2007-06-14 Nec Electronics Corp 関数割付方法および関数割付装置
JP5278901B2 (ja) * 2008-10-24 2013-09-04 インターナショナル・ビジネス・マシーンズ・コーポレーション 頻繁に発生するイベントを推定する方法
JP4600700B2 (ja) 2009-03-17 2010-12-15 日本電気株式会社 プログラムのメモリ空間への配置方法、装置、およびプログラム

Also Published As

Publication number Publication date
JP2001282547A (ja) 2001-10-12

Similar Documents

Publication Publication Date Title
KR100877138B1 (ko) 데이터 처리장치, 데이터 처리 프로그램, 및 데이터 처리프로그램을 기록한 기록매체
US7069548B2 (en) Inter-procedure global register allocation method
US5784066A (en) Method and apparatus for using partner information to color nodes in an interference graph within a computer system
JP3974742B2 (ja) コンパイル装置、最適化方法および記録媒体
AU773940B2 (en) Method and apparatus for allocating stack slots
JPH113269A (ja) スタックの内容をサブスタックに分離することによる正確なガーベイジ・コレクションを補助するシステムと方法
US6925639B2 (en) Method and system for register allocation
CN113569508B (zh) 基于id进行数据索引与访问的数据库模型构建方法及设备
JP3698949B2 (ja) 命令キャッシュへの関数割付最適化装置、関数割付最適化方法及び関数割付最適化手順を記録した記録媒体
CN112631724A (zh) 一种字节码指令集精简方法和系统
Zhuang et al. Storage assignment optimizations through variable coalescence for embedded processors
JP2002366366A (ja) コンパイル方法、コード生成方法、スタックレジスタ使用方法、コンパイラ、これらを実現するプログラム及び記憶媒体
CN111324354B (zh) 一种融合寄存器对需求的寄存器选择方法
US6571387B1 (en) Method and computer program product for global minimization of sign-extension and zero-extension operations
US7257807B2 (en) Method for optimizing execution time of parallel processor programs
Ottoni et al. Optimal live range merge for address register allocation in embedded programs
JP2001216140A (ja) 命令キャッシュ関数割付装置、割付最適化方法および割付最適化手順を記録した記録媒体
JP4600700B2 (ja) プログラムのメモリ空間への配置方法、装置、およびプログラム
JP2003271394A (ja) 関数と基本ブロックの配置割付装置および割付最適化プログラム
JP3896238B2 (ja) コンピュータシステム及びプログラムの実行時表現方法
JP3060907B2 (ja) 言語処理プログラムの処理方式
US6421825B2 (en) Register control apparatus and method thereof for allocating memory based on a count value
JP2932812B2 (ja) 言語処理プログラム実行装置
JPH06214803A (ja) 仮想空間ブロック配置方式
JP3692884B2 (ja) プログラム処理方法および記録媒体

Legal Events

Date Code Title Description
RD01 Notification of change of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7421

Effective date: 20040121

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20040824

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20041025

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20041221

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20050221

A911 Transfer of reconsideration by examiner before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20050303

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20050329

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20050524

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20050614

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20050706

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees