(57)【要約】【課題】  ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供する。【解決手段】  図２（ａ）に示す循環路のｓｔ命令に対してｍｏｖ命令を挿入すると、図２（ｂ）のようになる。すなわち、ｓｔ命令の代わりに、ｓｔ命令で用いられている運搬依存の媒介変数であるレジスタｒ１を未使用のレジスタｒ４に置き換えた命令「ｓｔ  （ｒ４），ｒ２」を使用し、元の媒介変数であるレジスタｒ１に格納された値をレジスタｒ４に格納する転送命令「ｍｏｖ  ｒ４，ｒ１」を挿入する。このように、ｍｏｖ命令を循環路根に対して挿入することにより、循環路長が４サイクルの循環路を、循環路長が３サイクルの循環路と、循環路長が１サイクルの循環路との２つに分解することができ、ループ処理の開始間隔を小さくすることができる。【選択図】      図２
2006338616.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換するコンパイラ装置であって、
前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析手段と、
前記中間プログラムを最適化する最適化手段と、
最適化された前記中間プログラムを機械語プログラムに変換する変換手段とを備え、
前記最適化手段は、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なう
ことを特徴とするコンパイラ装置。
【請求項２】
前記最適化手段は、
前記中間プログラム中に存在する命令間のデータ依存グラフを作成し、当該データ依存グラフ中より、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路である循環路を検出する循環路検出部と、
検出された前記循環路に含まれる運搬依存の媒介変数をオペランドの一部とする前記転送命令を挿入する挿入部と、
転送命令挿入後の前記中間プログラムに対してソフトウェアパイプライニングを施すソフトウェアパイプライニング部とを有する
ことを特徴とする請求項１に記載のコンパイラ装置。
【請求項３】
前記挿入部は、
検出された前記循環路における真の依存の依存先であって、かつ、運搬依存かつ逆依存の依存元となっている命令を選択する命令選択部と、
選択された前記命令において使用されている第１のレジスタを第２のレジスタに置き換えることにより、当該命令を置換する命令置換部と、
前記第１のレジスタに格納されている値を前記第２のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有する
ことを特徴とする請求項２に記載のコンパイラ装置。
【請求項４】
前記挿入部は、
検出された前記循環路における真の依存の依存元であって、かつ、運搬依存かつ逆依存の依存先となっている命令を選択する命令選択部と、
選択された前記命令において定義されている第１のレジスタを第２のレジスタに置き換えることにより、当該命令を置換する命令置換部と、
前記第２のレジスタに格納されている値を前記第１のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有する
ことを特徴とする請求項２に記載のコンパイラ装置。
【請求項５】
前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計である循環路長が最大の循環路を検出する
ことを特徴とする請求項２〜４のいずれか１項に記載のコンパイラ装置。
【請求項６】
前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計が最大の循環路を少なくとも１つ検出し、
前記命令選択部は、前記レイテンシの合計が最大の循環路が複数存在する場合には、複数の循環路の運搬依存の依存元または依存先となっている命令のうち、最も多くの循環路の運搬依存の依存元または依存先となっている命令を選択する
ことを特徴とする請求項３または４に記載のコンパイラ装置。
【請求項７】
前記循環路検出部は、資源制約を考慮した前記循環路長が最大の循環路を検出する
ことを特徴とする請求項５または６に記載のコンパイラ装置。
【請求項８】
前記循環路検出部は、２つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路以外の循環路を検出する
ことを特徴とする請求項２〜４のいずれか１項に記載のコンパイラ装置。
【請求項９】
前記循環路検出部は、真の依存の依存元であって、かつ運搬依存かつ逆依存の依存先となっている命令からのレイテンシが、前記転送命令からのレイテンシよりも大きい循環路を検出する
ことを特徴とする請求項２に記載のコンパイラ装置。
【請求項１０】
ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換するコンパイル方法であって、
前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析ステップと、
前記中間プログラムを最適化する最適化ステップと、
最適化された前記中間プログラムを機械語プログラムに変換する変換ステップとを含み、
前記最適化ステップでは、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なう
ことを特徴とするコンパイル方法。
【請求項１１】
コンピュータに、ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換させるコンパイラであって、
前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析ステップと、
前記中間プログラムを最適化する最適化ステップと、
最適化された前記中間プログラムを機械語プログラムに変換する変換ステップとをコンピュータに実行させ、
前記最適化ステップでは、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なう
ことを特徴とするコンパイラ。
【請求項１２】
コンパイラを記録したコンピュータ読取可能な記録媒体であって、
請求項１１に記載のコンパイラを記録した
ことを特徴とするコンピュータ読取可能な記録媒体。
【請求項１３】
並列処理可能なプロセッサ用のプログラムであって、
ループ処理の各イタレーションを並列実行させる命令と、
前記ループ処理に関する依存グラフを作成した場合に、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路を形成する命令に使用されているオペランド間でデータを転送する命令である転送命令とを
プロセッサに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語等の高級言語で記述されたソースプログラムを機械語プログラムに変換するコンパイラ装置に関し、特に、コンパイラ装置によるループ処理の高速化に関する。
【背景技術】
【０００２】
コンパイラは、高級言語で記述されたソースプログラムを機械語の命令列よりなる機械語プログラムに変換する。コンパイラは、機械語プログラムへの変換の際に、機械語プログラムの実行効率を向上させるように命令の順序づけを行なう。これを「命令スケジューリング」という。
【０００３】
また、ループ処理の実行効率を如何に向上させるかは、言語処理系の技術分野において、古くから議論されてきた研究テーマの1つである。一般にループ処理は、ｆｏｒ文、ｗｈｉｌｅ文等の制御文と、０以上の演算式からなるボディとからなり、制御文にて規定された繰り返し条件が満たされるまで、ボディが繰り返し実行されることとなる。こうしたループ処理における実行単位は「イタレーション」と呼ばれ、イタレーションは制御文に示された繰り返し数と同じ数だけ派生することとなる。仮に制御文がボディを１００回繰り返すよう記述されているのなら、当該ボディから１００個のイタレーションが派生することとなる。
【０００４】
ループ処理の実行効率を向上させるには、かかる複数のイタレーションの全部又は一部を並列に実行させればよいことはいうまでもない。イタレーションの並列実行を実現するには、ループ処理のボディに対して、ソフトウェアパイプライニングと呼ばれる最適化手法を施すことが有効であることが、従来知られている（例えば、特許文献１参照。）。
【０００５】
ソフトウェアパイプライニングは、コンパイラがループボディをパイプラインに適合するような機械語命令に翻訳することにより、性能向上を図ろうとする最適化手法である。ソフトウェアパイプライニングがどのように行われるかについて図１８を参照しながら説明する。
【０００６】
図１８（ａ）は、ループボディの一例であり、このボディは命令Ａ、命令Ｂ、命令Ｃからなる。図１８（ｂ）は、図１８（ａ）に示す命令列を並列実行することなく３回繰り返した場合の一例を示す図である。例えば、命令Ａ、命令Ｂ、命令Ｃおよびブランチ命令ｂｒはそれぞれ１サイクルで処理が終了するとした場合には、１回の繰返し処理（イタレーション）に４サイクルを要するため、３回のイタレーションでは、１２サイクルを要することとなる。
【０００７】
これに対し、図１８（ｃ）は、図１８（ａ）に示す命令列の３回のイタレーションをソフトウェアパイプライニングにより最適化し、並列実行した場合の一例を示す図である。この場合、イタレーションを跨って、命令Ｃと命令Ａとを並列実行するようにし、ブランチ命令ｂｒと命令Ｂとを並列実行するように最適化が行なわれている。このため、並列実行しなかった場合に１２サイクルを要していた処理時間を８サイクルまで短縮することができる。
【０００８】
なお、並列実行する命令の組み合わせは、命令間の依存関係や、機械語プログラムが実行されるプロセッサにおいて利用可能なハードウェア資源等により決定される。
【０００９】
また、あるイタレーションの実行を開始してから、次のイタレーションの実行を開始するまでの間隔は「開始間隔」と呼ばれ、この開始間隔が小さいほどループ処理に要する実行サイクル数が小さくなり、ループ処理を高速実行することができる。
【特許文献１】特開平１０−９７４２３号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、プロセッサが利用可能なハードウェア資源の制約が大きい場合には、開始間隔を小さくしたり、命令スケジューリングを適切に行なったりすることが困難であり、実行サイクル数削減の効果が小さいという問題がある。
【００１１】
図１９は、この問題点を説明するための図である。ここでは、図１８（ａ）に示した命令列をソフトウェアパイプライニングにより最適化した結果を示しており、命令Ａおよび命令Ｂは同一のハードウェア資源Ｄを使用するものとする。図１９（ａ）は、ハードウェア資源Ｄが１つしかない場合の最適化の結果を示す図であり、図１９（ｂ）は、ハードウェア資源Ｄが２つある場合の最適化の結果を示す図である。図１９（ａ）に示すように、ハードウェア資源Ｄが１つしかない場合には、命令Ａと命令Ｂとは並列実行することができない。このため、開始間隔を２よりも小さくすることができない。一方、ハードウェア資源Ｄが２つある場合には、図１９（ｂ）に示すように命令Ａおよび命令Ｂを並列実行することができるため、開始間隔を１にすることができる。このように、コンピュータがどのようなアーキテクチャを有するかによって開始間隔には限界が存在する。したがって、ハードウェア資源の制約が理由で開始間隔が大きくなっている場合には、コンパイラによる最適化により開始間隔をこれ以上小さくすることは不可能である。
【００１２】
一方、イタレーションを跨いだ命令間のデータ依存である運搬依存が存在する場合には、開始間隔の最小値は、データ依存関係をグラフ化したデータ依存グラフ中の運搬依存を含む経路のサイクル数の最大値により決定される。このため、開始間隔を当該最大値未満にすることができず、当該最大値が大きいような場合には、ソフトウェアパイプライニングによる実行サイクル数削減の効果が小さいという問題もある。
【００１３】
図２０は、この問題点を説明するための図である。図２０（ａ）は、ループ内の命令間に存在するデータ依存関係をグラフ化したデータ依存グラフを示す図である。図２０（ｂ）は、図２０（ａ）に示したデータ依存グラフに基づいてソフトウェアパイプライニングを行なった結果を示す図である。
【００１４】
ここで、データ依存について簡単に説明するが、データ依存は、「真の依存」、「逆依存」、「出力依存」という３つの依存に分類される。「真の依存」とは、先行する命令が定義した変数を後続する命令が使用する場合の依存関係を示す。「逆依存」とは、先行する命令が使用した変数を後続する命令が定義する場合の依存関係を示す。「出力依存」とは、先行する命令が定義した変数を後続する命令が再定義する場合の依存関係を示す。また、イタレーション間に存在するデータ依存を特に「運搬依存」という。したがって、運搬依存はボディの命令間に存在する依存関係ではない。運搬依存の具体例をいうと、あるイタレーション内の演算式の実行により導かれた値が、次巡以降のイタレーションにより使用されるために現れる依存関係であり、かかる依存関係が存在している場合、定義側の演算式の実行より、参照側の演算式が先行することは許されない。
【００１５】
図２０（ａ）に示すように、ループ内の３つの命令（ｌｄ命令、ａｄｄ命令、ｓｔ命令）間には、真の依存および逆依存が存在する。図中では、真の依存を実線矢印で示し、逆依存を破線矢印で示すこととする。
【００１６】
ここで、「ｌｄ  ｒ０，（ｒ１＋）」は、レジスタｒ１に格納されているアドレスのデータをメインメモリより読み出し、レジスタｒ０に格納した後、レジスタｒ１に格納されている値を１つインクリメントする命令である。「ａｄｄ  ｒ２，ｒ０，ｒ０」は、レジスタｒ０に格納されている値とレジスタｒ０に格納されている値とを加算し、加算結果をレジスタｒ２に格納する命令である。「ｓｔ  （ｒ１），ｒ２」は、レジスタｒ２に格納されている値をレジスタｒ１に格納されているメインメモリのアドレスに格納する命令である。
【００１７】
したがって、ｌｄ命令とａｄｄ命令との間には、レジスタｒ０を媒介変数として真の依存が存在する。すなわち、ｌｄ命令で定義されたレジスタｒ０がａｄｄ命令において参照されている。また、ｌｄ命令の実行を開始してからａｄｄ命令が実行可能になるまでのレイテンシは３サイクルであるものとする。したがって、これらを図中では「３（ｒ０）」と記述することとする。
【００１８】
同様に、ａｄｄ命令とｓｔ命令との間には、レジスタｒ２を媒介変数として真の依存が存在する。また、２命令間のレイテンシは１サイクルであるものとする。したがって、図中では「１（ｒ２）」と記述されている。
【００１９】
さらに、ｓｔ命令とｌｄ命令との間には、レジスタｒ１を媒介変数とした運搬依存かつ逆依存が存在する。すなわち、ｓｔ命令でレジスタｒ１に格納された値が参照されてから、ｌｄ命令でレジスタｒ１に格納された値が１つインクリメントされることによりレジスタｒ１が定義されている。また、本実施の形態では、運搬依存かつ逆依存のデータ依存関係を有する２命令間のレイテンシおよび運搬依存かつ出力依存のデータ依存関係を有する２命令間のレイテンシは各々０サイクルであるものとする。したがって、図中では「０（ｒ１）」と記述されている。
【００２０】
このような運搬依存を含むデータ依存グラフの循環路を考えた場合に、その循環路のサイクル数は４（＝３＋１＋０）サイクルとなる。また、この循環路には運搬依存が１つしか存在しないため依存距離が１である。ここで、「依存距離」とは、運搬依存がイタレーション間に存在する場合、その依存する命令間のイタレーション数の差を示す。したがって、あるイタレーションのｌｄ命令を実行してから次のイタレーションのｌｄ命令を実行するには、図２０（ｂ）に示すように少なくとも４サイクルの開始間隔をあけなければならず、開始間隔は運搬依存を含む依存グラフの循環路のサイクル数よりも短くすることができない。
【００２１】
本発明は、上述の課題を解決するためになされたものであり、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供することを目的とする。
【課題を解決するための手段】
【００２２】
上記目的を達成するために、本発明のある局面に係るコンパイラ装置は、ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換するコンパイラ装置であって、前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析手段と、前記中間プログラムを最適化する最適化手段と、最適化された前記中間プログラムを機械語プログラムに変換する変換手段とを備え、前記最適化手段は、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なうことを特徴とする。具体的には、前記最適化手段は、前記中間プログラム中に存在する命令間のデータ依存グラフを作成し、当該データ依存グラフ中より、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路である循環路を検出する循環路検出部と、検出された前記循環路に含まれる運搬依存の媒介変数をオペランドの一部とする前記転送命令を挿入する挿入部と、転送命令挿入後の前記中間プログラムに対してソフトウェアパイプライニングを施すソフトウェアパイプライニング部とを有することを特徴とする。
【００２３】
ループ処理に対して、転送命令を挿入することにより、元のループ処理におけるデータ依存グラフの閉路を、複数のデータ依存グラフの閉路に分割することができる。このため、元のループ処理におけるデータ依存グラフの閉路のサイクル数の最大値を小さくすることができる可能性がある。そのため、ループ処理における開始間隔を小さくし、ソフトウェアパイプライニングによる最適化を行なった後のループ処理の実行サイクル数を小さくすることができる可能性がある。よって、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供することができる。
【００２４】
例えば、前記挿入部は、検出された前記循環路における真の依存の依存先であって、かつ、運搬依存かつ逆依存の依存元となっている命令を選択する命令選択部と、選択された前記命令において参照されている第１のレジスタを第２のレジスタに置き換えることにより、当該命令を置換する命令置換部と、前記第１のレジスタに格納されている値を前記第２のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有していてもよい。また、前記挿入部は、検出された前記循環路における真の依存の依存元であって、かつ、運搬依存かつ逆依存の依存先となっている命令を選択する命令選択部と、選択された前記命令において定義されている第１のレジスタを第２のレジスタに置き換えることにより、当該命令を置換する命令置換部と、前記第２のレジスタに格納されている値を前記第１のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有していてもよい。
【００２５】
この構成によると、データ依存グラフの閉路において逆依存かつ運搬依存となっている依存関係を分断することにより、配置制約が緩和された新たな循環路を作成することができる。このため、ループ処理の実行サイクル数を小さくすることができる可能性がある。よって、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供することができる。
【００２６】
好ましくは、前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計が最大の循環路を少なくとも１つ検出し、前記命令選択部は、前記レイテンシの合計が最大の循環路が複数存在する場合には、複数の循環路の運搬依存の依存元または依存先となっている命令のうち、最も多くの循環路の運搬依存の依存元または依存先となっている命令を選択する。
【００２７】
このように、最も多くの循環路の運搬依存の依存元または依存先となっている命令を選択した方が、より多くの循環路長を減少させることができる。このため、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができる。また、命令スケジューリングにおける命令の配置制約を緩和することもできる。
【００２８】
また、前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計である循環路長が最大の循環路を検出するようにしてもよい。
【００２９】
循環路における最大循環路長が、ループ処理における開始間隔の最小値を決定する。よって、そのような循環路を検出し、転送命令を挿入することにより、開始間隔を減少させることができる可能性がある。このため、ループ処理における実行サイクル数を削減することができる可能性がある。
【００３０】
好ましくは、前記循環路検出部は、資源制約を考慮した前記循環路長が最大の循環路を検出する。
【００３１】
ハードウェア資源等の資源制約を考慮した上での最大循環路長を有する循環路を検出することにより、真にボトルネックとなっている循環路の循環路長を小さくさせることができる。よって、ループ処理における実行サイクル数を減少させたり、命令スケジューリングにおける命令の配置制約を緩和したりすることができる。
【００３２】
また、２つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路以外の循環路を検出する。
【００３３】
２つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路に対して、転送命令を挿入したとしても、循環路長は短くならず、開始間隔を小さくすることができない。このため、このような循環路に対しては、循環路検出を行なわないようにすることにより、最適化処理の効果を向上させることができる。
【００３４】
また、前記循環路検出部は、真の依存の依存元であって、かつ、運搬依存かつ逆依存となっている命令からのレイテンシが、前記転送命令からのレイテンシよりも大きい循環路を検出することを特徴としてもよい。
【００３５】
転送命令を挿入することにより循環路長が大きくなる循環路を予め除去することができる。よって、高速化効率のよい、循環路の選択が可能となる。
【００３６】
本発明の他の局面に係るプログラムは、並列処理可能なプロセッサ用のプログラムであって、ループ処理の各イタレーションを並列実行させる命令と、前記ループ処理に関する依存グラフを作成した場合に、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路を形成する命令に使用されているオペランド間でデータを転送する命令である転送命令とをプロセッサに実行させるためのプログラムである。
【００３７】
このプログラムは、ループ処理中に転送命令が挿入されているため、転送命令が挿入されていないプログラムに比べ、開始間隔が小さくなっている。よって、非常に高速実行可能なプログラムを提供することができる。
【００３８】
なお、本発明は、このような特徴的な手段を備えるコンパイラ装置として実現することができるだけでなく、コンパイラ装置に含まれる特徴的な手段をステップとするコンパイル方法として実現したり、コンパイル方法に含まれる特長的なステップをコンピュータに実行させるコンパイラとして実現したりすることもできる。そして、そのようなコンパイラは、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００３９】
本発明によると、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置等を提供することができる。
【００４０】
近年、並列化処理可能なプロセッサが増えてきており、また、ループ処理は、プログラム中で頻出する処理でもある。したがって、このようなコンパイラ装置等により作成された機械語プログラムは、高速実行可能であり、その実用的価値は極めて大きい。
【発明を実施するための最良の形態】
【００４１】
以下、図面を参照しながら本発明の実施の形態に係るコンパイラ装置について説明する。
【００４２】
図１は、コンパイラ装置の構成を示す機能ブロック図である。図１（ａ）はコンパイラ装置の全体の構成を示す機能ブロック図であり、図１（ｂ）は、コンパイラ装置の一部であるソフトウェアパイプライニング部の構成を示す機能ブロック図である。
【００４３】
図１（ａ）に示されるように、コンパイラ装置２０２は、Ｃ言語等の高級言語で記述されたソースプログラム２０１を、プロセッサが実行可能な形式の機械語プログラム２０３に変換する装置であり、構文解析部２０４と、最適化部２０５と、出力部２０６とを備えている。本実施の形態では、コンパイラ装置２０２は、複数の命令を並列実行可能なプロセッサをターゲットプロセッサとしている。
【００４４】
構文解析部２０４は、入力されたソースプログラム２０１に対して構文解析処理を行い、中間言語で記述されたプログラム（以下、「中間プログラム」という。）を出力する処理部である。最適化部２０５は、中間プログラムに対して所定の最適化処理を施す処理部である。出力部２０６は、最適化処理が施された後の中間プログラムを機械語プログラム２０３に変換して出力する処理部である。
【００４５】
最適化部２０５は、第１最適化部２０７と、ソフトウェアパイプライニング部２０８と、第２最適化部２０９とを備えている。第１最適化部２０７および第２最適化部２０９で実行される最適化処理は一般的な最適化処理である。ソフトウェアパイプライニング部２０８は、中間プログラムに含まれるループ処理に対してソフトウェアパイプライニング処理を施して最適化する処理部である。
【００４６】
図１（ｂ）に示されるように、ソフトウェアパイプライニング部２０８は、循環路解析部２１１と、命令選択部２１２と、転送命令挿入部２１３と、従来のソフトウェアパイプライニング部２１４とを備えている。
【００４７】
循環路解析部２１１は、中間プログラム中に存在する命令間のデータ依存グラフを作成し、当該データ依存グラフ中から循環路を解析する処理部である。なお、循環路の定義については後述する。命令選択部２１２は、循環路解析部２１１での解析結果に従い、データ依存グラフ中の転送命令を挿入する命令を選択する処理部である。「転送命令」とは、オペランド間でデータを転送可能な命令を示し、一般的には、いわゆるレジスタ間でデータを移動させるｍｏｖ命令が考えられる。転送命令挿入部２１３は、命令選択部２１２で選択された命令に対して転送命令を挿入する処理部である。従来のソフトウェアパイプライニング部２１４は、転送命令が挿入された後の中間プログラムに対して従来と同様のソフトウェアパイプライニング処理を施す処理部である。
【００４８】
なお、コンパイラ装置２０２を構成する各処理部は、コンピュータ上で実行されるプログラムとして実現される。
【００４９】
ここで、以下の説明のために用語の定義を行なう。
（１）循環路
ある命令に関するデータ依存をたどり、最終的にもとの命令に戻るデータ依存グラフの閉路を示す。ただし、同一命令を複数たどらない。
（２）循環路長
循環路におけるデータ依存のレイテンシの合計を示す。
（３）資源制約考慮循環路
資源制約（ハードウェア資源や並列実行可能な命令数）を考慮した循環路を示す。
（４）資源制約考慮循環路長
資源制約考慮循環路におけるデータ依存のレイテンシの合計を示す。
（５）Longest Path
最長の循環路を示す。
（６）資源考慮Longest Path
最長の資源制約考慮循環路を示す。
（７）循環路葉
循環路における真の依存の依存先であって、かつ逆依存の依存元となっている命令を示す。
（８）循環路根
循環路における真の依存の依存元であって、かつ逆依存の依存先となっている命令を示す。
【００５０】
本発明では、循環路または資源制約考慮循環路の循環路葉または循環路根に転送命令を挿入することによりソフトウェアパイプライニングにおける実行性能を向上させることを主眼としている。したがって、ソフトウェアパイプライニング部２０８の実行する処理についてのみ詳細に説明を行なう。コンパイラ装置２０２のその他の処理部は、従来のコンパイラ装置に備えられている処理部と同様の機能を有する。このためその詳細な説明はここでは繰り返さない。
【００５１】
まず、循環路に対して転送命令を挿入することによる作用、効果について説明する。
図２は、循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。
【００５２】
図２（ａ）は、図２０（ａ）に示したデータ依存グラフと同じ循環路であり、ループ内に３つの命令（ｌｄ命令、ａｄｄ命令、ｓｔ命令）が含まれている循環路である。このデータ依存グラフは、循環路長が４サイクルである。一方、図２（ｂ）は、図２（ａ）に示した循環路の循環路葉（ｓｔ命令）に対して転送命令の一種であるｍｏｖ命令を挿入した後の循環路を示している。すなわち、ｓｔ命令の代わりに、ｓｔ命令で用いられている運搬依存の媒介変数であるレジスタｒ１を未使用のレジスタｒ４に置き換えた命令「ｓｔ  （ｒ４），ｒ２」を使用し、元の媒介変数であるレジスタｒ１に格納された値をレジスタｒ４に格納する転送命令「ｍｏｖ  ｒ４，ｒ１」を挿入する。このように、ｍｏｖ命令を循環路葉に対して挿入することにより、循環路長が４サイクルの循環路を、循環路長が３サイクルの循環路（ｌｄ命令とｍｏｖ命令とから構成される循環路）と、循環路長が１サイクルの循環路（ｍｏｖ命令とｓｔ命令とから構成される循環路）との２つに分解することができる。すなわち、転送命令を挿入することにより元々存在した運搬依存を分断している。このように、ある運搬依存を分断することにより、新たな循環路を作成することを、本明細書中では「運搬依存斬り」という。
【００５３】
上述したようにソフトウェアパイプライニングの開始間隔の最小値は、Longest Pathの循環路長により決定される。したがって、図２（ａ）に示す循環路がループ処理におけるLongest Pathであるとした場合には、開始間隔が４であったものを開始間隔３にすることができる。
【００５４】
図３は、転送命令を挿入する前後のソフトウェアパイプライニングを行なった結果を示す図である。図３（ａ）は、転送命令を挿入する前にソフトウェアパイプライニングを行なった結果を示しており、開始間隔は４である。一方、図３（ｂ）は、転送命令を挿入した後にソフトウェアパイプライニングを行なった結果を示しており、開始間隔が３になっている。転送命令を挿入することにより、１イタレーションあたりの実行サイクル数は増加する可能性があるものの、開始間隔が減少するために、ループ全体として見た場合には、実行サイクル数は削減される。この効果は、イタレーションの数が大きいほど大きい。
【００５５】
また、図２に示すように、ｓｔ命令とｌｄ命令との間の依存距離が元々１であったものを２に増やす効果もある。このため、ソフトウェアパイプライニング時における命令の配置制約も緩和される。
【００５６】
図４は、図２（ａ）に示した循環路の循環路根（ｌｄ命令）に対して、ｍｏｖ命令を挿入した後の循環路を示す図である。すなわち、ｌｄ命令の変わりに、ｌｄ命令で用いられている媒介変数であるレジスタｒ１を未使用のレジスタｒ４に置き換えた命令「ｌｄ  ｒ０，（ｒ４＋）」を使用し、レジスタｒ４に格納された値を元の媒介変数であるレジスタｒ１に格納する転送命令「ｍｏｖ  ｒ４，ｒ１」を挿入する。このように、ｍｏｖ命令を循環路根に対して挿入することにより、循環路長が４サイクルの循環路を、循環路長が３サイクルの循環路（ｌｄ命令とｍｏｖ命令とから構成される循環路）と、循環路長が１サイクルの循環路（ｍｏｖ命令とｓｔ命令とから構成される循環路）との２つに分解することができる。
【００５７】
この場合も、図２および図３を用いて説明したように、開始間隔を３にできる可能性がある。
【００５８】
次に、図１（ｂ）に示したソフトウェアパイプライニング部２０８が実行する処理の流れについて説明する。図５は、ソフトウェアパイプライニング部２０８が実行する処理のフローチャートである。循環路解析部２１１は、中間プログラムに含まれるループについて、データ依存グラフを作成し、データ依存グラフに存在する循環路を取得する（Ｓ４００）。次に、命令選択部２１２は、循環路取得処理（Ｓ４００）において取得されたループ内の全ての循環路を集合の要素とする循環路集合に設定する（Ｓ４０１）。命令選択部２１２は、循環路集合に含まれる循環路の中からLongest Pathを求める（Ｓ４０２）。命令選択部２１２は、転送命令を挿入することにより循環路長が大きくなるLongest Pathを循環路集合から除く（Ｓ４０３）。命令選択部２１２は、循環路集合に属するLongest Pathの循環路葉または循環路根から１つ選択する（Ｓ４０４）。転送命令挿入部２１３は選択された循環路葉または循環路根に対して転送命令を挿入する（Ｓ４０５）。従来のソフトウェアパイプライニング部２１４は、転送命令が挿入された後のループ処理に対してソフトウェアパイプライニング処理を実行する（Ｓ４０６）。
【００５９】
上述した図２および図３に示した例は、運搬依存かつ逆依存の依存関係を有するLongest Pathの循環路葉に転送命令を挿入し、ソフトウェアパイプライニングを行なった例を示したものである。また、図４に示した例は、運搬依存かつ逆依存の依存関係を有するLongest Pathの循環路根に転送命令を挿入し、ソフトウェアパイプライニングを行なった例を示したものである。データ依存には、上述のように、真の依存、逆依存および出力依存の３種類が存在する。このため、運搬依存にも同様に真の依存、逆依存および出力依存の３種類が存在する。
【００６０】
以下、運搬依存かつ逆依存の依存関係を有するLongest Pathに転送命令を挿入した場合、運搬依存かつ出力依存の依存関係を有するLongest Pathに転送命令を挿入した場合、および運搬依存かつ真の依存を有するLongest Pathに転送命令を挿入した場合の循環路長の変化について考察する。
【００６１】
［運搬依存かつ逆依存］
図６は、運搬依存かつ逆依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【００６２】
図６（ａ）は、運搬依存かつ逆依存のデータ依存を伴う循環路の一例を示しており、命令Ａ、Ｂ、ＣおよびＤからなる循環路である。また、この循環路では命令Ａを循環路根としており、命令Ｄを循環路葉としている。さらに、循環路葉Ｄと循環路根Ａとの間には運搬依存かつ逆依存のデータ依存が存在するものとする。同図では、実線矢印は真の依存を示しており、破線矢印は逆依存を示している。例えば、命令Ａの実行を開始してから命令Ｂが実行可能になるまでのレイテンシは４サイクルであるものとする。したがって、同図より、この循環路の循環路長は１２サイクルであることが分かる。
【００６３】
図６（ｂ）は、ｍｏｖ命令を図６（ａ）に示した循環路葉Ｄと循環路根Ａ以外の命令に対して挿入した後の循環路を示している。ここでは、命令Ｂまたは命令Ｃに対してｍｏｖ命令を挿入した後の循環路を示している。このように、循環路葉Ｄまたは循環路根Ａ以外の命令にｍｏｖ命令を挿入したとしても、命令Ｄと命令Ａとの間に存在する運搬依存は元のままである。その上、ｍｏｖ命令を挿入することにより、ｍｏｖ命令の実行を開始してから命令Ｃを実行するまでのレイテンシ１サイクルが必要となるため、循環路長が１２から１３に増加している。このため、循環路長を小さくさせることができないため、開始間隔を減少させることができない。
【００６４】
これに対して、図６（ｃ）は、ｍｏｖ命令を図６（ａ）に示した循環路葉Ｄに挿入した後の循環路を示している。この場合には、循環路葉Ｄにｍｏｖ命令を挿入することにより、命令Ｄと命令Ａとの間の運搬依存斬りが行なわれ、依存距離１の１２サイクルの循環路がなくなり、４サイクルの循環路と１サイクルの循環路とに変更されている。このため、図６（ａ）に示した循環路がLongest Pathである場合には、開始間隔を１２サイクルから４サイクルに短縮することができる可能性がある。ただし、ループ内に他の循環路が存在し、その循環路が５サイクル以上の循環路長を有する場合には、その循環路長が開始間隔の最小値となる。また、運搬依存斬りを行なうことにより命令の配置制約の緩和を図ることができる。
【００６５】
図７は、図６（ａ）に示した循環路根Ａの真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の場合に、ｍｏｖ命令を循環路根Ａに挿入した後の循環路を示している。この場合にも、図６（ｃ）と同様に、運搬依存斬りが行なわれ、１２サイクルの循環路がなくなり、４サイクルの循環路と９サイクルの循環路とに分解されている。よって、図６（ａ）に示した循環路がLongest Pathである場合には、開始間隔を１２サイクルから９サイクルに短縮することができる可能性がある。また、命令の配置制約の緩和を図ることもできる。
【００６６】
［運搬依存かつ出力依存］
図８は、運搬依存かつ出力依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【００６７】
図８（ａ）は、運搬依存かつ出力依存のデータ依存を伴う循環路の一例を示しており、ｌｄ命令および２つのａｄｄ命令からなる循環路である。図中では、真の依存を実線矢印で示し、出力依存を破線矢印で示すこととする。
【００６８】
ここで、「ｌｄ  ｒ０，（ｒ１＋）」は、レジスタｒ１に格納されているアドレスのデータをメインメモリより読み出し、レジスタｒ０に格納した後、レジスタｒ１に格納されている値を１つインクリメントする命令である。「ａｄｄ  ｒ２，ｒ０，ｒ０」は、レジスタｒ０に格納されている値とレジスタｒ０に格納されている値とを加算し、加算結果をレジスタｒ２に格納する命令である。「ａｄｄ  ｒ０，ｒ２，ｒ２」は、レジスタｒ２に格納されている値とレジスタｒ２に格納されている値とを加算し、加算結果をレジスタｒ０に格納する命令である。
【００６９】
したがって、「ｌｄ  ｒ０，（ｒ１＋）」と「ａｄｄ  ｒ２，ｒ０，ｒ０」との間には、レジスタｒ０を媒介変数として真の依存が存在する。すなわち、ｌｄ命令で定義されたレジスタｒ０がａｄｄ命令において参照されている。また、ｌｄ命令の実行を開始してからａｄｄ命令が実行可能になるまでのレイテンシは３サイクルであるものとする。したがって、これらを図中では「３（ｒ０）」と記述されている。
【００７０】
同様に、「ａｄｄ  ｒ２，ｒ０，ｒ０」と「ａｄｄ  ｒ０，ｒ２，ｒ２」との間には、レジスタｒ２を媒介変数とした真の依存が存在する。また、２命令間のレイテンシは１サイクルであるものとする。したがって、図中では「１（ｒ２）」と記述されている。
【００７１】
さらに、「ａｄｄ  ｒ０，ｒ２，ｒ２」と「ｌｄ  ｒ０，（ｒ１＋）」との間には、レジスタｒ０を媒介変数とした運搬依存かつ出力依存が存在する。すなわち、ａｄｄ命令でレジスタｒ０に格納される値が定義されてから、ｌｄ命令でレジスタｒ０に格納される値が再定義されている。また、上述のように、本実施の形態では運搬依存時のレイテンシは０サイクルであるものとしている。このため、図中では「０（ｒ０）」と記述されている。
【００７２】
このような運搬依存を含む依存グラフの循環路を考えた場合に、その循環路長は４（＝３＋１＋０）サイクルとなる。また、この循環路には運搬依存が１つしか存在しないため依存距離が１である。
【００７３】
この循環路には、上述の定義に当てはまる循環路根および循環路葉は存在しないが、巡回路葉に相当する命令、すなわち運搬依存の依存元となっている命令にｍｏｖ命令を挿入することを考える。図８（ｂ）は、図８（ａ）に示した循環路において運搬依存の依存元となっている命令「ａｄｄ  ｒ０，ｒ２，ｒ２」にｍｏｖ命令を挿入した後の循環路を示している。すなわち、「ａｄｄ  ｒ０，ｒ２，ｒ２」の代わりに当該ａｄｄ命令で用いられている運搬依存の媒介変数であるレジスタｒ０を未使用のレジスタｒ３に置き換えた命令「ａｄｄ  ｒ３，ｒ２，ｒ２」を使用し、元の媒介変数であるレジスタｒ０に格納された値をレジスタｒ３に格納する転送命令「ｍｏｖ  ｒ３，ｒ０」を挿入する。このように、ｍｏｖ命令を運搬依存の依存元となっている命令「ａｄｄ  ｒ０，ｒ２，ｒ２」に対して挿入することにより、ａｄｄ命令とｌｄ命令との間の運搬依存斬りが行なわれ、依存距離１の循環路がなくなってしまう。
【００７４】
図９は、図８（ａ）に示した循環路において、巡回路根に相当する命令、すなわち運搬依存の依存先となっている命令「ｌｄ  ｒ０，（ｒ１＋）」、にｍｏｖ命令を挿入した後の循環路を示している。すなわち、「ｌｄ  ｒ０，（ｒ１＋）」の代わりに、当該ｌｄ命令で用いられている運搬依存の媒介変数であるレジスタｒ０を未使用のレジスタｒ３に置き換えた命令「ｌｄ  ｒ３，（ｒ１＋）」を使用し、レジスタｒ３に格納された値を元の媒介変数であるレジスタｒ０に格納する転送命令「ｍｏｖ  ｒ０，ｒ３」を挿入する。このように、ｍｏｖ命令を循環路根に対して挿入することにより、ａｄｄ命令とｌｄ命令との間の運搬依存斬りが行なわれ、循環路長が４サイクルの循環路を、依存距離１では循環路長が３サイクルの循環路（ｌｄ命令とｍｏｖ命令とから構成される循環路）と、循環路長が２サイクルの循環路（ｍｏｖ命令と、２つのａｄｄ命令とから構成される循環路）との２つに分解することができる。よって、図８（ａ）に示した循環路がLongest Pathである場合には、開始間隔を３サイクルに短縮することができる可能性がある。
【００７５】
［運搬依存かつ真の依存］
図１０は、運搬依存かつ真の依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【００７６】
図１０（ａ）は、運搬依存かつ真の依存のデータ依存を伴う循環路の一例を示しており、ｍｕｌ命令および２つのａｄｄ命令からなる循環路である。図中では全ての依存関係が真の依存関係であり、それらを実線矢印で示している。
【００７７】
ここで、「ｍｕｌ  ｒ１，ｒ０，ｒ０」は、レジスタｒ０に格納されているデータと、レジスタｒ０に格納されているデータとを乗算し、乗算結果をレジスタｒ１に格納する命令である。「ａｄｄ  ｒ２，ｒ１，ｒ１」は、レジスタｒ１に格納されている値とレジスタｒ１に格納されている値とを加算し、加算結果をレジスタｒ２に格納する命令である。「ａｄｄ  ｒ０，ｒ２，ｒ２」は、レジスタｒ２に格納されている値とレジスタｒ２に格納されている値とを加算し、加算結果をレジスタｒ０に格納する命令である。
【００７８】
したがって、「ｍｕｌ  ｒ１，ｒ０，ｒ０」と「ａｄｄ  ｒ２，ｒ１，ｒ１」との間には、レジスタｒ１を媒介変数として真の依存が存在する。すなわち、ｍｕｌ命令で定義されたレジスタｒ１がａｄｄ命令において参照されている。また、ｍｕｌ命令の実行を開始してからａｄｄ命令が実行可能になるまでのレイテンシは４サイクルであるものとする。したがって、図中では「４（ｒ１）」と記述されている。
【００７９】
同様に、「ａｄｄ  ｒ２，ｒ１，ｒ１」と「ａｄｄ  ｒ０，ｒ２，ｒ２」との間には、レジスタｒ２を媒介変数とした真の依存が存在する。また、２命令間のレイテンシは１サイクルであるものとする。したがって、図中では「１（ｒ２）」と記述されている。
【００８０】
さらに、「ａｄｄ  ｒ０，ｒ２，ｒ２」と「ｍｕｌ  ｒ１，ｒ０，ｒ０」との間には、レジスタｒ０を媒介変数とした運搬依存かつ真の依存が存在する。また、２命令間のレイテンシは、１サイクルであるものとする。したがって、図中では「１（ｒ０）」と記述されている。
【００８１】
このような運搬依存を含む依存グラフの循環路を考えた場合には、その循環路長は６（＝４＋１＋１）サイクルとなる。
【００８２】
この循環路には、上述の定義に当てはまる循環路根および循環路葉は存在しない。すなわち、上述したように全てのデータ依存が真の依存である。したがって、循環路を構成する命令の１つであるｍｕｌ命令に対して、ｍｏｖ命令の挿入を試みる。図１０（ｂ）は、図１０（ａ）に示した循環路にｍｏｖ命令を挿入した後の循環路を示している。すなわち、「ｍｕｌ  ｒ１，ｒ０，ｒ０」の代わりに当該ｍｕｌ命令で用いられている媒介変数であるｒ１を未使用のレジスタｒ３に置き換えた命令「ｍｕｌ  ｒ３，ｒ０，ｒ０」を使用し、レジスタｒ３に格納された値を元の媒介変数であるレジスタｒ１に格納する転送命令「ｍｏｖ  ｒ１，ｒ３」を挿入する。ｍｏｖ命令の実行を開始してからａｄｄ命令が実行可能になるまでのレイテンシは１であるものとする。したがって、転送命令挿入後の循環路長は７（＝４＋１＋１＋１）サイクルとなる。このように、転送命令の挿入を行なっても、循環路長の減少を行なうことができない。むしろ、循環路長が大きくなりコードサイズが増加するのみである。なお、真の依存のみからなる循環路の場合には、どの位置に転送命令を挿入したとしても、循環路長の減少にはつながらない。したがって、このような場合には、最適化の効果を出すことができない。
【００８３】
［２つの命令からなる循環路］
次に、２つの命令からなる循環路に対して転送命令を挿入する場合について考察する。
【００８４】
図１１は、２つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【００８５】
図１１（ａ）は、運搬依存かつ逆依存を伴う循環路の一例を示しており、２つの命令ＡおよびＢからなる循環路である。循環路長は４サイクルとしている。図中では、真の依存を実線矢印で示し、運搬依存かつ逆依存を破線矢印で示している。
【００８６】
図１１（ｂ）は、ｍｏｖ命令を図１１（ａ）に示した循環路根に対して挿入した後の循環路を示している。ｍｏｖ命令を挿入することにより、運搬依存斬りが行なわれる。しかし、循環路長の最大値は４サイクルのままである。したがって、２命令からなる１つの循環路根に対して転送命令を挿入した場合には、開始間隔を短くすることができず、最適化の効果がない。むしろ、ｍｏｖ命令を挿入することにより、機械語プログラム２０３のコードサイズが増加し、実行性能の低下につながる。
【００８７】
一方、図１２は、２つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路を２つ含む場合に、転送命令を挿入した場合の循環路の変化を示した図である。
【００８８】
図１２（ａ）は、運搬依存かつ逆依存のデータ依存を伴う循環路の一例を示しており、命令ＡおよびＢからなる循環路と、命令ＡおよびＣからなる循環路とを示している。図中では、真の依存を実線矢印で示し、運搬依存かつ逆依存を破線矢印で示している。２つの循環路はともに、命令Ａを共通の循環路根とし、循環路長が４サイクルである。
【００８９】
図１２（ｂ）は、ｍｏｖ命令を図１２（ａ）に示した循環路根に挿入した後の循環路を示している。ｍｏｖ命令を挿入することにより、運搬依存斬りが行なわれ、図１２（ａ）に示した循環路が、依存距離１では循環路長が４サイクルの循環路１つと循環路長が１サイクルの循環路２つとに変換される。この場合、循環路長の最大値は４サイクルのままであるため、開始間隔を短縮することができないが、循環路長が４サイクルの循環路の個数が２つから１つに減少している。このため、ソフトウェアパイプライニングにおける配置制約が緩和され、ソフトウェアパイプライニングが成功する蓋然性が向上する。
【００９０】
［資源制約を考慮した循環路］
次に、資源制約を考慮した循環路に転送命令を挿入する場合について考察する。
【００９１】
まず、同じ依存グラフであっても資源制約がない場合とある場合とにおけるLongest Pathを比較する。図１３は、資源制約がない場合とある場合とにおけるLongest Pathの違いを説明するための図である。図１３（ａ）は、資源制約がない場合の循環路を示す図であり、図１３（ｂ）は、資源制約考慮循環路を示す図である。なお、図１３（ａ）および図１３（ｂ）における循環路においては、実線矢印で真の依存を示しており、実線矢印とは逆向きの図示しない運搬依存が必ず存在するものとする。図１３（ａ）に示すように、資源制約がない場合には、命令ｅ、ｆおよびｇからなる循環路がLongest Pathとなり、その循環路長は７サイクルである。
【００９２】
一方、図１３（ｂ）に示す資源制約考慮循環路においては、命令ａ、ｂおよびｃが同一資源ｄを使用し、当該資源ｄは１つしかないものとする。資源制約がない場合には、命令ｓ、ａおよびｅからなる循環路（以下、「循環路ａ」という。）と、命令ｓ、ｂおよびｅからなる循環路（以下、「循環路ｂ」という。）と、命令ｓ、ｃおよびｅからなる循環路（以下、「循環路ｃ」という。）との循環路長は、各々６サイクルである。しかし、上述したように、命令ａ、ｂおよびｃは１つしかない同一資源ｄを使用する。命令ａ、ｂおよびｃの各々の実行を開始してから資源ｄを解放するまでのレイテンシを２サイクルと仮定する。この場合、命令ａ、ｂおよびｃの順に実行順序に優先順位がつけられているものとする。
【００９３】
循環路ａに含まれる命令を実行する際には、資源ｄが使用されていないため、命令ａの実行時には資源の解放待ちをする必要がなく、資源制約考慮循環路長は６（＝４＋２＋０）サイクルとなる。循環路ｂに含まれる命令を実行する際には、命令ｂが実行可能状態になったとしても命令ａが資源を解放するまでの２サイクル待たなければ命令ｂを実行することができない。このため、循環路ｂの資源制約考慮循環路長は８（＝４＋２＋２＋０）サイクルとなる。循環路ｃに含まれる命令を実行する際には、命令ｃが実行可能状態になったとしても命令ａおよび命令ｂが資源を解放するまでの４（＝２＋２）サイクル待たなければ命令ｃを実行することができない。このため、循環路ｃの資源制約考慮循環路長は１０（＝４＋２＋２＋２＋０）サイクルとなる。したがって、資源考慮Longest Pathは循環路ｃとなり、その資源制約考慮循環路長は１０サイクルとなる。
【００９４】
このように、同じ依存グラフであっても資源制約がない場合とある場合とではLongest Pathが異なり、その循環路長も異なる。したがって、資源制約がある場合には、資源制約を考慮したうえでのLongest Path（資源考慮Longest Path）を求めることが必要である。
【００９５】
［Longest Pathを複数含む循環路］
次に、複数のLongest Pathを含む循環路に対して転送命令を挿入する場合について考察する。
【００９６】
図１４は、複数のLongest Pathを含む循環路の循環路葉に対して転送命令を挿入した場合の循環路の変化を示した図である。図１４では、実線矢印で真の依存を示しており、実線矢印とは逆向きの図示しない運搬依存が必ず存在するものとする。
【００９７】
図１４（ａ）は、循環路長が６サイクルのLongest Pathを５つ含む循環路を示した図である。図１４（ａ）では、特に、５つのLongest Pathを太線の実線矢印で示している。図示のように、命令ｂと命令ａとの間に存在する運搬依存は、３つの循環路（命令ａ、ｍおよびｂからなる循環路、命令ａ、ｎおよびｂからなる循環路、命令ａ、ｏおよびｂからなる循環路）に共通する運搬依存である。また、命令ｃと命令ｂとの間に存在する運搬依存は、２つの循環路（命令ｂ、ｐおよびｃからなる循環路、命令ｂ、ｒおよびｃからなる循環路）に共通する運搬依存である。
【００９８】
図１４（ｂ）は、命令ｂと命令ａとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路葉ｂに対してｍｏｖ命令を挿入した後の循環路を示している。太線の実線矢印は、図１４（ａ）に示したLongest Pathが変化した後の循環路を示しており、循環路長が６サイクルの５つのLongest Pathが、依存距離１では循環路長が６サイクルのLongest Path２つと、循環路長が４サイクルの循環路１つと、循環路長が１サイクルの循環路１つとに変換される。
【００９９】
一方、図１４（ｃ）は、命令ｃと命令ｂとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路葉ｃに対してｍｏｖ命令を挿入した後の循環路を示している。太線の実線矢印は、図１４（ａ）に示したLongest Pathが変化した後の循環路を示しており、循環路長が６サイクルの５つのLongest Pathが、依存距離１では循環路長が６サイクルのLongest Path３つと、循環路長が４サイクルの循環路１つと、循環路長が１サイクルの循環路１つとに変換される。
【０１００】
このように、図１４（ｂ）のほうが、図１４（ｃ）に比べて、Longest Pathの数が少なくなっている。よって、循環路葉に対して転送命令を挿入する場合には、より長い循環路を多く持つ循環路葉に対して転送命令を挿入し、運搬依存斬りをした方が、長い循環路長を有する循環路の数を減らすことができる。このため、ソフトウェアパイプライニングにおける命令の配置制約が緩和される。
【０１０１】
図１５は、複数のLongest Pathを含む循環路の循環路根に対して転送命令を挿入した場合の循環路の変化を示した図である。図１５の矢印の意味は、図１４の矢印の意味と同じである。
【０１０２】
図１５（ａ）は、図１４（ａ）に示した循環路の命令ｂと命令ａとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路根ａに対してｍｏｖ命令を挿入した後の循環路を示している。但し、命令ａと命令ｍ，ｎ，ｏとの間の真の依存と命令ｂと命令ａとの間の運搬依存のそれぞれの原因になっているレジスタは同一の場合である。この図によると、循環路長が６サイクルの５つのLongest Pathが、依存距離１では循環路長が６サイクルのLongest Path２つと、循環路長が４サイクルの循環路１つと、循環路長が３サイクルの循環路３つとに変換される。
【０１０３】
一方、図１５（ｂ）は、命令ｃと命令ｂとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路根ｂに対してｍｏｖ命令を挿入した後の循環路を示している。但し、命令ｂと命令ｐ，ｒの間の真の依存と命令ｃと命令ｂの間の運搬依存のそれぞれの原因になっているレジスタは同一の場合である。この図によると、循環路長が６サイクルの５つのLongest Pathが、依存距離１では循環路長が６サイクルのLongest Path３つと、循環路長が４サイクルの循環路１つと、循環路長が３サイクルの循環路２つとに変換される。
【０１０４】
このように、図１５（ａ）の方が、図１５（ｂ）に比べて、Longest Pathの数が少なくなっている。よって、循環路根に対して転送命令を挿入する場合には、より長い循環路を多く持つ循環路根に対して転送命令を挿入し、運搬依存斬りをした方が、長い循環路長を有する循環路の数を減らすことができる。その結果、ソフトウェアパイプライニングにおける命令の配置制約が緩和される。
【０１０５】
［運搬依存が複数ある循環路］
図１６は、運搬依存が複数ある循環路に対して転送命令を挿入した場合の循環路の変化を示した図である。図中、真の依存を実線矢印で示し、運搬依存かつ逆依存を破線矢印で示している。
【０１０６】
図１６（ａ）は、２つの運搬依存を含む循環路を示し、より具体的には、命令ｃと命令ｂとの間および命令ｂと命令ａとの間に各々運搬依存を有する循環路を示している。この循環路の循環路長は図示のように１６サイクルである。
【０１０７】
図１６（ｂ）は、図１６（ａ）に示した循環路の循環路根ａにｍｏｖ命令を挿入した後の循環路を示しており、依存距離２の循環路長１６サイクルの循環路が依存距離２では循環路長１３サイクルの循環路と循環路長４サイクルの循環路とに分解される。但し、命令ａと命令ｄの間の真の依存と命令ｂと命令ａの間の運搬依存のそれぞれの原因になっているレジスタは同一の場合である。このように、循環路長の短縮が行なわれるため、ソフトウェアパイプライニングにおける命令の配置制約を緩和することができる。
【０１０８】
一方、図１６（ｃ）は、図１６（ａ）に示した循環路の循環路葉ｃにｍｏｖ命令を挿入した後の循環路を示しており、依存距離２の循環路長１６サイクルの循環路が無くなる。このように、ソフトウェアパイプライニングにおける命令の配置制約が緩和される。
【０１０９】
以上説明したように、本発明によると、運搬依存かつ逆依存を少なくとも１つ含む循環路において、循環路根または循環路葉に転送命令を挿入することにより、循環路長を小さくしたり、ソフトウェアパイプライニング時の命令の配置制約を緩和したりすることができる。このため、Longest Pathまたは資源考慮Longest Pathの循環路長を小さくでき、かつループ処理の開始間隔を小さくできる場合には、高速化効率の良いソフトウェアパイプライニングを行なうことができる。
【０１１０】
以上、本発明の実施の形態に係るコンパイラ装置について説明したが、本発明は、この実施の形態に限定されるものではない。
【０１１１】
例えば、本運搬依存斬りを同一ループに対して複数回適用すると、より高速化効率の良いソフトウェアパイプライニングを行うことができる。
【０１１２】
例えば、循環路集合の除去処理（図５のＳ４０３）において、循環路根からのレイテンシが転送命令によるレイテンシ以下である循環路を除去するようにしてもよい。このようにすることにより、転送命令を挿入することにより、循環路長が大きくなる循環路を予め除去することができる。よって、高速化効率の良い、循環路の選択が可能となる。
【０１１３】
また、図２〜図４に示した例では、循環路葉または循環路根において、真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが異なる場合について説明を行なったが、２つのレジスタが同一のレジスタであってもよい。図１７は、循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。
【０１１４】
図１７（ａ）に示す循環路は、３つの命令（ｌｄｍ命令、ａｄｄ命令およびｓｔｍ命令）を含む循環路である。この循環路においては、真の依存の媒介変数であるレジスタと運搬依存かつ逆依存の媒介変数であるレジスタとが、ともにレジスタｒ１である。図１７（ｂ）は、図１７（ａ）に示した循環路の循環路根（ｌｄｍ命令）に対してｍｏｖ命令を挿入した後の循環路を示している。すなわち、ｌｄｍ命令の変わりに、ｌｄｍ命令で用いられている運搬依存の媒介変数であるレジスタｒ１を未使用のレジスタｒ６に置き換えた命令「ｌｄｍ  ｒ０：ｒ６，（ｒ２＋）」が使用され、レジスタｒ６に格納された値を元の媒介変数であるレジスタｒ１に格納する転送命令「ｍｏｖ  ｒ１，ｒ６」が挿入される。このように、ｍｏｖ命令を循環路根に対して挿入することにより、循環路長が４サイクルの循環路を、循環路長が３サイクルの循環路と、循環路長が２サイクルの循環路との２つに分解することができる。この場合は、開始間隔を３にできる可能性がある。
【産業上の利用可能性】
【０１１５】
本発明は、並列処理可能なプロセッサをターゲットプロセッサとするコンパイラ等に適用できる。
【図面の簡単な説明】
【０１１６】
【図１】コンパイラ装置の構成を示す機能ブロック図である。
【図２】循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。
【図３】転送命令を挿入する前後のソフトウェアパイプライニングを行なった結果を示す図である。
【図４】図２（ａ）に示した循環路の循環路根（ｌｄ命令）に対して、ｍｏｖ命令を挿入した後の循環路を示す図である。
【図５】ソフトウェアパイプライニング部が実行する処理のフローチャートである。
【図６】運搬依存かつ逆依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【図７】図６（ａ）に示した循環路根Ａの真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の場合に、ｍｏｖ命令を循環路根Ａに挿入した後の循環路を示す図である。
【図８】運搬依存かつ出力依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【図９】図８（ａ）に示した循環路にｍｏｖ命令を挿入した後の循環路を示す図である。
【図１０】運搬依存かつ真の依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【図１１】２つの命令からなる循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
【図１２】２つの命令からなる循環路を２つ含み場合に、転送命令を挿入した場合の循環路の変化を示した図である。
【図１３】資源制約がない場合とある場合とにおけるLongest Pathの違いを説明するための図である。
【図１４】複数のLongest Pathを含む循環路の循環路葉に対して転送命令を挿入した場合の循環路の変化を示した図である。
【図１５】複数のLongest Pathを含む循環路の循環路根に対して転送命令を挿入した場合の循環路の変化を示した図である。
【図１６】運搬依存が複数ある循環路に対して転送命令を挿入した場合の循環路の変化を示した図である。
【図１７】循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。
【図１８】ソフトウェアパイプライニングを説明するための図である。
【図１９】従来の問題点を説明するための図である。
【図２０】従来の問題点を説明するための図である。
【符号の説明】
【０１１７】
２０１  ソースプログラム
２０２  コンパイラ装置
２０３  機械語プログラム
２０４  構文解析部
２０５  最適化部
２０６  出力部
２０７  第１最適化部
２０８  ソフトウェアパイプライニング部
２０９  第２最適化部
２１１  循環路解析部
２１２  命令選択部
２１３  転送命令挿入部
２１４  従来のソフトウェアパイプライニング部
【図１】
2006338616.tif 000003
【図２】
2006338616.tif 000004
【図３】
2006338616.tif 000005
【図４】
2006338616.tif 000006
【図５】
2006338616.tif 000007
【図６】
2006338616.tif 000008
【図７】
2006338616.tif 000009
【図８】
2006338616.tif 000010
【図９】
2006338616.tif 000011
【図１０】
2006338616.tif 000012
【図１１】
2006338616.tif 000013
【図１２】
2006338616.tif 000014
【図１３】
2006338616.tif 000015
【図１４】
2006338616.tif 000016
【図１５】
2006338616.tif 000017
【図１６】
2006338616.tif 000018
【図１７】
2006338616.tif 000019
【図１８】
2006338616.tif 000020
【図１９】
2006338616.tif 000021
【図２０】
2006338616.tif 000022