(57)【要約】【課題】プログラムによって割当てるメモリ容量を変更する機能を有するオンチップメモリおよびキャッシュメモリ等の内蔵メモリを備えた計算機に対して、プログラム中のデータを効率良く配置することができるコード生成方法およびコンパイラを提供する。【解決手段】プログラム中のループを単位とする各フェーズと各フェーズで参照する参照データとを抽出し、プログラムを分割するフェーズ分割処理Ｓ１０５と、フェーズ分割処理Ｓ１０５で分割された参照データに必要となるメモリ量を、キャッシュメモリとオンチップメモリとに配分する量を算出するデータマッピング処理Ｓ１０６と、データマッピング処理Ｓ１０６のメモリの算出量を基に、プログラムのフェーズの切換え点に、キャッシュメモリとオンチップメモリへの配分量を変更する命令コードを生成するコード生成処理Ｓ１０７とを有する。【選択図】図２
2008102733.tif 000002
【特許請求の範囲】
【請求項１】
内蔵メモリであるキャッシュメモリおよびオンチップメモリの容量を指定して割当て可能な機能を備えたマイクロプロセッサ上で動作するプログラムのコード生成方法において、
前記プログラム中のループを単位とする各フェーズと前記各フェーズで参照する参照データとを抽出し、前記プログラムを分割するフェーズ分割処理と、
前記フェーズ分割処理で分割された前記参照データに必要となるメモリ量について、前記キャッシュメモリと前記オンチップメモリとに配分する配分量を算出するメモリ算出処理と、を有する
ことを特徴とするコード生成方法。
【請求項２】
前記メモリ算出処理のメモリの算出量を基に、プログラムのフェーズの切換え点に、前記キャッシュメモリと前記オンチップメモリへの配分量を変更する命令コードを生成するコード生成処理を有する
ことを特徴とする請求項１に記載のコード生成方法。
【請求項３】
前記フェーズ分割処理を、プログラムの動きを解析する制御フロー解析の結果を利用してデータ参照頻度の低い点で行なう
ことを特徴とする請求項１に記載のコード生成方法。
【請求項４】
前記フェーズ分割処理は、前記各フェーズの分割をソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
ことを特徴とする請求項１に記載のコード生成方法。
【請求項５】
前記メモリ算出処理は、前記オンチップメモリにデータを配置した場合の効果と、前記キャッシュメモリを介して参照を行なった場合の効果を求め、プログラムの実行性能の評価尺度が最も向上する配分を選択する
ことを特徴とする請求項１に記載のコード生成方法。
【請求項６】
前記メモリ算出処理は、ソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
ことを特徴とする請求項１に記載のコード生成方法。
【請求項７】
前記メモリ算出処理において、前記参照データのデータサイズが可変であるような際、データサイズを増減させた場合について評価尺度が最適となるデータの大きさを求め、当該データの大きさを、前記キャッシュメモリ又は前記オンチップメモリに割当てる
ことを特徴とする請求項５に記載のコード生成方法。
【請求項８】
前記評価尺度は、前記プログラムの実行時間又は前記マイクロプロセッサの消費電力を含む
ことを特徴とする請求項５又は請求項７に記載のコード生成方法。
【請求項９】
前記コード生成処理において、前記キャッシュメモリ又は前記オンチップメモリへの配分が不要な場合、該当するメモリ領域を停止する命令コード又は低電力モードへ移行する命令コードを生成する
ことを特徴とする請求項２に記載のコード生成方法。
【請求項１０】
内蔵メモリであるキャッシュメモリおよびオンチップメモリの容量を指定して割当て可能な機能を備えたマイクロプロセッサ上で動作するプログラムのコンパイラにおいて、
コンピュータに、
前記プログラム中のループを単位とする各フェーズと前記各フェーズで参照する参照データとを抽出し、前記プログラムを分割するフェーズ分割処理と、
前記フェーズ分割処理で分割された前記参照データに必要となるメモリ量について、前記キャッシュメモリと前記オンチップメモリとに配分する配分量を算出するメモリ算出処理と、
前記メモリ算出処理のメモリの算出量を基に、プログラムのフェーズの切換え点に、前記キャッシュメモリと前記オンチップメモリへの配分量を変更する命令コードを生成するコード生成処理と、に基づいて前記プログラムの最適化を行う
ことを特徴とするコンパイラ。
【請求項１１】
前記フェーズ分割処理を、プログラムの動きを解析する制御フロー解析の結果を利用してデータ参照頻度の低い点で行なう
ことを特徴とする請求項１０に記載のコンパイラ。
【請求項１２】
前記フェーズ分割処理は、前記各フェーズの分割をソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
ことを特徴とする請求項１０に記載のコンパイラ。
【請求項１３】
前記メモリ算出処理は、前記オンチップメモリにデータを配置した場合の効果と、前記キャッシュメモリを介して参照を行なった場合の効果を求め、プログラムの実行性能の評価尺度が最も向上する配分を選択する
ことを特徴とする請求項１０に記載のコンパイラ。
【請求項１４】
前記メモリ算出処理は、ソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
ことを特徴とする請求項１０に記載のコンパイラ。
【請求項１５】
前記メモリ算出処理において、前記参照データのデータサイズが可変であるような際、データサイズを増減させた場合について評価尺度が最適となるデータの大きさを求め、当該データの大きさを、前記キャッシュメモリ又は前記オンチップメモリに割当てる
ことを特徴とする請求項１３に記載のコンパイラ。
【請求項１６】
前記コード生成処理において、前記キャッシュメモリ又は前記オンチップメモリへの配分が不要な場合、該当するメモリ領域を停止する命令コード又は低電力モードへ移行する命令コードを生成する
ことを特徴とする請求項１０に記載のコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムによって割当てるメモリ容量を変更する機能を有するオンチップメモリ、キャッシュメモリ等の内蔵メモリを備えた計算機に対して、プログラム中のデータを効率良く配置することができるコード生成方法およびコンパイラに関する。
【背景技術】
【０００２】
典型的な計算機システムは、計算処理を司るマイクロプロセッサと、データを記憶するための主記憶装置（メインメモリ）から構成される。一般に、マイクロプロセッサの演算性能に対して、主記憶装置のアクセス速度が相対的に低い（参照性能が低い）ため、主マイクロプロセッサと記憶装置との処理速度のアンバランスが生じている。このため、多くのマイクロプロセッサは、キャッシュメモリと呼ばれる高速かつ小容量な内蔵メモリを備えている。キャッシュメモリには、主記憶装置上のデータのコピーが配置され、キャッシュメモリ上にデータが存在する限り高速なデータ参照を行うことが可能となる。これは以下のような機構により実現される。
【０００３】
すなわち、マイクロプロセッサが主記憶装置上のデータを参照する場合、まず、キャッシュメモリ上にデータのコピーが存在するか否かをチェックする。データのコピーが存在する場合、キャッシュメモリ上のデータを参照することで高速なデータ参照を可能とする。キャッシュメモリ上にデータのコピーが存在しない場合、主記憶装置からデータが読み出されると共に、キャッシュメモリ上にコピーが配置される。
【０００４】
キャッシュメモリは、キャッシュライン、または、キャッシュブロックと呼ばれる固定サイズの領域毎に管理される。キャッシュ上にデータが存在するか否かを管理するために、キャッシュメモリには、データを記憶するための領域以外に、タグと呼ばれる機構を備えている。タグとは、キャッシュ上に存在するデータのコピー元アドレスを特定するための情報を格納するための機構であり、キャッシュ中のデータの存在確認、主記憶装置へのデータの書き戻しの際に利用される。
【０００５】
前記のように、キャッシュメモリは、ハードウェアによってデータの入れ替えを行うことから、プログラムで頻繁に参照するデータがキャッシュ上に存在しない場合には、プログラムの実行性能が低下する。このような問題は、例えば、参照回数が１度のみのデータによって、キャッシュ上のデータが追い出されることによって生じる。また、あるデータがキャッシュ上に存在するか否かをプログラマが識別できないため、プログラムの実行時間を推定することが困難となる。
【０００６】
このような問題に対処するため、メモリ空間上にオンチップメモリと呼ばれる高速な内蔵メモリ領域を備え、プログラムによって主記憶装置との間のデータ転送を行う手法が提案されている（例えば、非特許文献１参照）。キャッシュメモリの場合、データのコピーは、ハードウェアにより暗黙的に行なわれるのに対して、オンチップメモリの場合、明示的なコピーが必要となるが、ソフトウェアにより一度オンチップメモリへコピーしたデータについては、高速に参照できることを保証できる。さらに、オンチップメモリの場合は、主記憶装置アドレスとの関連付けを行うタグが不要となる。このため、参照の高速化や省電力化を期待できる。
【０００７】
オンチップメモリへのデータ配置技術としては、標準的なプログラミング言語仕様に対する拡張仕様を利用して、プログラムのソースコード中で定義される個々のデータに対して、オンチップメモリに配置するか否かを指定する手法が提案されている（例えば、非特許文献２参照）。
【０００８】
図３は、オンチップメモリへのデータ配置の指定例を示すソースプログラムである。図３（ａ）は、オンチップメモリへのデータ配置を適用する前のオリジナルプログラムを示し、図３（ｂ）は、オンチップメモリ上に中間バッファを設け、これと主記憶装置との間でブロック転送を行うようにするための修正プログラムを示す。なお、ここでは簡単のため、Ｎは１０の倍数であるものとする。
【０００９】
図３（ａ）のオリジナルプログラムでは、（１）において、データａ、ｂの要素に対する参照が生じる。これらのデータの参照は、一度だけであるため、ブロック転送によるデータ転送の効率化を除けば、データａ、ｂをキャッシュ上に配置するのは無駄である。また、後続するプログラムの実行で必要となるデータがキャッシュ上に存在する場合に、そのデータが追いだされるという負の影響も生じる。
【００１０】
そこで、オンチップメモリ上に中間バッファを設け、これと主記憶装置との間でブロック転送を行うようにする。このように改変したソースプログラムを図３（ｂ）に示す。なお、ここで、「＿Ｘ」は当該宣言対象のデータをオンチップメモリに配置する指示、「ｃｏｐｙ」は第二引数の指示するアドレスから、第一引数の指示する領域へ、第三引数で指定された個数だけ要素のブロック転送を行うことを意味するものとし、ブロック転送の際にはキャッシュへのデータの登録は行なわないものと仮定する。
【００１１】
図３（ｂ）の修正プログラムでは、（２）において、データ転送用の一時領域をオンチップメモリに確保し、（３）において、主記憶装置からオンチップメモリへのデータ転送、（４）でオンチップメモリ上での演算、（５）でオンチップメモリから主記憶装置への書き戻しを行う。この一連の処理において、キャッシュメモリへのデータの登録は生じないため、プログラムの実行を効率化することができる。
【００１２】
このようなソースプログラム改変を伴うオンチップメモリへのデータ配置手法は、非標準的な言語仕様を利用したソースプログラムの修正と、利用可能なオンチップメモリ容量を意識したプログラミングを必要とするため、プログラム作成の困難さが増大すると共に、オンチップメモリを利用するプログラムの他システムへのポータビリティが低下する。このため、オンチップメモリと主記憶装置から構成される計算機システムに対して、ソースプログラムの解析結果やプロファイル情報と呼ばれるプログラムを予め予備実行した際の動作情報から、プログラム中に出現するデータをオンチップメモリと主記憶装置のいずれに配置するかを決定する手法が開示されている(例えば、非特許文献３に参照）。
【００１３】
前記のようなキャッシュメモリとオンチップメモリは、相反する機構ではないため、マイクロプロセッサによっては、キャッシュメモリとオンチップメモリの双方を備えているものがある。こういったプロセッサでは、キャッシュメモリとオンチップメモリに格納可能なデータの最大容量は固定的なものが多い。ただし、キャッシュメモリおよびオンチップメモリで必要とされる容量は、プロセッサの用途やプログラムによって異なる。
【００１４】
そこで、キャッシュメモリとオンチップメモリがデータを格納するために利用する内蔵メモリ領域を共通とし、個々の領域に割当てる大きさをプログラム、あるいは、システム毎に選択可能とする手法が提案されている（例えば、非特許文献１参照）。
【非特許文献１】Renesas Technology, SH7780ハードウェアマニュアル, Renesas Technology, 2006.
【非特許文献２】ISO/IEC JTC1 SC22 WG14, Extensions for the programming language C to support embedded processors, ISO/IEC, 2004.
【非特許文献３】O. Avissar他, An Optimal Memory Allocation Scheme for Scratch-Pad-Based Embedded Systems, ACM Transactions on Embedded Computing Systems, Vol.1, No.S12002.
【非特許文献４】A.V.Aho他, Compilers - Principles, Techniques, and Tools, Addison-Wesley, 1986.
【発明の開示】
【発明が解決しようとする課題】
【００１５】
前記のように、キャッシュメモリとオンチップメモリは、有効な適用用途が異なる。また、オンチップメモリへ配置することが有効なデータと、キャッシュメモリへ配置することが有効なデータは、プログラムのフェーズ毎にも異なることが多い。
【００１６】
従って、キャッシュメモリとオンチップメモリを共に備え、個々の割当て容量を選択可能なプロセッサにおいて、プログラムを効率的に動作させるためには、プログラムのフェーズ毎にキャッシュメモリとオンチップメモリへの割当てを最適な値に調整する必要があるが、従来のプログラムの改変を伴う手法はプログラムのポータビリティを損なうという問題がある。
【００１７】
また、オンチップメモリへのデータの配置をコンパイラによって自動的に行う従来手法では、固定サイズのオンチップメモリを仮定し、コード生成を行なっていた。このため、プログラムのフェーズ毎に最適なキャッシュメモリとオンチップメモリの内蔵メモリ領域への割当てを行うことができなかった。また、プログラムの構成フェーズにおいて、未使用の内蔵メモリ領域がある場合には、電力を無駄に消費するという問題があった。
【００１８】
本発明は、前記の課題を解決するための発明であって、プログラムによって割当てるメモリ容量を変更する機能を有するオンチップメモリ、キャッシュメモリ等の内蔵メモリを備えた計算機に対して、プログラム中のデータを効率良く配置することができるコード生成方法およびコンパイラを提供することを目的とする。
【課題を解決するための手段】
【００１９】
前記の課題を解決するため、プログラムの動きの制御フロー解析等を用いて、ループを単位とするフェーズに分割し、フェーズ毎にキャッシュメモリとオンチップメモリとに割当てる容量を決定し、当該メモリへの割当てをプログラム実行時に動的に変更する命令シーケンスを挿入するコードを生成することを特徴とする。
【発明の効果】
【００２０】
本発明によれば、キャッシュメモリとオンチップメモリを共に備え、個々の割当て容量を選択可能なプロセッサに対して、プログラムを効率的に動作させるコードを生成することができる。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の実施形態について図面を参照して説明する。
《実施形態１》
図１は、本発明の対象とする計算機システムの例を示す構成図である。計算機システムは、プロセッサ（ＣＰＵ）２０１、主記憶装置２０２、外部記憶装置２０３から構成され、ＣＰＵ２０１は、演算器２０４、レジスタ２０５、キャッシュメモリ２０６、オンチップメモリ２０７から構成される。言語処理系およびソースプログラムは、外部記憶装置２０３に格納され、ＣＰＵ２０１に読み出されてコンパイル処理を行う。コンパイル結果のプログラムは主記憶装置２０２に保持されるか、外部記憶装置２０３に保存されてからＣＰＵ２０１に読み出されて実行される。
【００２２】
ＣＰＵ２０１がメモリ参照を行う場合は、参照対象のアドレスを調べ、当該アドレスがオンチップメモリ領域であれば、オンチップメモリ２０７上のデータを参照する。当該アドレスがオンチップメモリ領域でなければ、まずキャッシュメモリ２０６上に参照対象アドレスのデータのコピーが存在するか否かを調べ、コピーが存在する場合はそのデータを参照する。コピーが存在しない場合は、主記憶装置２０２上の当該データを参照すると共に、当該データの属するキャッシュブロックのコピーをキャッシュメモリ２０６に置く。オンチップメモリ２０７、および、キャッシュメモリ２０６の参照は、主記憶装置２０２の参照に比べて高速であり、参照対象のデータがオンチップメモリ２０７、あるいは、キャッシュメモリ２０６上にあればメモリ参照によって発生する待ち時間を減少することができる。本発明の対象とする計算機システムでは、キャッシュメモリ２０６とオンチップメモリ２０７の割当て量は、ソフトウェアによって変更することができる。
【００２３】
図２は、本発明の言語処理系における最適化処理例を示す説明図である。最適化処理Ｓ１０１は、ソースプログラム１０２を入力し、最適化を適用した後、変換済みプログラム１０３を生成する。変換済みプログラムは、通常のコンパイラのように、一度ファイル形式で図１の外部記憶装置２０３に生成してもよいし、Ｊｕｓｔ−Ｉｎ−Ｔｉｍｅ（ＪＩＴ）コンパイラのように、プログラム実行中に主記憶装置２０２に生成し、その場で実行してもよい。最適化処理Ｓ１０１は、最適化の適用過程で、中間語１０４を適宜生成・参照する。最適化処理Ｓ１０１は、フェーズ分割処理Ｓ１０５、データマッピング処理Ｓ１０６、コード生成処理Ｓ１０７から構成される。
【００２４】
図４は、実施形態１のフェーズ分割処理を示すフローチャートである。図４に示すフェーズ分割処理では、プログラムの制御フローを解析し、プログラム中のループを単位としてフェーズを構成する。一般に、内蔵メモリ領域の割当て変更にはオーバヘッドを伴うため、プログラム中のデータ参照頻度が低い点で変更を行なったほうがよい。プログラム中のループを単位としてフェーズを構成することで、データ参照頻度の低い点でプログラムが分割され、低いオーバヘッドで割当て変更を行うことが期待できる。なお、プログラムの制御フロー解析と、ループの識別手法に関しては、非特許文献４等に示されている標準的なプログラム解析手法を用いることができる。
【００２５】
図４に示すように、フェーズ分割処理Ｓ１０５は、処理Ｓ４０１で処理を開始し、処理Ｓ４０２でプログラム中のループ集合を変数Ｌに、フェーズ情報を格納する変数Ｐを空集合に初期化する。次に、処理Ｓ４０３において、変数Ｌが空集合か否かを判定する。変数Ｌが空集合である場合は（処理Ｓ４０３，ＹＥＳ）、処理対象となるループが存在しないため、処理Ｓ４０５に制御を移して処理を完了する。処理Ｓ４０３において、変数Ｌが空集合でない場合（処理Ｓ４０３，ＮＯ）、処理Ｓ４０４に制御を移し、変数Ｌから要素を１つ取り出して変数ｌに格納する。続いて、変数ｌを構成する基本ブロック集合をｂｌに求め、変数ｌを構成する基本ブロック集合ｂｌとｂｌ中で参照するデータの集合の組を、変数Ｐに追加する。以上の処理により、プログラム中のループをフェーズとして、フェーズを構成する基本ブロックと、そこで参照されるデータの集合が求められる。このフェーズ分割の際には、プロファイル情報等を用いることにより、頻繁に実行されるプログラム部分を摘出するといった最適化を適用してもよい。
【００２６】
図５は、フェーズ分割処理の対象とするソースプログラムの例を示す説明図である。図５（ａ）は、自動分割するときのソースプログラムの例であり、図５（ｂ）は、ディレクティブを挿入したソースプログラムの例である。ディレクティブとは、プログラム中に埋め込むコンパイラへの命令であり、ここでは、／／＊ｏｐｔｉｏｎが、コンパイラに対する命令を意味する。ディレクティブは、ユーザからの指示命令である。
【００２７】
図５（ａ）に示すソースプログラムに、図４に示すアルゴリズムを適用した場合、処理Ｓ４０２において変数Ｌ（ループ集合）にループ５０２，５０４が格納される。これらのループに対して、処理Ｓ４０４を適用した結果、最終的に変数Ｐに、ループ５０２，５０４を構成するループの基本ブロックとその参照データの組が格納される。図５（ｂ）のソースプログラムは、図５（ａ）のプログラムにディレクティブを挿入し、図１２において後述するフェーズ指定をしている。
【００２８】
図６は、実施形態１のデータマッピング処理を示すフローチャートである。図６に示すように、データマッピング処理Ｓ１０６は、処理Ｓ６０１で処理を開始し、続いて処理Ｓ６０２でフェーズ情報の集合を変数Ｐに格納し、データマッピング結果の集合である変数Ｍを空集合に初期化する。次に、処理Ｓ６０３において、フェーズ情報集合である変数Ｐが空集合であるか否かを判定する。空集合であれば（処理Ｓ６０３，ＹＥＳ）、処理対象とすべき要素が存在しないため、処理Ｓ６０５に制御を移して処理を完了する。処理Ｓ６０３において、変数Ｐが空集合でなかった場合（処理Ｓ６０３，ＮＯ）、処理Ｓ６０４に制御を移し、フェーズ情報集合から、基本ブロック集合と参照データ集合の組み合せよりなる要素を１つ取り出して、それぞれを変数ＢＳ、変数ＤＳに格納する。
【００２９】
続いて、参照データ集合の変数ＤＳ中のデータのマッピングの組み合せ集合を変数Ｃに求める。ここで、データマッピングの組み合せ集合は、各データを配置可能な内蔵メモリ領域の組み合せを数え上げることにより求められる。次に、求めた組み合せ集合である変数Ｃについて、変数Ｃ中の各データマッピングに関する評価値を求める。この評価値は、各データ配置を採った場合に、プログラム実行時間、メモリ使用量、消費電力等、最適化対象とする項目に関して、性能の期待値がどのように与えられるかを、プログラムを構成する各基本ブロックの予測実行回数、プロセッサの動作推定結果等により求める。この結果得られた評価値集合Ｅについて、評価値が最大となるような最大評価値Ｅｍａｘを選択し、フェーズを構成する基本ブロック集合とＥｍａｘに対応する組み合せＣｍａｘを、データマッピング結果の集合である変数Ｍに追加する。その後、処理Ｓ６０３に制御を移し、次のフェーズ情報の処理を行う。
【００３０】
図７は、データマッピング処理中の組み合せ集合の評価値を示す説明図である。ここでは、図５（ａ）の２重のループ５０２を、図６のデータマッピング処理中の処理Ｓ６０４に適用した例を示す。図５（ａ）のループ５０２には、データＡとデータＢの２つのデータ参照が存在する。これらのデータを、それぞれ、キャッシュメモリとオンチップメモリのいずれかに配置した場合を考えると、図７の組み合せＣ０〜Ｃ３に示すデータ配置が得られる。例として、データＡ、データＢをキャッシュメモリに配置した場合の性能向上の期待値をそれぞれ１０および５０、オンチップメモリに配置した場合の期待値をそれぞれ５０および１０とする。各データ配置の評価値が、それぞれの期待値の和によって求めるものとすると、図７の評価値欄のような結果が得られる。この結果から、組み合せＣ２のデータ配置、すなわち、データＡをオンチップメモリに配置し、データＢをキャッシュメモリに配置する構成が、最も良い結果となることが期待される。
【００３１】
図８は、実施形態１のコード生成処理を示すフローチャートである。図８に示すように、コード生成処理Ｓ１０７は、処理Ｓ８０１で処理を開始し、処理Ｓ８０２において、データマッピング処理Ｓ１０６で得られたデータマッピング情報集合を変数Ｍに格納する。次に、処理Ｓ８０３において、データマッピング情報集合である変数Ｍが空集合か否かを判定する。空集合であれば（処理Ｓ８０３，ＹＥＳ）、処理すべきデータマッピング情報が存在しないため、処理Ｓ８０８に制御を移して処理を完了する。処理Ｓ８０３で変数Ｍが空集合でなかった場合（処理Ｓ８０３，ＮＯ）、処理Ｓ８０４に制御を移し、変数Ｍからデータマッピング情報、すなわち、対象基本ブロック集合と参照情報のデータマッピング情報の組を、１つ取り出す。次に、基本ブロック集合である変数ＢＳから別のフェーズを経由しないで到達可能な次フェーズの集合を変数ＮＰに求める。
【００３２】
続いて、処理Ｓ８０５に制御を移して、変数ＮＰが空集合か否かを判定する。空集合であれば（処理Ｓ８０５，ＹＥＳ）、当該フェーズが次に遷移するフェーズが存在しないため、処理Ｓ８０３に制御を移して、次のデータマッピング情報を処理する。処理Ｓ８０５において変数ＮＰが空集合でない場合は（処理Ｓ８０５，ＮＯ）、処理Ｓ８０６に制御を移す。処理Ｓ８０６では、変数ＮＰから次フェーズを１つ取り出して変数ｎｐに格納し、ｎｐのデータマッピング情報、すなわち、基本ブロック集合と参照情報のデータマッピングの組を、変数ＮＢＳと変数ＮＣの組に求める。次に、割当て変更コード生成処理Ｓ８０７に制御を移し、キャッシュメモリとオンチップメモリの割当て情報を変更するための割当て変更コードを生成する。割当て変更コード生成処理Ｓ８０７の詳細については図９において後述する。割当て変更コード生成処理Ｓ８０７のコード生成処理が完了すると、処理Ｓ８０５に制御を移し、次の後続フェーズへの遷移の処理を行う。
【００３３】
図９は、割当て変更コード生成処理を示すフローチャートである。割当て変更コード生成処理Ｓ８０７は、処理Ｓ９０１で処理を開始し、処理Ｓ９０２において、現在の処理対象フェーズのデータ割当て情報、すなわち、基本ブロックとデータの割当て情報の組を、変数ＢＳと変数Ｃに求め、同様に次フェーズのデータ割当て情報を変数ＮＢＳと変数ＮＣに求める。また、変数Ｃの必要とするオンチップメモリ量をｌｍｓ、キャッシュメモリ量をｃｍｓ、変数ＮＣの必要とするオンチップメモリ量をｎｌｍｓ、キャッシュメモリ量をｎｃｍｓに求める。次に、処理Ｓ９０３に制御を移し、ｌｍｓとｎｌｍｓ、および、ｃｍｓとｎｃｍｓの値が同じであるか否かを判定する。判定結果が同じである場合（処理Ｓ９０３，ＹＥＳ）、割当て設定の変更は不要であるので、処理Ｓ９０７に制御を移して処理を完了する。判定結果が同じでない場合は（処理Ｓ９０３，ＮＯ）、処理Ｓ９０４に制御を移し、オンチップメモリ量をｎｌｍｓ、キャッシュメモリ量をｎｃｍｓに変更する処理を、変数ＢＳと変数ＮＢＳの間に追加する。
【００３４】
続いて、処理Ｓ９０５でｎｌｍｓとｎｃｍｓの和が総メモリ量よりも少ないか否かを判定する。総メモリ量よりも少ない場合は（処理Ｓ９０５，ＹＥＳ）、次フェーズの動作に必要のない内蔵メモリ領域が存在するということを意味するので、処理Ｓ９０６に制御を移して未使用部分の動作を停止するコードを生成し、続いて処理Ｓ９０７に制御を移して処理を完了する。総メモリ量よりも少なくない場合は（処理Ｓ９０５，ＮＯ）、すなわち、未使用部分が存在しない場合、処理Ｓ９０７に制御を移して処理を完了する。なお、オンチップメモリ上にマッピングされるデータのうち同時に使用されるものの総量は、内蔵メモリの総容量を越えることはできないが、キャッシュメモリにマッピングされるデータの総量はデータの入れ替えをハードウェアが必要に応じて動的に行うため、このような制約を伴わない。
【００３５】
図１０は、フェーズ毎のデータ割当ての例を示す説明図である。図５（ａ）のプログラムに対して、図６のデータマッピング処理Ｓ１０６を適用した結果、最適なマッピングとして、図１０のデータマッピングが得られたものとする。また、対象プロセッサでキャッシュメモリとオンチップメモリに割当て可能な総メモリ量は３２ｋ（キロバイト）とする。ここで、フェーズＰ０，Ｐ１は、それぞれ、図５（ａ）のループ５０２，５０４に対応する。この結果を図８のコード生成処理Ｓ１０７に適用すると、処理Ｓ８０２によって変数Ｍにループ５０２，５０４のデータ割当て情報が得られる。処理Ｓ８０４によりループ５０２のデータ割当て情報が変数Ｍより取り出され、変数ＮＰに次フェーズ集合としてループ５０４の情報が得られる。
【００３６】
続いて、割当て変更コード生成処理Ｓ８０７で、ループ５０２を先行フェーズ、ループ５０４を後続フェーズとして、図９の割当て変更コード生成処理Ｓ８０７を呼び出し、割当て変更コードを生成する。図９の処理では、ｌｍｓ、ｃｍｓ、ｎｌｍｓ、ｎｃｍｓに、それぞれ、１６ｋ、１６ｋ、１０ｋ、６ｋが得られる。処理Ｓ９０３では、ｌｍｓとｎｌｍｓの値が異なるため、処理Ｓ９０４でループ５０２とループ５０４の間に割当てメモリ量を変更する処理を挿入する。また、処理Ｓ９０５では、ｎｌｍｓとｎｃｍｓの合計は１６ｋであり、総メモリ量３２ｋよりも小さいため、処理Ｓ９０６で未使用部分を停止するコードを生成する。この結果を図１１に示す。
【００３７】
図１１は、生成コードの例を示す説明図である。図１１に示すように、ループ５０２とループ５０４の間にキャッシュメモリとオンチップメモリの割当てを変更するコード「ｍｃｏｎｆ  １０，  ６」と未使用の内蔵メモリ領域を停止するコード「ｍｓｕｓｐ  １６」が挿入される（１１０５）。
【００３８】
本実施形態によれば、フェーズの区切り毎に最適なキャッシュメモリとオンチップメモリの割当て、および、未使用領域の停止等が行なわれるようになり、プログラムの実行効率化、消費電力の削減等の効果が得られる。
【００３９】
《実施形態２》
図１２は、実施形態２のディレクティブ記述の場合のフェーズ分割処理を示すフローチャートである。実施形態２は、図１のフェーズ分割処理１０５において、プログラム構造の解析ではなく、プログラム中に記述したディレクティブを解析することによりフェーズ分割を行う場合の処理フローを示す。なお、ここでは、簡単のため、プログラム中のディレクティブ指示は、それ単独で基本ブロックを構成するものとする。ソースプログラムの例として、図５（ｂ）では、指示文５０１および５０３がフェーズ指定を意味している。図１２の処理を図５（ｂ）に適用した場合、ループ５０２およびループ５０４を構成する基本ブロック集合が、それぞれ異なるフェーズとして識別される。
【００４０】
図１２に示すように、フェーズ分割処理Ｓ１０５Ａ（Ｓ１０５Ａの符号は、図４のＳ１０５と区別するため、異なる符合がつけられている。）は、Ｓ１２０１で処理を開始し、続く処理Ｓ１２０２でプログラム中の基本ブロック集合を変数ＢＢに求め、現在処理中のフェーズを構成する基本ブロック集合を格納するための変数ＢＳ、求めたフェーズ情報の集合を格納する変数Ｐを空集合に初期化する。次に、処理Ｓ１２０３において、基本ブロック集合である変数ＢＢが空集合か否かを判定する。変数ＢＢが空集合の場合（処理Ｓ１２０３，ＹＥＳ）、処理すべきフェーズが存在しないため、処理Ｓ１２０８に制御を移し、現在処理中のフェーズを構成する基本ブロックの集合である変数ＢＳと変数ＢＳ中で参照されるデータ集合の組をフェーズ情報集合である変数Ｐに追加し、処理Ｓ１２０９で処理を完了する。
【００４１】
処理Ｓ１２０３で変数ＢＢが空集合でない場合（処理Ｓ１２０３，ＮＯ）、処理Ｓ１２０４において基本ブロック集合である変数ＢＢからソースコードの出現順に要素を１つ取り出し変数ｂに格納する。
【００４２】
次に、処理Ｓ１２０５において、変数ｂがフェーズ指定か否かを判定する。変数ｂがフェーズ指定であれば（処理Ｓ１２０５，ＹＥＳ）、処理Ｓ１２０７に制御を移して、現在処理中のフェーズを構成する基本ブロックの集合である変数ＢＳとＢＳで参照されるデータ集合の組をフェーズ情報集合である変数Ｐに追加すると共に、現在処理中のフェーズを構成する基本ブロック集合を格納するための変数ＢＳを空集合に再初期化し、処理Ｓ１２０３に制御を移して次の基本ブロックの処理を継続する。処理Ｓ１２０５において、変数ｂがフェーズ指定でなければ（処理Ｓ１２０５，ＮＯ）、現在処理中のフェーズを構成する基本ブロック集合である変数ＢＳに変数ｂを追加し、処理Ｓ１２０３に制御を戻して、次の基本ブロックを処理する。
【００４３】
本実施形態によれば、プログラム中に記述したディレクティブを解析することによりフェーズ分割を行うことができる。
【００４４】
《実施形態３》
本発明の実施形態３として、図２のデータマッピング処理Ｓ１０６において、各フェーズにおける内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をソースコード上に記述したディレクティブにより行う場合を示す。
【００４５】
図１３は、実施形態３の各フェーズにおける内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をディレクティブとしてソースプログラム中に挿入した例を示す説明図である。図１３に示すように、図５（ａ）のプログラムに対して、ディレクティブを付加し、フェーズ指定に対し、フェーズ中で使用されるデータの割当て先と、その大きさを指定している。例えば、１３０１では、データＡに、１６ｋ（キロバイト）、キャッシュメモリを割当て、データＢに、１６ｋ（キロバイト）、オンチップに割当てることを意味している。また、１３０２では、データＸに、１０ｋ（キロバイト）、キャッシュメモリを割当て、データＹに、６ｋ（キロバイト）、オンチップに割当てることを意味している。このフェーズ指定は、例えば、図１２のフェーズ分割処理Ｓ１０５Ａにおいて読み込んでおき、図６のデータマッピング処理Ｓ１０６において使用すればよい。
【００４６】
本実施形態によれば、内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をソースコード上に記述したディレクティブによって行うことにより、木目細かな割当て制御が可能となる。
【００４７】
《実施形態４》
次に、オンチップメモリへのデータ配置効果の算出において、データサイズが可変であるようなデータに関して、データサイズを増減させた効果を求める場合の、データ配置の組み合せを求めるための処理フローを図１４に示す。この組み合せは、図６のデータマッピング処理における処理Ｓ６０４で組み合せ集合を求める際に使用する。
【００４８】
図１４は、実施形態４のデータサイズ可変の場合の組み合せ集合計算処理を示すフローチャートである。まず、処理Ｓ１４０１で処理を開始し、次に、処理Ｓ１４０２で変数ＤＳに対象フェーズの参照するデータの集合を求め、データマッピング集合を表す変数Ｍを空集合に初期化する。続いて、処理Ｓ１４０３で、データ集合の変数ＤＳが空集合か否かを判定する。
【００４９】
データ集合の変数ＤＳが空集合であった場合は（処理Ｓ１４０３，ＹＥＳ）、処理Ｓ１４０５に制御を移して処理を終了する。このとき、変数Ｍ中の要素の組み合せが求めるデータマッピングの組み合せとなる。処理Ｓ１４０３で、データ集合の変数ＤＳが空集合でなかった場合（処理Ｓ１４０３，ＮＯ）、処理Ｓ１４０４に制御を移し、変数ＤＳから参照データを１つ取り出して変数ｄに格納し、変数Ｒにデータ配置先集合として、「キャッシュメモリ」と「オンチップメモリ」を設定し、変数Ｓに変数ｄの取りうるサイズの集合を格納する。ここで求めたＲとＳの組み合せの集合の変数Ｃが変数ｄの取りうるデータマッピングの組み合せとなるので、これをデータマッピング集合である変数Ｍに追加する。続いて処理Ｓ１４０３に制御を戻して、次のデータの処理を継続する。
【００５０】
図１５は、データサイズ可変の場合の組み合せ集合の評価値を示す説明図である。図１５に示すように、データＡを可変データとした場合に、データＡの大きさを１ｋ（キロバイト）、および、１０ｋとした場合に取り得る各データ配置と、その評価値を示している。ここでは、データＡのサイズを１ｋとし、キャッシュメモリおよびオンチップメモリに配置した場合の性能向上の期待値をそれぞれ０および７０、データＡのサイズを１０ｋとした場合の期待値をそれぞれ１０および５０、データＢの期待値を５０および１０と仮定する。データは位置の評価値は各データ配置で参照するデータの期待値の和とする。この結果から、データＡのサイズを１ｋとしてオンチップメモリに配置し、データＢをキャッシュメモリに配置した場合（Ｃ２）が最も高い効果が得られることが分る。これを図６のデータマッピング処理Ｓ１０６の処理Ｓ６０４で選択することにより、最適な効果が得られる。
【００５１】
本実施形態によれば、参照データのデータサイズが可変であるような際、データサイズを増減させた場合について評価値（評価尺度）が最適となるデータの大きさを求め、当該データの大きさを、前記キャッシュメモリ又は前記オンチップメモリに割当てることにより、プログラム中のデータを効率良く配置することができる。
【００５２】
本発明の実施形態のコード生成方法は、プログラム中のループを単位とする各フェーズと各フェーズで参照する参照データとを抽出し、プログラムを分割するフェーズ分割処理Ｓ１０５と、フェーズ分割処理で分割された参照データに必要となるメモリ量について、キャッシュメモリとオンチップメモリとに配分する配分量を算出するメモリ算出処理（例えば、データマッピング処理Ｓ１０６）と、メモリ算出処理のメモリの算出量を基に、プログラムのフェーズの切換え点に、キャッシュメモリとオンチップメモリへの配分量を変更する命令コードを生成するコード生成処理Ｓ１０７とを有する。このようなコード生成方法によれば、キャッシュメモリとオンチップメモリとの個々の割当て容量を選択可能なプロセッサに対して、プログラムを効率的に動作させるコードを生成することができ、プログラムの実行性能を向上することができる。
【図面の簡単な説明】
【００５３】
【図１】本発明の対象とする計算機システムの例を示す構成図である。
【図２】本発明の言語処理系における最適化処理例を示す説明図である。
【図３】オンチップメモリへのデータ配置の指定例を示すソースコードである。
【図４】実施形態１のフェーズ分割処理を示すフローチャートである。
【図５】フェーズ分割処理の対象とするソースプログラムの例を示す説明図である。
【図６】実施形態１のデータマッピング処理を示すフローチャートである。
【図７】データマッピング処理中の組み合せ集合の評価値を示す説明図である。
【図８】実施形態１のコード生成処理を示すフローチャートである。
【図９】割当て変更コード生成処理を示すフローチャートである。
【図１０】フェーズ毎のデータ割当ての例を示す説明図である。
【図１１】生成コードの例を示す説明図である。
【図１２】実施形態２のディレクティブ記述の場合のフェーズ分割処理を示すフローチャートである。
【図１３】実施形態３の各フェーズにおける内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をディレクティブとしてソースプログラム中に挿入した例を示す説明図である。
【図１４】実施形態４のデータサイズ可変の場合の組み合せ集合計算処理を示すフローチャートである。
【図１５】データサイズ可変の場合の組み合せ集合の評価値を示す説明図である。
【符号の説明】
【００５４】
１０２    ソースプログラム
１０３    変換済みプログラム
１０４    中間語
Ｓ１０１    最適化処理
Ｓ１０５    フェーズ分割処理
Ｓ１０６    データマッピング処理
Ｓ１０７    コード生成処理
Ｓ８０７    割当て変更コード生成処理
【図１】
2008102733.tif 000003
【図２】
2008102733.tif 000004
【図３】
2008102733.tif 000005
【図４】
2008102733.tif 000006
【図５】
2008102733.tif 000007
【図６】
2008102733.tif 000008
【図７】
2008102733.tif 000009
【図８】
2008102733.tif 000010
【図９】
2008102733.tif 000011
【図１０】
2008102733.tif 000012
【図１１】
2008102733.tif 000013
【図１２】
2008102733.tif 000014
【図１３】
2008102733.tif 000015
【図１４】
2008102733.tif 000016
【図１５】
2008102733.tif 000017