(57)【要約】【課題】プログラムが実行時に主としてアクセスするメモリ階層に応じて、異なる最適化方法を適用する方法を提供する。【解決手段】コンパイルオプション指示（３０１）またはプログラム中の指示文（４０１）を用いて、プログラムが主としてアクセスするメモリ階層をユーザが指定する。コンパイラ（２０８）ではメモリ階層指示を解析し（１０２）、メモリ階層に応じた最適化（１０３、１０４、１０５）を実施する。【選択図】  図１
2004303113.tif 000002
【特許請求の範囲】
【請求項１】
計算機システムと協働することで、複数のメモリ階層を備えたアーキテクチャ上で実行するためのオブジェクトプログラムを生成するコンパイラであって、
対象プログラムが実行時に主としてどのメモリ階層上のデータを参照するかを指示するオプションまたは指示文を解釈するステップと、
上記指示されたメモリ階層向けの最適化処理を行うステップとを有することを特徴とするコンパイラ。
【請求項２】
請求項１のコンパイラであって、
前記メモリ階層向けの最適化処理として、メモリをアクセスする命令に対して指定されたメモリ階層に応じたメモリレイテンシを求め、求めたレイテンシに応じた最適化処理を行うことを特徴とするコンパイラ。
【請求項３】
請求項１のコンパイラであって、
メモリ階層向けの最適化処理として、メモリをアクセスする命令に対して指定されたメモリ階層に応じて、ループ交換またはループ展開またはループタイリングのループ変換方法を決定することを特徴とするコンパイラ。
【請求項４】
計算機システムおよび該計算機システムと協働して複数のメモリ階層を備えたアーキテクチャ上で実行するためのオブジェクトプログラムを生成するコンパイラにより遂行されるオブジェクトプログラム生成方法であって、
対象プログラムが実行時に主としてどのメモリ階層上のデータを参照するかを指示するオプションまたは指示文を解釈するステップと、
上記指示されたメモリ階層向けの最適化処理を行うステップとを有することを特徴とするコード生成方法。
【請求項５】
請求項４のコード生成方法であって、
前記メモリ階層向けの最適化処理として、メモリをアクセスする命令に対して指定されたメモリ階層に応じたメモリレイテンシを求め、求めたレイテンシに応じた最適化処理を行うことを特徴とするコード生成方法。
【請求項６】
請求項４のコード生成方法であって、
メモリ階層向けの最適化処理として、メモリをアクセスする命令に対して指定されたメモリ階層に応じて、ループ交換またはループ展開またはループタイリングのループ変換方法を決定することを特徴とするコード生成方法。
【請求項７】
複数のメモリ階層を備えたアーキテクチャ上で実行するプログラムに対して、対象プログラムが実行時に主としてどのメモリ階層上のデータを参照するかを指示するオプションまたは指示文を解釈することを特徴とするコンパイラ。
【請求項８】
請求項１のコンパイラを格納した記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、計算機の利用技術において、オブジェクトプログラムの実行時間を削減するコンパイル方法に関する。特に、複数のメモリ階層を備えたアーキテクチャ向けの最適化指示方法に関する。
【０００２】
【従来の技術】
マイクロプロセッサの速度向上に伴って主記憶アクセスのレイテンシが増大している。多くのプロセッサでは、主記憶よりもアクセスが速く比較的小容量のキャッシュ記憶を備えており、さらにキャッシュ記憶を、１次キャッシュ、２次キャッシュというように階層化することにより、なるべくレイテンシの小さいメモリ階層のデータをアクセスすることで、レイテンシの大きなメモリ階層のアクセス回数を削減している。すなわちメモリアクセス命令は、１次キャッシュヒット時には短いレイテンシで１次キャッシュをアクセスし、１次キャッシュミス時には、２次キャッシュヒットならば２次キャッシュをアクセスし、全てのキャッシュ階層のミス時にのみ主記憶をアクセスする。
【０００３】
キャッシュミス時のレイテンシを隠す方法としては、ロード命令と、ロードしたデータを使用する命令の距離を十分離すような命令スケジューリングがあげられる。命令間を何サイクル離すかを決める基準としては、メモリレイテンシを用いる。
【０００４】
キャッシュミス時の主記憶参照のレイテンシを隠す別の手法として、例えば非特許文献１などに述べられているように、主記憶からキャッシュへデータを先行的に移動するプリフェッチ命令をプロセッサに用意し、コンパイラによってプログラム中にプリフェッチ命令を挿入する、ソフトウェア・プリフェッチ（プリフェッチ最適化）と呼ばれる方法がある。プリフェッチ命令を利用すれば、後続ループ繰り返しで参照するデータを予め主記憶からキャッシュへ移動しておきながら、同時に別の演算を行うことができ、主記憶参照のレイテンシを隠すことができる。
【０００５】
この方法では、ループ内のデータ参照に対してプリフェッチ命令を生成する場合、そのループの１回の繰り返しにかかる実行サイクル数Ｃを見積もり、データをメモリからキャッシュに移動するのに要するサイクル数（メモリレイテンシ）ＬをＣで割った値α＝ＣＥＩＬ（Ｌ／Ｃ）（ＣＥＩＬは小数点以下の切り上げを表す記号とする）を計算し、α回後の繰り返しで参照するデータを予めプリフェッチしておくことにより、Ｌサイクル後にそのデータを参照するときにはデータが既にキャッシュに到着しているのでキャッシュヒットとなり、プログラム実行が高速化される。１次キャッシュへのプリフェッチを行う場合、データが既に１次キャッシュ上にあればプリフェッチは不要である。また、データが２次キャッシュにデータがある場合にはＬは２次キャッシュから１次キャッシュへ移動するのに要するサイクル数、データが主記憶上にある場合には主記憶から１次キャッシュへ移動するのに要するサイクル数を使用した方がよい。しかし、通常、データがどのメモリ階層にあるかは不明なため、主記憶上にあると仮定した処理を行う。
【０００６】
データ局所性を高めるプログラム変換により、キャッシュミスの回数を削減する最適化も知られている。具体的な変換としては、ループタイリング、ループ交換、ループ展開があげられる。
【０００７】
ループタイリングとは、多重ループ内で参照されるデータがリユースを持つ場合に、一旦キャッシュ上にロードされたデータが他のデータの参照によってキャッシュから追い出される前に再度参照されるようにすることを目的としたループ変換である。ループタイリングについては、非特許文献２に記載されている。
【０００８】
メモリ参照パターンの最適化を目的としたループ交換やループ展開については、非特許文献３に記載されている。
【０００９】
以上で述べたようなレイテンシ隠蔽最適化やデータ局所化は、メモリ参照にかかるサイクル数や、キャッシュサイズといった、対象とするターゲットマシンの属性に依存する情報を必要とする。コンパイラでは通常、対象とするマシンの情報を内部情報として保持しているが、これらの情報をユーザが指示する方法もある。非特許文献４では’−ｍｓｌａｔｅｎｃｙ＝Ｎ’（Ｎは正定数）というオプション指定により、メモリからの読み出しにかかるサイクル数がＮであることを指定できることが記載されている。非特許文献５では’−ｑｃａｃｈｅ’オプションにより階層キャッシュのレベル毎にキャッシュサイズやラインサイズ、連想数が指定できることが記載されている。
【００１０】
【非特許文献１】Ｔｏｄｄ  Ｃ．  Ｍｏｗｒｙ他：Ｄｅｓｉｇｎ  ａｎｄ  Ｅｖａｌｕａｔｉｏｎ  ｏｆ  Ｃｏｍｐｉｌｅｒ  Ａｌｇｏｒｉｔｈｍ  ｆｏｒ  Ｐｒｅｆｅｔｃｈｉｎｇ，  Ａｒｃｈｉｔｅｃｔｕｒａｌ  Ｓｕｐｐｏｒｔ  ｆｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ，  ｐｐ．６２−７３，  １９９２年
【非特許文献２】Ｍｉｃｈａｅｌ  Ｅｄｗａｒｄ  Ｗｏｌｆ，  Ｉｍｐｒｏｖｉｎｇ  Ｌｏｃａｌｉｔｙ  ａｎｄ  Ｐａｒａｌｌｅｌｉｓｍ  ｉｎ  Ｎｅｓｔｅｄ  Ｌｏｏｐｓ’，  Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ：  ＣＳＬ−ＴＲ−９２−５３８，  １９９２年
【非特許文献３】Ｋｅｖｉｎ  Ｄｏｗｄ，  Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ’，  Ｏ’Ｒｅｉｌｌｙ  ＆  Ａｓｓｏｃｉａｔｅｓ，  Ｉｎｃ．，  １１．１節
【非特許文献４】日立，  （ＨＩ−ＵＸ／ＭＰＰ  ｆｏｒ  ＳＲ８０００）  Ｏｐｔｉｍｉｚｉｎｇ  ＦＯＲＴＲＡＮ９０  Ｕｓｅｒ’ｓ  Ｇｕｉｄｅ’，  ６．２節
【非特許文献５】ＩＢＭ，  ’ＸＬ  Ｆｏｒｔｒａｎ  ｆｏｒ  ＡＩＸ  Ｕｓｅｒ’ｓ  Ｇｕｉｄｅ  Ｖｅｒｓｉｏｎ  ７  Ｒｅｌｅａｓｅ  １’，  第５章
【００１１】
【発明が解決しようとする課題】
従来の技術の項で述べたレイテンシ隠蔽最適化やデータ局所化は、プログラム実行時にデータがどのメモリ階層に存在するかにより最適化の方法は異なる。
【００１２】
例えば、命令スケジューリングにおいては、ロード命令と使用命令の間の距離が大きくなれば、使用レジスタ数が増大する。またプリフェッチ最適化においては、プリフェッチ命令のタイミングが早過ぎると、使用命令が実行される前に再びキャッシュから追い出されてしまう場合がある。したがって、これらの最適化で仮定するメモリレイテンシが大き過ぎると最適化の効果が十分に得られない。すなわちＬ２キャッシュヒットのデータに対して主記憶レイテンシを用いた最適化を適用すると、Ｌ２キャッシュレイテンシを用いた場合に比べて実行性能が低下する可能性がある。しかし、従来の技術ではロード命令の対象データがどのメモリ階層に存在するかが不明であるため、主記憶レイテンシを仮定せざるを得ない問題がある。
【００１３】
また、データ局所性最適化では、複雑なループ構造に変換したためにループ実行のオーバーヘッドが増加し実行性能が低下する可能性がある。ループ内で参照されるデータが主としてキャッシュミスを起こす場合にはキャッシュミス回数の削減により適用効果が得られるが、キャッシュヒット時にはキャッシュミス回数の削減効果はないため、適用しない方がよい。従来はデータがキャッシュヒットするかどうかがわからないため、キャッシュヒット時にもループ変換を適用していた。このため実行性能が低下する場合があるという問題があった。
【００１４】
【課題を解決するための手段】
上記の課題を解決するために、本発明では、計算機システムと協働することで、複数のメモリ階層を備えたアーキテクチャ上で実行するためのオブジェクトプログラムを生成するコンパイラに、対象プログラムが実行時に主としてどのメモリ階層上のデータを参照するかを指示するオプションまたは指示文を解釈するステップと、上記指示されたメモリ階層向けの最適化処理を行うステップとを持たせた．
メモリ階層向けの最適化処理としては、メモリをアクセスする命令に対して指定されたメモリ階層に応じたメモリレイテンシを求め、求めたレイテンシに応じた最適化処理を行うステップ／またはメモリをアクセスする命令に対して指定されたメモリ階層に応じて、ループ交換またはループ展開またはループタイリングのループ変換方法を決定するステップを持たせた。
【００１５】
図１は本発明の概要を示す。図１においてソースプログラムＴＥＳＴ１．ｆの実行時に参照されるデータが主としてＬ２キャッシュデータであり、ＴＥＳＴ２．ｆは主記憶データだとすると、これら２つのプログラムに対する最適化方法は異なるべきである。
【００１６】
しかし、従来はどちらも主記憶データを仮定した最適化を適用していた。プログラム内で参照されるデータが主としてアクセスするメモリ階層は、データサイズやループサイズなどによって決まる。これらはコンパイラの静的な解析では不明であることが多いためである。
【００１７】
本発明では、プログラム実行時にデータが主としてどのメモリ階層に属するかを指定する手段を設けることにより、コンパイラがメモリ階層の指定を解析し（１０１）、指定されたメモリ階層に応じた最適化を実施する（１０３、１０４、１０５）ことで、より進んだ最適化が実施されたオブジェクトプログラムが生成できる。メモリ最適化では、指定されたメモリ階層のレイテンシやサイズなどの属性を用いてコード変換を実施する。図１の例ではＴＥＳＴ１．ｆに対してはＬ２データ向け最適化（１０４）を適用し、ＴＥＳＴ２．ｆに対しては主記憶データ向け最適化（１０５）を適用する。
【００１８】
【発明の実施の形態】
以下、図面を用いて本発明の実施の形態について説明する。
【００１９】
図２は、本発明によるコンパイラが稼動する計算機システムの構成図である。この計算機システムは、ＣＰＵ２０１、ディスプレイ装置２０２、キーボード２０３、主記憶装置２０４、および外部記憶装置２０５より構成されている。キーボード２０３により、ユーザからのコンパイラ起動命令を受け付ける。コンパイラ終了メッセージやエラーメッセージは、ディスプレイ装置２０２に表示される。外部記憶装置２０５には、ソースプログラム２０６とオブジェクトプログラム２０７が格納される。主記憶装置２０４には、コンパイラ２０８、コンパイル過程で必要となる中間コード２０９とループ表２１０が格納される。コンパイル処理はＣＰＵ２０１がコンパイラプログラム２０８を実行することにより行われる。なお、ＣＰＵ２０１は内部にフェッチ／デコードユニット、実行ユニット等を含む処理ユニット２０１１からのアクセスレイテンシの異なるレベル１（Ｌ１）キャッシュ２０１２とレベル２（Ｌ２）キャッシュ２０１３を持ち、処理ユニットによる処理を高速に実行するためのメモリ階層を構成している。また、以降の説明では、コンパイラに記述されたコードを解釈して実行するＣＰＵ２０１による処理をコンパイラの処理／処理手順と言うものとする。
【００２０】
図３に、コンパイル時にメモリ階層指示を行うために、計算機システムが入力Ｊを受け付けるコンパイラ起動命令の例を示す。’ｆ９０’はＦｏｒｔｒａｎコンパイラの起動コマンドの例、ｔｅｓｔ．ｆはソースプログラムの指定の例、’−Ｏ’はコンパイラオプションの一例である。本実施例ではメモリ階層指示オプションは’−ｄａｔａ’で表し、プログラム中のデータが主としてどのメモリ階層に存在するかを指定する。メモリ階層としては、Ｌ１キャッシュを表す’Ｌ１’、Ｌ２キャッシュを表す’Ｌ２’、主記憶を表す’ＭＥＭ’を指定できる。’−ｄａｔａ＝Ｌ２’（３０１）では、データが主としてＬ２キャッシュに存在することの指示をしている。
【００２１】
図３の例ではコンパイラ起動命令中でメモリ階層指示を行う例を示すが、メモリ階層指示は、ソースプログラム中の指示文として記述することもできる。図４にメモリ階層指示が付加されたソースプログラムの例を示す。本例では、ループ単位に指示文を指定できるものとする。指示文４０１は’ＤＯ  １０’のループ内のデータが主としてＬ１キャッシュヒットとなることの指示をしている。指示文４０２は’ＤＯ  ２０’のループ内のデータが主として主記憶をアクセスすることの指示をしている。指示文４０３は’ＤＯ  ３０’のループ内のデータが主としてＬ２キャッシュヒット（Ｌ１キャッシュミス）となることの指示をしている。
【００２２】
図５に、図２のシステムで稼動するコンパイラ２０８の処理手順を示す。コンパイラの処理は、構文解析５０１、メモリ最適化５０２、レジスタ割り付け５０３、コード生成５０４の順で行う。
【００２３】
構文解析５０１では、ソースプログラム２０６を入力として構文解析、およびループ解析を行い、中間コード２０９とループ表２１０を出力する。また本ステップにおいて、本発明の特徴であるメモリ階層指示文やメモリ階層指示オプションを解析し、ループ表に登録する。ループ表２１０については後で説明する。メモリ最適化５０２は、本発明の特徴となるステップであるので、後で詳細に説明する。レジスタ割り付け５０３では中間コード２０９の各ノードへのレジスタ割り付けを行う。コード生成５０４では、中間コード２０９をオブジェクトプログラム２０７に変換し、出力する。
【００２４】
図６にループ表２１０の例を示す。図には、ループを識別するためのループ番号６０１のほかは、本発明の特徴であるデータ指示フィールド６０２だけを示している。ループ表は構文解析処理５０１の処理で生成されるが、その生成処理であるデータ指示フィールド設定の処理手順を図１３に示す。
【００２５】
本処理は、ループを順に辿り処理する。ステップ１３０１では、未処理のループがあるかどうかを判定し、あればステップ１３０２で未処理ループを１つ取り出す。ステップ１３０３ではコンパイル対象のソースプログラム中に図４に示したようなループへのメモリ階層指示である’ｄａｔａ’指示文があるかどうかを調べる。あればステップ１３０７で’ｄａｔａ’指示文のオペランドをループ表に設定する。図４の例ではＤＯ１０のループに対しては’Ｌ１’のように設定する。ｄａｔａ指示文がないときにはステップ１３０４へ進み、コンパイラ起動命令にメモリ階層指示オプションである’−ｄａｔａ’オプションの指定があるかどうかを調べる。オプション指定がある場合はステップ１３０５へ進み、オプションの値を設定する。オプション指定がなければステップ１３０６へ進み、「指定なし」を設定する。
【００２６】
以下、メモリ最適化５０２の詳細な例を示す。
【００２７】
最適化処理の第１の例はメモリ最適化５０２において命令スケジューリングを行うものとする。命令スケジューリングの処理手順を図７に示す。
【００２８】
ステップ７０１で、ＤＡＧ（ｄｉｒｅｃｔｅｄ  ａｃｙｃｌｉｃ  ｇｒａｐｈ）を作成する。図８にＡ（Ｉ）＊Ｂ（Ｉ）＋Ｃ（Ｉ）に対応したＤＡＧの例を示す。ＤＡＧの各ノードは中間コード上の命令に対応している。ノード間のエッジは、実行順序の制約を表す。例えばノード８０３のｍｕｌ演算はノード８０１およびノード８０２のｌｏａｄの結果をオペランドとするので、ノード８０１とノード８０２は、ノード８０３よりも先に実行しなければならない。この関係をノード８０１からノード８０３へのエッジ、およびノード８０２からノード８０３へのエッジで表す。
【００２９】
ステップ７０２で、ステップ７０１で作成したＤＡＧのエッジ上にレイテンシを設定する。本ステップの処理手順の詳細を図９に示す。図９の各ステップについて説明する。
【００３０】
本処理は、ＤＡＧ上のエッジを辿り、順に処理する。ステップ９０１では未処理のエッジがあるかどうかを判定し、なければ処理を終了する。あればステップ９０２へ進み、未処理のエッジを取り出して、処理対象とする。ステップ９０３では、エッジの始点ノードがロード命令かどうかを調べる。ロード命令でなければステップ９１０へ進み、始点ノードの演算に対応するレイテンシの値をエッジ上に設定して、このエッジの処理を終了し、ステップ９０１へ戻る。
【００３１】
ステップ９０４では、ノードの所属するループを調べ、ループ表によりｄａｔａ指示を調べる。ステップ９０５では、ｄａｔａ指示がＬ１かどうかを調べる。そうであればステップ９０９へ進み、Ｌ１キャッシュのレイテンシの値をエッジ上に設定してステップ９０１へ戻る。ｄａｔａ指定がＬ１でなければステップ９０６へ進み、ｄａｔａ指示がＬ２かどうかを調べる。そうであればステップ９０８へ進み、Ｌ２キャッシュのレイテンシの値をエッジ上に設定してステップ９０１へ戻る。そうでない場合、即ちｄａｔａ指示がＭＥＭまたは指定なしの場合にはステップ９０７へ進み、主記憶アクセスのレイテンシを設定してステップ９０１へ戻る。
【００３２】
図８は各ロードノードに対応するｄａｔａ指示がＬ２で、Ｌ２レイテンシが１０サイクルの場合の例を示している。
【００３３】
本実施例では、ロード命令の対象データがＬ１キャッシュ、Ｌ２キャッシュ、主記憶のいずれに存在しているかに応じてＤＡＧエッジのレイテンシを設定することにより、ロード命令に対してより正確なレイテンシを仮定した命令スケジューリングを適用できるという効果がある。
【００３４】
次に、本発明によるメモリ最適化５０２において、プリフェッチ最適化を行う例を説明する。プリフェッチ最適化の処理手順を図１０に示す。
【００３５】
ステップ１００１では、未処理のループがあるかどうかを判定し、あればステップ１００２で未処理ループを１つ取り出す。ステップ１００３では取り出したループのｄａｔａ指示をループ表２１０により調べ、ｄａｔａ指示がＬ１ならば、ステップ１００１へ戻る。これは、このループのデータが既にＬ１キャッシュ上にあるため、プリフェッチ最適化の効果がないと判断したためである。ステップ１００４ではｄａｔａ指示がＬ２かどうかを調べる。Ｌ２ならばステップ１００６へ進み、ＬにＬ２キャッシュのレイテンシを設定する。そうでない場合、即ちｄａｔａ指示がＭＥＭまたは指定なしの場合は、ステップ１００５へ進み、Ｌに主記憶レイテンシを設定する。
【００３６】
ステップ１００７ではループ繰り返しあたりの実行サイクル数を求め、Ｃに設定する。ステップ１００８では（Ｌ／Ｃ）を整数に切り上げた値をＮに設定する。ステップ１００９ではＮイタレーション後のプリフェッチコードを生成し、ループ内に挿入する。
【００３７】
本実施例ではＬ２キャッシュにあるかどうかに応じて主記憶レイテンシを設定することにより、より適切なプリフェッチ距離によるプリフェッチコードを生成する効果がある。また、Ｌ１キャッシュにデータがある場合には不要なプリフェッチコードを生成しない効果がある。
【００３８】
次に、本発明によるメモリ最適化５０２において、タイリングを行う例について説明する。タイリングの処理手順を図１１に示す。
【００３９】
ステップ１１０１では、未処理のループがあるかどうかを判定し、あればステップ１１０２で未処理ループを１つ取り出す。ステップ１１０３では取り出したループのｄａｔａ指示をループ表２１０により調べ、ｄａｔａ指示がＬ１ならば、ステップ１１０１へ戻る。これは、このループのデータが既にＬ１キャッシュ上にあるため、タイリングの効果がないと判断したためである。ステップ１１０４ではｄａｔａ指示がＬ２かどうかを調べる。Ｌ２ならばステップ１１０６へ進み、ターゲットキャッシュをＬ１とする。そうでない場合、即ちｄａｔａ指示がＭＥＭまたは指定なしの場合は、ステップ１１０５へ進み、ターゲットキャッシュをＬ２とする。
【００４０】
ステップ１１０７では、タイリングの適用条件を調べ、適用対象かどうかを決定する。適用条件としては、多重ループであるか、依存条件を満たすか、タイリング効果があるかなどを調べる。適用条件の判定方法の詳細については、従来の技術の項で示した非特許文献２に記載されている。適用対象でなければこのループの処理を終了してステップ１１０１へ戻り、適用対象ならばステップ１１０８へ進む。
【００４１】
ステップ１１０８では、ステップ１１０５および１１０６で決定したターゲットキャッシュのキャッシュサイズ、連想度などに基づいてタイルサイズを決定する。タイルサイズを決定する方法については、従来の技術の項で示した非特許文献２に記載されている。
【００４２】
ステップ１１０９では、ステップ１１０８で決定したタイルサイズに従い、タイリング変換処理を行う。タイリング変換処理についても、従来の技術の項で示した非特許文献２に記載されている。
【００４３】
本実施例では、ｄａｔａ指示に応じてターゲットキャッシュを決定することにより、より適切なタイルサイズによる変換を適用する効果がある。また、Ｌ１キャッシュにデータがある場合には不要なタイリング変換を適用しない効果がある。
【００４４】
次に、本発明によるメモリ最適化５０２において、ループ交換およびループ展開を行う例について説明する。処理手順を図１２に示す。
【００４５】
本実施例ではデータがＬ１キャッシュまたはＬ２キャッシュにある場合にはループ交換やループ展開の効果がないと考え、適用を中止し、データが主記憶にあると予想される場合のみに最適化を適用する。
【００４６】
ステップ１２０１では、未処理のループがあるかどうかを判定し、あればステップ１２０２で未処理ループを１つ取り出す。ステップ１２０３では取り出したループのｄａｔａ指示をループ表２１０により調べ、ｄａｔａ指示がＬ１またはＬ２ならば、ステップ１２０１へ戻る。これは、このループのデータが既にキャッシュ上にあるため、最適化の効果がないと判断したためである。ステップ１２０４ではループ交換の適用条件を調べ、適用対象ならばステップ１２０５でループ交換を適用する。ステップ１２０６ではループ展開の適用条件を調べ、適用対象ならばステップ１２０７でループ展開を適用する。
【００４７】
本実施例ではループ内のデータが主にキャッシュ上に存在する場合には、不要なループ交換やループ展開を適用しない効果がある。
【００４８】
メモリ最適化５０２において、以上説明したうちの全てまたはいくつかを組み合わせた最適化処理を行ってもよく、いずれか一つの最適化処理を行ってもよい。
【００４９】
【発明の効果】
本発明によれば、プログラム中のデータアクセスが主としてどのメモリ階層をアクセスするかを指定する手段を設けることにより、データがキャッシュ上に存在するときに効果のない最適化適用の抑止、指定されたメモリ階層に応じたメモリレイテンシを用いた命令スケジューリングやプリフェッチ最適化の適用、または／および指定されたメモリ階層に応じたターゲットキャッシュのキャッシュサイズ等のパラメタを用いたタイリングの適用が可能となり、プログラム実行の高速化が図れる。
【図面の簡単な説明】
【図１】本発明の概要を示す図である。
【図２】改良された最適化方法を実施するコンパイラが稼動する計算機システムの構成図。
【図３】プログラム実行時に主としてアクセスするメモリ階層のコンパイラオプションによる指示の例を示す図。
【図４】プログラム実行時に主としてアクセスするメモリ階層の指示文を含むソースプログラムの例を示す図。
【図５】コンパイラの処理手順を示す図。
【図６】ループ表の例を示す図。
【図７】命令スケジューリングの処理手順を示す図。
【図８】ＤＡＧの一例を示す図。
【図９】ＤＡＧエッジのレイテンシ設定の処理手順を示す図。
【図１０】プリフェッチの処理手順を示す図。
【図１１】タイリングの処理手順を示す図。
【図１２】ループ交換およびループ展開の処理手順を示す図。
【図１３】データ指示フィールド設定の処理手順を示す図。
【符号の説明】
２０８・・・コンパイラ、５０２・・・メモリ最適化処理、１０３・・・Ｌ１データ向け最適化、１０４・・・Ｌ２データ向け最適化、１０５・・・主記憶データ向け最適化、３０１・・・メモリ階層指示オプション。
【図１】
2004303113.tif 000003
【図２】
2004303113.tif 000004
【図３】
2004303113.tif 000005
【図４】
2004303113.tif 000006
【図５】
2004303113.tif 000007
【図６】
2004303113.tif 000008
【図７】
2004303113.tif 000009
【図８】
2004303113.tif 000010
【図９】
2004303113.tif 000011
【図１０】
2004303113.tif 000012
【図１１】
2004303113.tif 000013
【図１２】
2004303113.tif 000014
【図１３】
2004303113.tif 000015