JP2008102733A - コード生成方法およびコンパイラ - Google Patents

コード生成方法およびコンパイラ Download PDF

Info

Publication number
JP2008102733A
JP2008102733A JP2006284638A JP2006284638A JP2008102733A JP 2008102733 A JP2008102733 A JP 2008102733A JP 2006284638 A JP2006284638 A JP 2006284638A JP 2006284638 A JP2006284638 A JP 2006284638A JP 2008102733 A JP2008102733 A JP 2008102733A
Authority
JP
Japan
Prior art keywords
memory
data
program
phase
code generation
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.)
Withdrawn
Application number
JP2006284638A
Other languages
English (en)
Inventor
Hiroyasu Nishiyama
博泰 西山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2006284638A priority Critical patent/JP2008102733A/ja
Priority to US11/976,084 priority patent/US20080114941A1/en
Publication of JP2008102733A publication Critical patent/JP2008102733A/ja
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/25Using a specific main memory architecture
    • G06F2212/251Local memory within processor subsystem
    • G06F2212/2515Local memory within processor subsystem being configurable for different purposes, e.g. as cache or non-cache memory
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

【課題】プログラムによって割当てるメモリ容量を変更する機能を有するオンチップメモリおよびキャッシュメモリ等の内蔵メモリを備えた計算機に対して、プログラム中のデータを効率良く配置することができるコード生成方法およびコンパイラを提供する。
【解決手段】プログラム中のループを単位とする各フェーズと各フェーズで参照する参照データとを抽出し、プログラムを分割するフェーズ分割処理S105と、フェーズ分割処理S105で分割された参照データに必要となるメモリ量を、キャッシュメモリとオンチップメモリとに配分する量を算出するデータマッピング処理S106と、データマッピング処理S106のメモリの算出量を基に、プログラムのフェーズの切換え点に、キャッシュメモリとオンチップメモリへの配分量を変更する命令コードを生成するコード生成処理S107とを有する。
【選択図】図2

Description

本発明は、プログラムによって割当てるメモリ容量を変更する機能を有するオンチップメモリ、キャッシュメモリ等の内蔵メモリを備えた計算機に対して、プログラム中のデータを効率良く配置することができるコード生成方法およびコンパイラに関する。
典型的な計算機システムは、計算処理を司るマイクロプロセッサと、データを記憶するための主記憶装置(メインメモリ)から構成される。一般に、マイクロプロセッサの演算性能に対して、主記憶装置のアクセス速度が相対的に低い(参照性能が低い)ため、主マイクロプロセッサと記憶装置との処理速度のアンバランスが生じている。このため、多くのマイクロプロセッサは、キャッシュメモリと呼ばれる高速かつ小容量な内蔵メモリを備えている。キャッシュメモリには、主記憶装置上のデータのコピーが配置され、キャッシュメモリ上にデータが存在する限り高速なデータ参照を行うことが可能となる。これは以下のような機構により実現される。
すなわち、マイクロプロセッサが主記憶装置上のデータを参照する場合、まず、キャッシュメモリ上にデータのコピーが存在するか否かをチェックする。データのコピーが存在する場合、キャッシュメモリ上のデータを参照することで高速なデータ参照を可能とする。キャッシュメモリ上にデータのコピーが存在しない場合、主記憶装置からデータが読み出されると共に、キャッシュメモリ上にコピーが配置される。
キャッシュメモリは、キャッシュライン、または、キャッシュブロックと呼ばれる固定サイズの領域毎に管理される。キャッシュ上にデータが存在するか否かを管理するために、キャッシュメモリには、データを記憶するための領域以外に、タグと呼ばれる機構を備えている。タグとは、キャッシュ上に存在するデータのコピー元アドレスを特定するための情報を格納するための機構であり、キャッシュ中のデータの存在確認、主記憶装置へのデータの書き戻しの際に利用される。
前記のように、キャッシュメモリは、ハードウェアによってデータの入れ替えを行うことから、プログラムで頻繁に参照するデータがキャッシュ上に存在しない場合には、プログラムの実行性能が低下する。このような問題は、例えば、参照回数が1度のみのデータによって、キャッシュ上のデータが追い出されることによって生じる。また、あるデータがキャッシュ上に存在するか否かをプログラマが識別できないため、プログラムの実行時間を推定することが困難となる。
このような問題に対処するため、メモリ空間上にオンチップメモリと呼ばれる高速な内蔵メモリ領域を備え、プログラムによって主記憶装置との間のデータ転送を行う手法が提案されている(例えば、非特許文献1参照)。キャッシュメモリの場合、データのコピーは、ハードウェアにより暗黙的に行なわれるのに対して、オンチップメモリの場合、明示的なコピーが必要となるが、ソフトウェアにより一度オンチップメモリへコピーしたデータについては、高速に参照できることを保証できる。さらに、オンチップメモリの場合は、主記憶装置アドレスとの関連付けを行うタグが不要となる。このため、参照の高速化や省電力化を期待できる。
オンチップメモリへのデータ配置技術としては、標準的なプログラミング言語仕様に対する拡張仕様を利用して、プログラムのソースコード中で定義される個々のデータに対して、オンチップメモリに配置するか否かを指定する手法が提案されている(例えば、非特許文献2参照)。
図3は、オンチップメモリへのデータ配置の指定例を示すソースプログラムである。図3(a)は、オンチップメモリへのデータ配置を適用する前のオリジナルプログラムを示し、図3(b)は、オンチップメモリ上に中間バッファを設け、これと主記憶装置との間でブロック転送を行うようにするための修正プログラムを示す。なお、ここでは簡単のため、Nは10の倍数であるものとする。
図3(a)のオリジナルプログラムでは、(1)において、データa、bの要素に対する参照が生じる。これらのデータの参照は、一度だけであるため、ブロック転送によるデータ転送の効率化を除けば、データa、bをキャッシュ上に配置するのは無駄である。また、後続するプログラムの実行で必要となるデータがキャッシュ上に存在する場合に、そのデータが追いだされるという負の影響も生じる。
そこで、オンチップメモリ上に中間バッファを設け、これと主記憶装置との間でブロック転送を行うようにする。このように改変したソースプログラムを図3(b)に示す。なお、ここで、「_X」は当該宣言対象のデータをオンチップメモリに配置する指示、「copy」は第二引数の指示するアドレスから、第一引数の指示する領域へ、第三引数で指定された個数だけ要素のブロック転送を行うことを意味するものとし、ブロック転送の際にはキャッシュへのデータの登録は行なわないものと仮定する。
図3(b)の修正プログラムでは、(2)において、データ転送用の一時領域をオンチップメモリに確保し、(3)において、主記憶装置からオンチップメモリへのデータ転送、(4)でオンチップメモリ上での演算、(5)でオンチップメモリから主記憶装置への書き戻しを行う。この一連の処理において、キャッシュメモリへのデータの登録は生じないため、プログラムの実行を効率化することができる。
このようなソースプログラム改変を伴うオンチップメモリへのデータ配置手法は、非標準的な言語仕様を利用したソースプログラムの修正と、利用可能なオンチップメモリ容量を意識したプログラミングを必要とするため、プログラム作成の困難さが増大すると共に、オンチップメモリを利用するプログラムの他システムへのポータビリティが低下する。このため、オンチップメモリと主記憶装置から構成される計算機システムに対して、ソースプログラムの解析結果やプロファイル情報と呼ばれるプログラムを予め予備実行した際の動作情報から、プログラム中に出現するデータをオンチップメモリと主記憶装置のいずれに配置するかを決定する手法が開示されている(例えば、非特許文献3に参照)。
前記のようなキャッシュメモリとオンチップメモリは、相反する機構ではないため、マイクロプロセッサによっては、キャッシュメモリとオンチップメモリの双方を備えているものがある。こういったプロセッサでは、キャッシュメモリとオンチップメモリに格納可能なデータの最大容量は固定的なものが多い。ただし、キャッシュメモリおよびオンチップメモリで必要とされる容量は、プロセッサの用途やプログラムによって異なる。
そこで、キャッシュメモリとオンチップメモリがデータを格納するために利用する内蔵メモリ領域を共通とし、個々の領域に割当てる大きさをプログラム、あるいは、システム毎に選択可能とする手法が提案されている(例えば、非特許文献1参照)。
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.
前記のように、キャッシュメモリとオンチップメモリは、有効な適用用途が異なる。また、オンチップメモリへ配置することが有効なデータと、キャッシュメモリへ配置することが有効なデータは、プログラムのフェーズ毎にも異なることが多い。
従って、キャッシュメモリとオンチップメモリを共に備え、個々の割当て容量を選択可能なプロセッサにおいて、プログラムを効率的に動作させるためには、プログラムのフェーズ毎にキャッシュメモリとオンチップメモリへの割当てを最適な値に調整する必要があるが、従来のプログラムの改変を伴う手法はプログラムのポータビリティを損なうという問題がある。
また、オンチップメモリへのデータの配置をコンパイラによって自動的に行う従来手法では、固定サイズのオンチップメモリを仮定し、コード生成を行なっていた。このため、プログラムのフェーズ毎に最適なキャッシュメモリとオンチップメモリの内蔵メモリ領域への割当てを行うことができなかった。また、プログラムの構成フェーズにおいて、未使用の内蔵メモリ領域がある場合には、電力を無駄に消費するという問題があった。
本発明は、前記の課題を解決するための発明であって、プログラムによって割当てるメモリ容量を変更する機能を有するオンチップメモリ、キャッシュメモリ等の内蔵メモリを備えた計算機に対して、プログラム中のデータを効率良く配置することができるコード生成方法およびコンパイラを提供することを目的とする。
前記の課題を解決するため、プログラムの動きの制御フロー解析等を用いて、ループを単位とするフェーズに分割し、フェーズ毎にキャッシュメモリとオンチップメモリとに割当てる容量を決定し、当該メモリへの割当てをプログラム実行時に動的に変更する命令シーケンスを挿入するコードを生成することを特徴とする。
本発明によれば、キャッシュメモリとオンチップメモリを共に備え、個々の割当て容量を選択可能なプロセッサに対して、プログラムを効率的に動作させるコードを生成することができる。
以下、本発明の実施形態について図面を参照して説明する。
《実施形態1》
図1は、本発明の対象とする計算機システムの例を示す構成図である。計算機システムは、プロセッサ(CPU)201、主記憶装置202、外部記憶装置203から構成され、CPU201は、演算器204、レジスタ205、キャッシュメモリ206、オンチップメモリ207から構成される。言語処理系およびソースプログラムは、外部記憶装置203に格納され、CPU201に読み出されてコンパイル処理を行う。コンパイル結果のプログラムは主記憶装置202に保持されるか、外部記憶装置203に保存されてからCPU201に読み出されて実行される。
CPU201がメモリ参照を行う場合は、参照対象のアドレスを調べ、当該アドレスがオンチップメモリ領域であれば、オンチップメモリ207上のデータを参照する。当該アドレスがオンチップメモリ領域でなければ、まずキャッシュメモリ206上に参照対象アドレスのデータのコピーが存在するか否かを調べ、コピーが存在する場合はそのデータを参照する。コピーが存在しない場合は、主記憶装置202上の当該データを参照すると共に、当該データの属するキャッシュブロックのコピーをキャッシュメモリ206に置く。オンチップメモリ207、および、キャッシュメモリ206の参照は、主記憶装置202の参照に比べて高速であり、参照対象のデータがオンチップメモリ207、あるいは、キャッシュメモリ206上にあればメモリ参照によって発生する待ち時間を減少することができる。本発明の対象とする計算機システムでは、キャッシュメモリ206とオンチップメモリ207の割当て量は、ソフトウェアによって変更することができる。
図2は、本発明の言語処理系における最適化処理例を示す説明図である。最適化処理S101は、ソースプログラム102を入力し、最適化を適用した後、変換済みプログラム103を生成する。変換済みプログラムは、通常のコンパイラのように、一度ファイル形式で図1の外部記憶装置203に生成してもよいし、Just−In−Time(JIT)コンパイラのように、プログラム実行中に主記憶装置202に生成し、その場で実行してもよい。最適化処理S101は、最適化の適用過程で、中間語104を適宜生成・参照する。最適化処理S101は、フェーズ分割処理S105、データマッピング処理S106、コード生成処理S107から構成される。
図4は、実施形態1のフェーズ分割処理を示すフローチャートである。図4に示すフェーズ分割処理では、プログラムの制御フローを解析し、プログラム中のループを単位としてフェーズを構成する。一般に、内蔵メモリ領域の割当て変更にはオーバヘッドを伴うため、プログラム中のデータ参照頻度が低い点で変更を行なったほうがよい。プログラム中のループを単位としてフェーズを構成することで、データ参照頻度の低い点でプログラムが分割され、低いオーバヘッドで割当て変更を行うことが期待できる。なお、プログラムの制御フロー解析と、ループの識別手法に関しては、非特許文献4等に示されている標準的なプログラム解析手法を用いることができる。
図4に示すように、フェーズ分割処理S105は、処理S401で処理を開始し、処理S402でプログラム中のループ集合を変数Lに、フェーズ情報を格納する変数Pを空集合に初期化する。次に、処理S403において、変数Lが空集合か否かを判定する。変数Lが空集合である場合は(処理S403,YES)、処理対象となるループが存在しないため、処理S405に制御を移して処理を完了する。処理S403において、変数Lが空集合でない場合(処理S403,NO)、処理S404に制御を移し、変数Lから要素を1つ取り出して変数lに格納する。続いて、変数lを構成する基本ブロック集合をblに求め、変数lを構成する基本ブロック集合blとbl中で参照するデータの集合の組を、変数Pに追加する。以上の処理により、プログラム中のループをフェーズとして、フェーズを構成する基本ブロックと、そこで参照されるデータの集合が求められる。このフェーズ分割の際には、プロファイル情報等を用いることにより、頻繁に実行されるプログラム部分を摘出するといった最適化を適用してもよい。
図5は、フェーズ分割処理の対象とするソースプログラムの例を示す説明図である。図5(a)は、自動分割するときのソースプログラムの例であり、図5(b)は、ディレクティブを挿入したソースプログラムの例である。ディレクティブとは、プログラム中に埋め込むコンパイラへの命令であり、ここでは、//*optionが、コンパイラに対する命令を意味する。ディレクティブは、ユーザからの指示命令である。
図5(a)に示すソースプログラムに、図4に示すアルゴリズムを適用した場合、処理S402において変数L(ループ集合)にループ502,504が格納される。これらのループに対して、処理S404を適用した結果、最終的に変数Pに、ループ502,504を構成するループの基本ブロックとその参照データの組が格納される。図5(b)のソースプログラムは、図5(a)のプログラムにディレクティブを挿入し、図12において後述するフェーズ指定をしている。
図6は、実施形態1のデータマッピング処理を示すフローチャートである。図6に示すように、データマッピング処理S106は、処理S601で処理を開始し、続いて処理S602でフェーズ情報の集合を変数Pに格納し、データマッピング結果の集合である変数Mを空集合に初期化する。次に、処理S603において、フェーズ情報集合である変数Pが空集合であるか否かを判定する。空集合であれば(処理S603,YES)、処理対象とすべき要素が存在しないため、処理S605に制御を移して処理を完了する。処理S603において、変数Pが空集合でなかった場合(処理S603,NO)、処理S604に制御を移し、フェーズ情報集合から、基本ブロック集合と参照データ集合の組み合せよりなる要素を1つ取り出して、それぞれを変数BS、変数DSに格納する。
続いて、参照データ集合の変数DS中のデータのマッピングの組み合せ集合を変数Cに求める。ここで、データマッピングの組み合せ集合は、各データを配置可能な内蔵メモリ領域の組み合せを数え上げることにより求められる。次に、求めた組み合せ集合である変数Cについて、変数C中の各データマッピングに関する評価値を求める。この評価値は、各データ配置を採った場合に、プログラム実行時間、メモリ使用量、消費電力等、最適化対象とする項目に関して、性能の期待値がどのように与えられるかを、プログラムを構成する各基本ブロックの予測実行回数、プロセッサの動作推定結果等により求める。この結果得られた評価値集合Eについて、評価値が最大となるような最大評価値Emaxを選択し、フェーズを構成する基本ブロック集合とEmaxに対応する組み合せCmaxを、データマッピング結果の集合である変数Mに追加する。その後、処理S603に制御を移し、次のフェーズ情報の処理を行う。
図7は、データマッピング処理中の組み合せ集合の評価値を示す説明図である。ここでは、図5(a)の2重のループ502を、図6のデータマッピング処理中の処理S604に適用した例を示す。図5(a)のループ502には、データAとデータBの2つのデータ参照が存在する。これらのデータを、それぞれ、キャッシュメモリとオンチップメモリのいずれかに配置した場合を考えると、図7の組み合せC〜Cに示すデータ配置が得られる。例として、データA、データBをキャッシュメモリに配置した場合の性能向上の期待値をそれぞれ10および50、オンチップメモリに配置した場合の期待値をそれぞれ50および10とする。各データ配置の評価値が、それぞれの期待値の和によって求めるものとすると、図7の評価値欄のような結果が得られる。この結果から、組み合せCのデータ配置、すなわち、データAをオンチップメモリに配置し、データBをキャッシュメモリに配置する構成が、最も良い結果となることが期待される。
図8は、実施形態1のコード生成処理を示すフローチャートである。図8に示すように、コード生成処理S107は、処理S801で処理を開始し、処理S802において、データマッピング処理S106で得られたデータマッピング情報集合を変数Mに格納する。次に、処理S803において、データマッピング情報集合である変数Mが空集合か否かを判定する。空集合であれば(処理S803,YES)、処理すべきデータマッピング情報が存在しないため、処理S808に制御を移して処理を完了する。処理S803で変数Mが空集合でなかった場合(処理S803,NO)、処理S804に制御を移し、変数Mからデータマッピング情報、すなわち、対象基本ブロック集合と参照情報のデータマッピング情報の組を、1つ取り出す。次に、基本ブロック集合である変数BSから別のフェーズを経由しないで到達可能な次フェーズの集合を変数NPに求める。
続いて、処理S805に制御を移して、変数NPが空集合か否かを判定する。空集合であれば(処理S805,YES)、当該フェーズが次に遷移するフェーズが存在しないため、処理S803に制御を移して、次のデータマッピング情報を処理する。処理S805において変数NPが空集合でない場合は(処理S805,NO)、処理S806に制御を移す。処理S806では、変数NPから次フェーズを1つ取り出して変数npに格納し、npのデータマッピング情報、すなわち、基本ブロック集合と参照情報のデータマッピングの組を、変数NBSと変数NCの組に求める。次に、割当て変更コード生成処理S807に制御を移し、キャッシュメモリとオンチップメモリの割当て情報を変更するための割当て変更コードを生成する。割当て変更コード生成処理S807の詳細については図9において後述する。割当て変更コード生成処理S807のコード生成処理が完了すると、処理S805に制御を移し、次の後続フェーズへの遷移の処理を行う。
図9は、割当て変更コード生成処理を示すフローチャートである。割当て変更コード生成処理S807は、処理S901で処理を開始し、処理S902において、現在の処理対象フェーズのデータ割当て情報、すなわち、基本ブロックとデータの割当て情報の組を、変数BSと変数Cに求め、同様に次フェーズのデータ割当て情報を変数NBSと変数NCに求める。また、変数Cの必要とするオンチップメモリ量をlms、キャッシュメモリ量をcms、変数NCの必要とするオンチップメモリ量をnlms、キャッシュメモリ量をncmsに求める。次に、処理S903に制御を移し、lmsとnlms、および、cmsとncmsの値が同じであるか否かを判定する。判定結果が同じである場合(処理S903,YES)、割当て設定の変更は不要であるので、処理S907に制御を移して処理を完了する。判定結果が同じでない場合は(処理S903,NO)、処理S904に制御を移し、オンチップメモリ量をnlms、キャッシュメモリ量をncmsに変更する処理を、変数BSと変数NBSの間に追加する。
続いて、処理S905でnlmsとncmsの和が総メモリ量よりも少ないか否かを判定する。総メモリ量よりも少ない場合は(処理S905,YES)、次フェーズの動作に必要のない内蔵メモリ領域が存在するということを意味するので、処理S906に制御を移して未使用部分の動作を停止するコードを生成し、続いて処理S907に制御を移して処理を完了する。総メモリ量よりも少なくない場合は(処理S905,NO)、すなわち、未使用部分が存在しない場合、処理S907に制御を移して処理を完了する。なお、オンチップメモリ上にマッピングされるデータのうち同時に使用されるものの総量は、内蔵メモリの総容量を越えることはできないが、キャッシュメモリにマッピングされるデータの総量はデータの入れ替えをハードウェアが必要に応じて動的に行うため、このような制約を伴わない。
図10は、フェーズ毎のデータ割当ての例を示す説明図である。図5(a)のプログラムに対して、図6のデータマッピング処理S106を適用した結果、最適なマッピングとして、図10のデータマッピングが得られたものとする。また、対象プロセッサでキャッシュメモリとオンチップメモリに割当て可能な総メモリ量は32k(キロバイト)とする。ここで、フェーズP,Pは、それぞれ、図5(a)のループ502,504に対応する。この結果を図8のコード生成処理S107に適用すると、処理S802によって変数Mにループ502,504のデータ割当て情報が得られる。処理S804によりループ502のデータ割当て情報が変数Mより取り出され、変数NPに次フェーズ集合としてループ504の情報が得られる。
続いて、割当て変更コード生成処理S807で、ループ502を先行フェーズ、ループ504を後続フェーズとして、図9の割当て変更コード生成処理S807を呼び出し、割当て変更コードを生成する。図9の処理では、lms、cms、nlms、ncmsに、それぞれ、16k、16k、10k、6kが得られる。処理S903では、lmsとnlmsの値が異なるため、処理S904でループ502とループ504の間に割当てメモリ量を変更する処理を挿入する。また、処理S905では、nlmsとncmsの合計は16kであり、総メモリ量32kよりも小さいため、処理S906で未使用部分を停止するコードを生成する。この結果を図11に示す。
図11は、生成コードの例を示す説明図である。図11に示すように、ループ502とループ504の間にキャッシュメモリとオンチップメモリの割当てを変更するコード「mconf 10, 6」と未使用の内蔵メモリ領域を停止するコード「msusp 16」が挿入される(1105)。
本実施形態によれば、フェーズの区切り毎に最適なキャッシュメモリとオンチップメモリの割当て、および、未使用領域の停止等が行なわれるようになり、プログラムの実行効率化、消費電力の削減等の効果が得られる。
《実施形態2》
図12は、実施形態2のディレクティブ記述の場合のフェーズ分割処理を示すフローチャートである。実施形態2は、図1のフェーズ分割処理105において、プログラム構造の解析ではなく、プログラム中に記述したディレクティブを解析することによりフェーズ分割を行う場合の処理フローを示す。なお、ここでは、簡単のため、プログラム中のディレクティブ指示は、それ単独で基本ブロックを構成するものとする。ソースプログラムの例として、図5(b)では、指示文501および503がフェーズ指定を意味している。図12の処理を図5(b)に適用した場合、ループ502およびループ504を構成する基本ブロック集合が、それぞれ異なるフェーズとして識別される。
図12に示すように、フェーズ分割処理S105A(S105Aの符号は、図4のS105と区別するため、異なる符合がつけられている。)は、S1201で処理を開始し、続く処理S1202でプログラム中の基本ブロック集合を変数BBに求め、現在処理中のフェーズを構成する基本ブロック集合を格納するための変数BS、求めたフェーズ情報の集合を格納する変数Pを空集合に初期化する。次に、処理S1203において、基本ブロック集合である変数BBが空集合か否かを判定する。変数BBが空集合の場合(処理S1203,YES)、処理すべきフェーズが存在しないため、処理S1208に制御を移し、現在処理中のフェーズを構成する基本ブロックの集合である変数BSと変数BS中で参照されるデータ集合の組をフェーズ情報集合である変数Pに追加し、処理S1209で処理を完了する。
処理S1203で変数BBが空集合でない場合(処理S1203,NO)、処理S1204において基本ブロック集合である変数BBからソースコードの出現順に要素を1つ取り出し変数bに格納する。
次に、処理S1205において、変数bがフェーズ指定か否かを判定する。変数bがフェーズ指定であれば(処理S1205,YES)、処理S1207に制御を移して、現在処理中のフェーズを構成する基本ブロックの集合である変数BSとBSで参照されるデータ集合の組をフェーズ情報集合である変数Pに追加すると共に、現在処理中のフェーズを構成する基本ブロック集合を格納するための変数BSを空集合に再初期化し、処理S1203に制御を移して次の基本ブロックの処理を継続する。処理S1205において、変数bがフェーズ指定でなければ(処理S1205,NO)、現在処理中のフェーズを構成する基本ブロック集合である変数BSに変数bを追加し、処理S1203に制御を戻して、次の基本ブロックを処理する。
本実施形態によれば、プログラム中に記述したディレクティブを解析することによりフェーズ分割を行うことができる。
《実施形態3》
本発明の実施形態3として、図2のデータマッピング処理S106において、各フェーズにおける内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をソースコード上に記述したディレクティブにより行う場合を示す。
図13は、実施形態3の各フェーズにおける内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をディレクティブとしてソースプログラム中に挿入した例を示す説明図である。図13に示すように、図5(a)のプログラムに対して、ディレクティブを付加し、フェーズ指定に対し、フェーズ中で使用されるデータの割当て先と、その大きさを指定している。例えば、1301では、データAに、16k(キロバイト)、キャッシュメモリを割当て、データBに、16k(キロバイト)、オンチップに割当てることを意味している。また、1302では、データXに、10k(キロバイト)、キャッシュメモリを割当て、データYに、6k(キロバイト)、オンチップに割当てることを意味している。このフェーズ指定は、例えば、図12のフェーズ分割処理S105Aにおいて読み込んでおき、図6のデータマッピング処理S106において使用すればよい。
本実施形態によれば、内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をソースコード上に記述したディレクティブによって行うことにより、木目細かな割当て制御が可能となる。
《実施形態4》
次に、オンチップメモリへのデータ配置効果の算出において、データサイズが可変であるようなデータに関して、データサイズを増減させた効果を求める場合の、データ配置の組み合せを求めるための処理フローを図14に示す。この組み合せは、図6のデータマッピング処理における処理S604で組み合せ集合を求める際に使用する。
図14は、実施形態4のデータサイズ可変の場合の組み合せ集合計算処理を示すフローチャートである。まず、処理S1401で処理を開始し、次に、処理S1402で変数DSに対象フェーズの参照するデータの集合を求め、データマッピング集合を表す変数Mを空集合に初期化する。続いて、処理S1403で、データ集合の変数DSが空集合か否かを判定する。
データ集合の変数DSが空集合であった場合は(処理S1403,YES)、処理S1405に制御を移して処理を終了する。このとき、変数M中の要素の組み合せが求めるデータマッピングの組み合せとなる。処理S1403で、データ集合の変数DSが空集合でなかった場合(処理S1403,NO)、処理S1404に制御を移し、変数DSから参照データを1つ取り出して変数dに格納し、変数Rにデータ配置先集合として、「キャッシュメモリ」と「オンチップメモリ」を設定し、変数Sに変数dの取りうるサイズの集合を格納する。ここで求めたRとSの組み合せの集合の変数Cが変数dの取りうるデータマッピングの組み合せとなるので、これをデータマッピング集合である変数Mに追加する。続いて処理S1403に制御を戻して、次のデータの処理を継続する。
図15は、データサイズ可変の場合の組み合せ集合の評価値を示す説明図である。図15に示すように、データAを可変データとした場合に、データAの大きさを1k(キロバイト)、および、10kとした場合に取り得る各データ配置と、その評価値を示している。ここでは、データAのサイズを1kとし、キャッシュメモリおよびオンチップメモリに配置した場合の性能向上の期待値をそれぞれ0および70、データAのサイズを10kとした場合の期待値をそれぞれ10および50、データBの期待値を50および10と仮定する。データは位置の評価値は各データ配置で参照するデータの期待値の和とする。この結果から、データAのサイズを1kとしてオンチップメモリに配置し、データBをキャッシュメモリに配置した場合(C)が最も高い効果が得られることが分る。これを図6のデータマッピング処理S106の処理S604で選択することにより、最適な効果が得られる。
本実施形態によれば、参照データのデータサイズが可変であるような際、データサイズを増減させた場合について評価値(評価尺度)が最適となるデータの大きさを求め、当該データの大きさを、前記キャッシュメモリ又は前記オンチップメモリに割当てることにより、プログラム中のデータを効率良く配置することができる。
本発明の実施形態のコード生成方法は、プログラム中のループを単位とする各フェーズと各フェーズで参照する参照データとを抽出し、プログラムを分割するフェーズ分割処理S105と、フェーズ分割処理で分割された参照データに必要となるメモリ量について、キャッシュメモリとオンチップメモリとに配分する配分量を算出するメモリ算出処理(例えば、データマッピング処理S106)と、メモリ算出処理のメモリの算出量を基に、プログラムのフェーズの切換え点に、キャッシュメモリとオンチップメモリへの配分量を変更する命令コードを生成するコード生成処理S107とを有する。このようなコード生成方法によれば、キャッシュメモリとオンチップメモリとの個々の割当て容量を選択可能なプロセッサに対して、プログラムを効率的に動作させるコードを生成することができ、プログラムの実行性能を向上することができる。
本発明の対象とする計算機システムの例を示す構成図である。 本発明の言語処理系における最適化処理例を示す説明図である。 オンチップメモリへのデータ配置の指定例を示すソースコードである。 実施形態1のフェーズ分割処理を示すフローチャートである。 フェーズ分割処理の対象とするソースプログラムの例を示す説明図である。 実施形態1のデータマッピング処理を示すフローチャートである。 データマッピング処理中の組み合せ集合の評価値を示す説明図である。 実施形態1のコード生成処理を示すフローチャートである。 割当て変更コード生成処理を示すフローチャートである。 フェーズ毎のデータ割当ての例を示す説明図である。 生成コードの例を示す説明図である。 実施形態2のディレクティブ記述の場合のフェーズ分割処理を示すフローチャートである。 実施形態3の各フェーズにおける内蔵メモリ領域のキャッシュメモリとオンチップメモリへの割当て量の算出をディレクティブとしてソースプログラム中に挿入した例を示す説明図である。 実施形態4のデータサイズ可変の場合の組み合せ集合計算処理を示すフローチャートである。 データサイズ可変の場合の組み合せ集合の評価値を示す説明図である。
符号の説明
102 ソースプログラム
103 変換済みプログラム
104 中間語
S101 最適化処理
S105 フェーズ分割処理
S106 データマッピング処理
S107 コード生成処理
S807 割当て変更コード生成処理

Claims (16)

  1. 内蔵メモリであるキャッシュメモリおよびオンチップメモリの容量を指定して割当て可能な機能を備えたマイクロプロセッサ上で動作するプログラムのコード生成方法において、
    前記プログラム中のループを単位とする各フェーズと前記各フェーズで参照する参照データとを抽出し、前記プログラムを分割するフェーズ分割処理と、
    前記フェーズ分割処理で分割された前記参照データに必要となるメモリ量について、前記キャッシュメモリと前記オンチップメモリとに配分する配分量を算出するメモリ算出処理と、を有する
    ことを特徴とするコード生成方法。
  2. 前記メモリ算出処理のメモリの算出量を基に、プログラムのフェーズの切換え点に、前記キャッシュメモリと前記オンチップメモリへの配分量を変更する命令コードを生成するコード生成処理を有する
    ことを特徴とする請求項1に記載のコード生成方法。
  3. 前記フェーズ分割処理を、プログラムの動きを解析する制御フロー解析の結果を利用してデータ参照頻度の低い点で行なう
    ことを特徴とする請求項1に記載のコード生成方法。
  4. 前記フェーズ分割処理は、前記各フェーズの分割をソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
    ことを特徴とする請求項1に記載のコード生成方法。
  5. 前記メモリ算出処理は、前記オンチップメモリにデータを配置した場合の効果と、前記キャッシュメモリを介して参照を行なった場合の効果を求め、プログラムの実行性能の評価尺度が最も向上する配分を選択する
    ことを特徴とする請求項1に記載のコード生成方法。
  6. 前記メモリ算出処理は、ソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
    ことを特徴とする請求項1に記載のコード生成方法。
  7. 前記メモリ算出処理において、前記参照データのデータサイズが可変であるような際、データサイズを増減させた場合について評価尺度が最適となるデータの大きさを求め、当該データの大きさを、前記キャッシュメモリ又は前記オンチップメモリに割当てる
    ことを特徴とする請求項5に記載のコード生成方法。
  8. 前記評価尺度は、前記プログラムの実行時間又は前記マイクロプロセッサの消費電力を含む
    ことを特徴とする請求項5又は請求項7に記載のコード生成方法。
  9. 前記コード生成処理において、前記キャッシュメモリ又は前記オンチップメモリへの配分が不要な場合、該当するメモリ領域を停止する命令コード又は低電力モードへ移行する命令コードを生成する
    ことを特徴とする請求項2に記載のコード生成方法。
  10. 内蔵メモリであるキャッシュメモリおよびオンチップメモリの容量を指定して割当て可能な機能を備えたマイクロプロセッサ上で動作するプログラムのコンパイラにおいて、
    コンピュータに、
    前記プログラム中のループを単位とする各フェーズと前記各フェーズで参照する参照データとを抽出し、前記プログラムを分割するフェーズ分割処理と、
    前記フェーズ分割処理で分割された前記参照データに必要となるメモリ量について、前記キャッシュメモリと前記オンチップメモリとに配分する配分量を算出するメモリ算出処理と、
    前記メモリ算出処理のメモリの算出量を基に、プログラムのフェーズの切換え点に、前記キャッシュメモリと前記オンチップメモリへの配分量を変更する命令コードを生成するコード生成処理と、に基づいて前記プログラムの最適化を行う
    ことを特徴とするコンパイラ。
  11. 前記フェーズ分割処理を、プログラムの動きを解析する制御フロー解析の結果を利用してデータ参照頻度の低い点で行なう
    ことを特徴とする請求項10に記載のコンパイラ。
  12. 前記フェーズ分割処理は、前記各フェーズの分割をソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
    ことを特徴とする請求項10に記載のコンパイラ。
  13. 前記メモリ算出処理は、前記オンチップメモリにデータを配置した場合の効果と、前記キャッシュメモリを介して参照を行なった場合の効果を求め、プログラムの実行性能の評価尺度が最も向上する配分を選択する
    ことを特徴とする請求項10に記載のコンパイラ。
  14. 前記メモリ算出処理は、ソースコード上に記述したディレクティブ又はコンパイラへのオプションによって行なう
    ことを特徴とする請求項10に記載のコンパイラ。
  15. 前記メモリ算出処理において、前記参照データのデータサイズが可変であるような際、データサイズを増減させた場合について評価尺度が最適となるデータの大きさを求め、当該データの大きさを、前記キャッシュメモリ又は前記オンチップメモリに割当てる
    ことを特徴とする請求項13に記載のコンパイラ。
  16. 前記コード生成処理において、前記キャッシュメモリ又は前記オンチップメモリへの配分が不要な場合、該当するメモリ領域を停止する命令コード又は低電力モードへ移行する命令コードを生成する
    ことを特徴とする請求項10に記載のコンパイラ。
JP2006284638A 2006-10-19 2006-10-19 コード生成方法およびコンパイラ Withdrawn JP2008102733A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2006284638A JP2008102733A (ja) 2006-10-19 2006-10-19 コード生成方法およびコンパイラ
US11/976,084 US20080114941A1 (en) 2006-10-19 2007-10-19 Code generation method and compiler

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006284638A JP2008102733A (ja) 2006-10-19 2006-10-19 コード生成方法およびコンパイラ

Publications (1)

Publication Number Publication Date
JP2008102733A true JP2008102733A (ja) 2008-05-01

Family

ID=39370539

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006284638A Withdrawn JP2008102733A (ja) 2006-10-19 2006-10-19 コード生成方法およびコンパイラ

Country Status (2)

Country Link
US (1) US20080114941A1 (ja)
JP (1) JP2008102733A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010244205A (ja) * 2009-04-02 2010-10-28 Fujitsu Ltd コンパイラプログラムおよびコンパイラ装置
JP2010244204A (ja) * 2009-04-02 2010-10-28 Fujitsu Ltd コンパイラプログラムおよびコンパイラ装置
JP2011170439A (ja) * 2010-02-16 2011-09-01 Nec Corp コンパイラ、コンパイル方法、及びコンパイル実行プログラム
JP2013510353A (ja) * 2009-11-09 2013-03-21 ローベルト ボッシュ ゲゼルシャフト ミット ベシュレンクテル ハフツング メモリ構成

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9898411B2 (en) 2014-12-14 2018-02-20 Via Alliance Semiconductor Co., Ltd. Cache memory budgeted by chunks based on memory access type
WO2016097807A1 (en) 2014-12-14 2016-06-23 Via Alliance Semiconductor Co., Ltd. Cache replacement policy that considers memory access type
US9811468B2 (en) 2014-12-14 2017-11-07 Via Alliance Semiconductor Co., Ltd. Set associative cache memory with heterogeneous replacement policy
EP3230874B1 (en) 2014-12-14 2021-04-28 VIA Alliance Semiconductor Co., Ltd. Fully associative cache memory budgeted by memory access type
KR101817847B1 (ko) 2014-12-14 2018-02-21 비아 얼라이언스 세미컨덕터 씨오., 엘티디. 메모리 접근 타입에 기초한 통로에 의해 버짓화된 캐시 메모리

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6757892B1 (en) * 1999-06-24 2004-06-29 Sarnoff Corporation Method for determining an optimal partitioning of data among several memories
US6795781B2 (en) * 2002-06-27 2004-09-21 Intel Corporation Method and apparatus for compiler assisted power management
US7278136B2 (en) * 2002-07-09 2007-10-02 University Of Massachusetts Reducing processor energy consumption using compile-time information
US6952821B2 (en) * 2002-08-19 2005-10-04 Hewlett-Packard Development Company, L.P. Method and system for memory management optimization

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010244205A (ja) * 2009-04-02 2010-10-28 Fujitsu Ltd コンパイラプログラムおよびコンパイラ装置
JP2010244204A (ja) * 2009-04-02 2010-10-28 Fujitsu Ltd コンパイラプログラムおよびコンパイラ装置
JP2013510353A (ja) * 2009-11-09 2013-03-21 ローベルト ボッシュ ゲゼルシャフト ミット ベシュレンクテル ハフツング メモリ構成
JP2011170439A (ja) * 2010-02-16 2011-09-01 Nec Corp コンパイラ、コンパイル方法、及びコンパイル実行プログラム

Also Published As

Publication number Publication date
US20080114941A1 (en) 2008-05-15

Similar Documents

Publication Publication Date Title
JP2008102733A (ja) コード生成方法およびコンパイラ
US5862385A (en) Compile method for reducing cache conflict
JP5780243B2 (ja) スケジューリング方法、およびマルチコアプロセッサシステム
KR102266606B1 (ko) 복수의 스레드를 처리하는 데이터 처리 장치 및 방법
CN103197953B (zh) 推测执行和回滚
US7926046B2 (en) Compiler method for extracting and accelerator template program
US8181168B1 (en) Memory access assignment for parallel processing architectures
US5761514A (en) Register allocation method and apparatus for truncating runaway lifetimes of program variables in a computer system
TWI417792B (zh) 在處理器系統之指令階使資源分配識別之方法及裝置
US8453132B2 (en) System and method for recompiling code based on locality domain and thread affinity in NUMA computer systems
JP5218998B2 (ja) バッファを用いて高効率でロード処理を実行する方法およびプログラム
JP4958103B2 (ja) プログラムコード変換においてコードのパーティショニングを行う方法及び装置
KR101440107B1 (ko) 다중 코어 시스템에서 접근 시간에 기초한 메모리 관리방법 및 장치
US7210026B2 (en) Virtual register set expanding processor internal storage
JP2005332387A (ja) メモリ命令をグループ化及び管理する方法及びシステム
MXPA97002265A (en) Method and apparatus for processing memory type information within a microprocess
JP2018519597A (ja) ブロックサイズに基づくマッピング命令ブロック
Moritz et al. Flexcache: A framework for flexible compiler generated data caching
JP2008009957A (ja) コンパイル装置
US20230334748A1 (en) Control stream stitching for multicore 3-d graphics rendering
US20090276575A1 (en) Information processing apparatus and compiling method
WO2004003738A2 (en) Generating code for a configurable microprocessor
US11915056B2 (en) Combination of multiple data processing and machine learning frameworks for a target hardware
US7761691B2 (en) Method for allocating registers using simulated annealing controlled instruction scheduling
US9244828B2 (en) Allocating memory and using the allocated memory in a workgroup in a dispatched data parallel kernel

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090107

A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20091109