(57)【要約】【課題】パイプライン処理されない命令を命令セットに含む計算機で効率的なパイプライン処理が行われないことに起因する性能低下を防ぐこと。【解決手段】第一命令スケジューラ１３０のスケジューリング範囲決定部１３２がパイプライン処理されない命令が平均的に１個含まれる命令数Ｌを計算し、スケジュール部１３３がスケジューリング範囲決定部１３２により計算された命令数Ｌごとの命令群に対して命令スケジューリングを行う。あるいは、パイプライン処理されない命令が含まれるクリティカルパスのレイテンシやパイプライン処理されない命令の出現間隔に基づいてスケジューリング範囲を決定する。【選択図】        図２
2006065682.tif 000002
【特許請求の範囲】
【請求項１】
パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムであって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手順と、
前記スケジューリング範囲決定手順により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手順と、
をコンピュータに実行させることを特徴とするコンパイラプログラム。
【請求項２】
前記スケジューリング範囲決定手順は、パイプライン処理されない命令が平均的に一つ含まれる命令数を命令スケジューリングの対象とする命令群の大きさとすることを特徴とする請求項１に記載のコンパイラプログラム。
【請求項３】
パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムであって、
メモリへ退避する退避変数の選択に使用する退避コストをパイプライン処理されない命令によって定義される変数に対しては他の変数より大きなコストとなるように評価する退避コスト評価手順と、
前記退避コスト評価手順により評価された退避コストに基づいて退避変数を選択する退避変数選択手順と、
をコンピュータに実行させることを特徴とするコンパイラプログラム。
【請求項４】
パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイル方法であって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定工程と、
前記スケジューリング範囲決定工程により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール工程と、
を含んだことを特徴とするコンパイル方法。
【請求項５】
パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラ装置であって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手段と、
前記スケジューリング範囲決定手段により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手段と、
を備えたことを特徴とするコンパイラ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラム、コンパイル方法およびコンパイラ装置に関し、特に、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができ、実行効率の良い目的プログラムを生成することができるコンパイラプログラム、コンパイル方法およびコンパイラ装置に関するものである。
【背景技術】
【０００２】
従来から、目的プログラムの最適化の一部として、命令スケジューラとレジスタ割り付けがある。命令スケジューラは、計算機の演算ユニットを効率的に使用できるように命令列を並べ替える機能であり（例えば、非特許文献１参照。）、特に、命令をパイプラインによって処理する計算機においては、パイプラインの未使用状態が少なくなるように命令の実行順序を入れ替えることが重要になる。
【０００３】
また、レジスタ割り付けは、全ての変数にレジスタを割り当てる機能であるが（例えば、非特許文献２参照。）、一般に、計算機が使用できるレジスタの数は有限であるため、変数が多数存在する場合には、メモリ上に値を待避するコードを出力する必要があり、ここでは、この退避コードの出力もレジスタ割り付けの機能の一つに数える。
【０００４】
一般的に、命令スケジューラは並列性を高めることで性能を良くし、レジスタ割り付けはメモリへの待避命令の数を少なくすることで性能を良くする。しかし、並列性を高くすると足りないレジスタの数が増えてメモリへの待避命令が増え、並列性を低くすれば待避命令は減るものの性能が良くならない（例えば、非特許文献３参照。）。そこで、両者の効果的な運用のために、命令スケジューラをレジスタ割り付けの前後の両方で動作させることが行われている。
【０００５】
【非特許文献１】Ｍｉｋｅ Ｊｏｈｎｓｏｎ著、村上和彰監訳、「スーパースカラ・プロセッサ」、日経ＢＰ出版センター、１０章４節
【非特許文献２】Ａｎｄｒｅｗ Ｗ．Ａｐｐｅｌ著、「ｍｏｄｅｒｎ ｃｏｍｐｉｌｅｒ ｉｍｐｒｅｍｅｎｔａｔｉｏｎ ｉｎ ＭＬ」、Ｃａｍｂｒｉｄｇｅ Ｕｎｉｖ．Ｐｒｅｓｓ、１１章
【非特許文献３】中田育男著、「コンパイラの構成と最適化」、朝倉書店、３６２頁
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、レジスタ割り付け前の命令スケジューラでは、レジスタによる依存関係がないため、対象とする範囲を調整しないと並列度を抽出しすぎて同時に存在する変数の全てをレジスタに割り付けられなくなる可能性がある。
【０００７】
したがって、命令を動かす範囲を広げすぎないように限定することが必要となるが、命令を動かす範囲の最適値はプログラムごとに異なり、最適値を求めることが困難であるという問題がある。すなわち、命令スケジューラによる命令スケジューラとレジスタ割り付けを相互に効果的に機能させることが困難であるという問題がある。
【０００８】
この発明は、上述した従来技術による問題点を解消するためになされたものであり、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができ、実行効率の良い目的プログラムを生成することができるコンパイラプログラム、コンパイル方法およびコンパイラ装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決し、目的を達成するため、請求項１の発明に係るコンパイラプログラムは、パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムであって、命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手順と、前記スケジューリング範囲決定手順により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手順と、をコンピュータに実行させることを特徴とする。
【００１０】
この請求項１の発明によれば、命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定し、決定した大きさの命令群に対して命令スケジューリングを行うよう構成したので、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができる。
【００１１】
また、請求項２の発明に係るコンパイラプログラムは、請求項１の発明において、前記スケジューリング範囲決定手順は、パイプライン処理されない命令が平均的に一つ含まれる命令数を命令スケジューリングの対象とする命令群の大きさとすることを特徴とする。
【００１２】
この請求項２の発明によれば、パイプライン処理されない命令が平均的に一つ含まれる命令数を命令スケジューリングの対象とする命令群の大きさとするよう構成したので、各プログラムに最適な範囲で命令スケジューリングを行うことができる。
【００１３】
また、請求項３の発明に係るコンパイラプログラムは、パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムであって、メモリへ退避する退避変数の選択に使用する退避コストをパイプライン処理されない命令によって定義される変数に対しては他の変数より大きなコストとなるように評価する退避コスト評価手順と、前記退避コスト評価手順により評価された退避コストに基づいて退避変数を選択する退避変数選択手順と、をコンピュータに実行させることを特徴とする。
【００１４】
この請求項３の発明によれば、メモリへ退避する退避変数の選択に使用する退避コストをパイプライン処理されない命令によって定義される変数に対しては他の変数より大きなコストとなるように評価し、評価した退避コストに基づいて退避変数を選択するよう構成したので、パイプライン処理されない命令によって定義される変数が退避変数として選択されることを防ぐことができる。
【００１５】
また、請求項４の発明に係るコンパイル方法は、パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイル方法であって、命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定工程と、前記スケジューリング範囲決定工程により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール工程と、を含んだことを特徴とする。
【００１６】
この請求項４の発明によれば、命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定し、決定した大きさの命令群に対して命令スケジューリングを行うよう構成したので、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができる。
【００１７】
また、請求項５の発明に係るコンパイラ装置は、パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラ装置であって、命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手段と、前記スケジューリング範囲決定手段により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手段と、を備えたことを特徴とする。
【００１８】
この請求項５の発明によれば、命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定し、決定した大きさの命令群に対して命令スケジューリングを行うよう構成したので、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができる。
【発明の効果】
【００１９】
請求項１、４および５の発明によれば、命令スケジューラとレジスタ割り付けを相互に効果的に機能させるので、実行効率の良い目的プログラムを生成することができるという効果を奏する。
【００２０】
また、請求項２の発明によれば、各プログラムに最適な範囲で命令スケジューリングを行うので、実行効率の良い目的プログラムを生成することができるという効果を奏する。
【００２１】
また、請求項３の発明によれば、パイプライン処理されない命令によって定義される変数が退避変数として選択されることを防ぐので、実行効率の良い目的プログラムを生成することができるという効果を奏する。
【発明を実施するための最良の形態】
【００２２】
以下に添付図面を参照して、この発明に係るコンパイラプログラム、コンパイル方法およびコンパイラ装置の好適な実施例を詳細に説明する。
【実施例１】
【００２３】
まず、本実施例１に係るコンパイラ装置によるスケジューリング範囲決定処理の概念について説明する。図１は、本実施例１に係るコンパイラ装置によるスケジューリング範囲決定処理の概念を説明するための説明図である。
【００２４】
同図は、命令スケジューラによるスケジューリング範囲の命令群を示している。同図において、固定部分は命令を動かすことができない命令群であり、スケジュール対象部分が命令を動かすことができる範囲である。すなわち、命令スケジューラは、スケジュール対象部分の命令を動かすことによって命令の実行効率を向上させる。
【００２５】
ここで、スケジュール対象部分の範囲の最適値をどのように求めるかが問題となるが、本実施例１に係るコンパイラ装置では、スケジュール対象部分の範囲の最適値は、パイプライン処理されない命令の数に依存するものとしてスケジューリング範囲を求める。なお、パイプライン処理されない命令としては、浮動小数点除算、平方根演算などの命令がある。
【００２６】
本実施例１に係るコンパイラ装置が、スケジュール対象部分の範囲の最適値をパイプライン処理されない命令の数に基づいて決定する理由は以下のとおりである。命令をパイプラインによって処理するＲＩＳＣ型計算機においては、パイプライン処理されない命令が性能の障害になる。何故ならば、パイプライン処理されない命令同士は並列に実行することができず、なおかつこうした命令は実行が終了するまでに時間がかかるためである。
【００２７】
そこで、命令スケジューラの処理は、パイプライン処理されない命令の待ち時間が少なくなるようにしなければならない。すなわち、命令スケジューラは、パイプライン処理されない命令を実行している間に他のパイプライン処理できる命令を実行するようにスケジュールすることで、効率的に演算ユニットを使用する必要がある。
【００２８】
したがって、パイプライン処理されない命令が多ければ、パイプライン処理されない命令を実行している時間が長くなり、パイプライン処理されない命令を実行している間に実行するパイプライン処理できる命令の数が多く必要となり、スケジュール対象部分を大きくする必要がある。すなわち、スケジュール対象部分の範囲の最適値がパイプライン処理されない命令の数に依存することとなる。
【００２９】
このように、本実施例１に係るコンパイラ装置では、スケジュール対象部分の範囲の最適値がパイプライン処理されない命令の数に依存することを利用して、パイプライン処理されない命令の数が平均的に一つ含まれる命令数をスケジューリング範囲としている。
【００３０】
次に、本実施例１に係るコンパイラ装置の構成について説明する。図２は、本実施例１に係るコンパイラ装置の構成を示す機能ブロック図である。同図に示すように、このコンパイラ装置１００は、入力プログラム解析部１１０と、最適化部１２０と、第一命令スケジューラ１３０と、レジスタ割り付け部１４０と、第二命令スケジューラ１５０と、出力オブジェクト生成部１６０とを有する。
【００３１】
入力プログラム解析部１１０は、原始プログラムを入力して構文解析や意味解析を行う処理部である。最適化部１２０は、命令スケジューリングおよびレジスタ割り付け以外の最適化を行う処理部であり、入力プログラム解析部１１０が解析した結果に対して各種の最適化を行う。
【００３２】
第一命令スケジューラ１３０は、レジスタ割り付け前に命令実行順序の入れ替えを行う処理部であり、基本ブロック解析部１３１と、スケジューリング範囲決定部１３２と、スケジュール部１３３とを有する。
【００３３】
基本ブロック解析部１３１は、最適化部１２０による最適化結果に対して基本ブロックの解析を行う処理部である。ここで、基本ブロックとは、プログラムを分岐や合流のない部分に分割して得られる部分プログラムであり、第一命令スケジューラ１３０は、各基本ブロックに対して命令実行順序の入れ替えを行なう。
【００３４】
スケジューリング範囲決定部１３２は、基本ブロック内で命令スケジューリングを行う単位となる命令群の命令数をパイプライン処理されない命令に基づいて決定する処理部である。具体的には、このスケジューリング範囲決定部１３２は、パイプライン処理されない命令が平均的に一つ含まれる命令数を命令スケジューリングを行う命令数とする。
【００３５】
例えば、対象基本ブロック内に命令が１０００個あり、そのうち１０個のパイプライン処理されない命令があるとする。この場合、平均的に１０００÷１０＝１００個の命令中にパイプライン処理されない命令が１個含まれていると考えることができる。したがって、この場合のスケジューリング範囲は１００命令の命令群となる。
【００３６】
このスケジューリング範囲決定部１３２が、パイプライン処理されない命令が平均的に一つ含まれる命令数を命令スケジューリングを行う命令数とすることによって、命令スケジューリングを各プログラムに最適な範囲で行うことができる。
【００３７】
スケジュール部１３３は、スケジューリング範囲決定部１３２により決定された命令数ごとに基本ブロックを分割し、分割して得られる各命令群ごとに命令スケジューリングを行う処理部である。
【００３８】
レジスタ割り付け部１４０は、第一命令スケジューラ１３０による命令スケジューリング結果に対してレジスタ割り付けを行う処理部であり、レジスタを割り当てることができない変数に対しては、メモリへの退避命令を作成する。このレジスタ割り付け部１４０は、第一命令スケジューラ１３０が各プログラムに最適なスケジューリング範囲を対象として命令スケジューリングを行った結果に対してレジスタを割り付けることによって、並列性とメモリ退避とのバランスのとれた実行効率の良い目的プログラムを作成することができる。
【００３９】
第二命令スケジューラ１５０は、レジスタ割り付け部１４０によるレジスタ割り付け結果に対して再度命令スケジューリングを行う処理部である。この第二命令スケジューラ１５０は、レジスタ割り付けが行われた後であるので、並列性をできるだけ高めるために広い範囲でのスケジューリングを行う。
【００４０】
出力オブジェクト生成部１６０は、第二命令スケジューラ１５０によるスケジューリング結果に対して目的プログラムを生成する処理部である。
【００４１】
次に、本実施例１に係るスケジューリング範囲決定部１３２によるスケジューリング範囲決定処理の処理手順について説明する。図３は、本実施例１に係るスケジューリング範囲決定部１３２によるスケジューリング範囲決定処理の処理手順を示すフローチャートである。
【００４２】
同図に示すように、このスケジューリング範囲決定部１３２は、基本ブロック内の命令数Ｎおよびパイプライン処理されない命令の数Ｍをカウントする（ステップＳ１０１〜ステップＳ１０２）。
【００４３】
そして、パイプライン処理されない命令が平均的に１個含まれる命令数Ｌを計算する。すなわち、Ｌ＝Ｎ／Ｍを計算する（ステップＳ１０３）。そして、スケジューリング範囲をＬ、すなわち、スケジューリングする命令群の命令数をＬとする（ステップＳ１０４）。
【００４４】
このように、スケジューリング範囲決定部１３２が、パイプライン処理されない命令が平均的に１個含まれる命令数Ｌを計算してスケジューリング範囲とすることによって、各プログラムに最適な範囲で命令スケジューリングを行うことができる。
【００４５】
上述してきたように、本実施例１では、第一命令スケジューラ１３０のスケジュール範囲決定部１３２がパイプライン処理されない命令が平均的に１個含まれる命令数Ｌを計算し、スケジュール部１３３がスケジューリング範囲決定部１３２により計算された命令数Ｌごとの命令群に対して命令スケジューリングを行うこととしたので、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができ、実行効率の良い目的プログラムを生成することができる。
【００４６】
なお、本実施例１では、基本ブロックを対象としたリストスケジューリングを行う場合について説明したが、基本ブロックをまたがった広域スケジューリングについては、直列に接続された複数の基本ブロックを一つの命令列として捉えることによって、同様の処理を適用することができる。
【実施例２】
【００４７】
ところで、上記実施例１では、パイプライン処理されない命令が平均的に１個含まれる命令数をスケジューリング範囲とする場合について説明したが、パイプライン処理されない命令についての他の指標を用いてスケジューリング範囲を決定することもできる。そこで、本実施例２では、パイプライン処理されない命令についての他の指標として、命令パスのうちパイプライン処理されない命令を含むクリティカルパスのレイテンシを用いる場合について説明する。
【００４８】
なお、レイテンシとは、ある命令の実行が終了するまでの時間であり、その単位は”サイクル”である。これが大きいほどその命令は“重い”命令ということになり、スケジュールする上での障害となりうる。１サイクルの実時間は、ＣＰＵのクロック数に依存する。
【００４９】
また、クリティカルパスとは、ある基準で決定した命令群に対し、依存のある命令（例えば、ある命令が定義する変数を参照する命令は正依存の関係にある）同士を木構造で図４に示すように繋げた場合に、先頭の命令が実行されてから最後の命令が実行されるまでの全レイテンシが最も大きいパスのことを言う。
【００５０】
図４において、○は命令を示し、○を結ぶ線は命令の依存関係示す。すなわち、ある命令は、その命令の上に接続された命令が実行された後に実行される。基本ブロックを解析すると、このような命令パスが複数得られ、それぞれの命令パスが並列に実行可能となる。本実施例２に係るコンパイル装置は、これらの複数の命令パスのうちパイプライン処理されない命令を含むクリティカルパスのレイテンシを基準としてスケジューリング範囲を決定する。
【００５１】
例えば、対象基本ブロック内にあるパイプライン処理されない命令を含むクリティカルパスのレイテンシが１００であるとする。これはつまり、クリティカルパスを構成する木の頂点命令をパイプラインに投入してから１００サイクル後に、クリティカルパスを構成する全ての命令の実行が完了するという意味である。したがって、この場合のスケジューリング範囲は１００命令を対象とすれば良い。
【００５２】
なお、本実施例２に係るコンパイラ装置は、実施例１に係るコンパイラ装置と同様の機能構成を有し、主にスケジューリング範囲決定部によるスケジューリング範囲決定処理が実施例１に係るコンパイラ装置と異なる。
【００５３】
そこで、スケジューリング範囲決定部によるスケジューリング範囲決定処理について説明する。図５は、本実施例２に係るスケジューリング範囲決定部によるスケジューリング範囲決定処理の処理手順を示すフローチャートである。
【００５４】
同図に示すように、このスケジューリング範囲決定部は、基本ブロック内の命令パスを解析し（ステップＳ２０１）、パイプライン処理されない命令を含むクリティカルパスを特定する（ステップＳ２０２）。
【００５５】
そして、特定したクリティカルパスのレイテンシを算出し（ステップＳ２０３）、算出したレイテンシに基づいてスケジューリング範囲を決定する（ステップＳ２０４）。
【００５６】
このように、スケジューリング範囲決定部が、パイプライン処理されない命令を含むクリティカルパスのレイテンシを基準としてスケジューリング範囲を決定することによって、各プログラムに最適な範囲で命令スケジューリングを行うことができる。
【００５７】
なお、本実施例２に係るコンパイラ装置により生成される目的プログラムの実行性能については、ＳＰＥＣ２０００ベンチマーク（Ｃプログラム１５本、ＦＯＲＴＲＡＮプログラム１０本、Ｃ＋＋プログラム１本)、およびオリジナルのＦＯＲＴＲＡＮ実プログラム９１本で従来のコンパイル装置により生成された目的プログラムと実行性能を比較したところ、本実施例２に係るコンパイラ装置により生成される目的プログラムの実行性能は同等以上となり、最大で５％改善されることを確認することができた。
【００５８】
上述してきたように、本実施例２では、スケジューリング範囲決定部が、パイプライン処理されない命令を含むクリティカルパスのレイテンシを基準としてスケジューリング範囲を決定し、スケジュール部がスケジュール範囲決定部により決定されたスケジューリング範囲に基づいて命令スケジューリングを行うこととしたので、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができ、実行効率の良い目的プログラムを生成することができる。
【実施例３】
【００５９】
本実施例３では、パイプライン処理されない命令についての他の指標として、パイプライン処理されない命令の出現間隔を用いる場合について説明する。例えば、対象基本ブロック内のパイプライン処理されない命令が１００命令おきに存在する場合には、１００命令を同時にスケジュール対象にすることで、パイプライン処理されない命令の待ち時間を有効に使用できることが期待できる。したがって、この場合のスケジューリング範囲は１００命令を対象とすれば良い。
【００６０】
なお、本実施例３に係るコンパイラ装置は、実施例１に係るコンパイラ装置と比較して主にスケジューリング範囲決定部によるスケジューリング範囲決定処理が異なる。そこで、スケジューリング範囲決定部によるスケジューリング範囲決定処理について説明する。図６は、本実施例３に係るスケジューリング範囲決定部によるスケジューリング範囲決定処理の処理手順を示すフローチャートである。
【００６１】
同図に示すように、このスケジューリング範囲決定部は、基本ブロック内のパイプライン処理されない命令の出現間隔を解析し（ステップＳ３０１）、パイプライン処理されない命令の出現間隔の平均値を算出する（ステップＳ３０２）。そして、算出した平均値をスケジューリング範囲として決定する（ステップＳ３０３）。
【００６２】
このように、スケジューリング範囲決定部が、パイプライン処理されない命令の出現間隔の平均値をスケジューリング範囲とすることによって、各プログラムに最適な範囲で命令スケジューリングを行うことができる。
【００６３】
上述してきたように、本実施例３では、スケジューリング範囲決定部が、パイプライン処理されない命令の出現間隔の平均値をスケジューリング範囲として決定し、スケジュール部がスケジュール範囲決定部により決定されたスケジューリング範囲に基づいて命令スケジューリングを行うこととしたので、命令スケジューラとレジスタ割り付けを相互に効果的に機能させることができ、実行効率の良い目的プログラムを生成することができる。
【００６４】
なお、本実施例３では、パイプライン処理されない命令の出現間隔の平均値をスケジューリング範囲とすることとしたが、平均値の代わりに最大値、最小値など他の指標を用いることもできる。
【実施例４】
【００６５】
上記実施例１〜３では、パイプライン処理されない命令に基づいて命令スケジューリングのスケジューリング範囲を決定する場合について説明したが、パイプライン処理されない命令に基づいてレジスタ割り付けを行うことによっても実行効率を向上することができる。具体的には、パイプライン処理されない命令の定義する変数をメモリへの待避対象にしないようにすることによって実行効率を向上することができる。そこで、本実施例４では、パイプライン処理されない命令の定義する変数をメモリへの待避対象にしないようにするコンパイラ装置について説明する。
【００６６】
なお、パイプライン処理されない命令の定義する変数をメモリへの待避対象にしないようにすることによって実行効率を向上することができる理由は以下のとおりである。レジスタ割り付けがパイプライン処理されない命令をメモリに待避する対象に選ぶと、待避命令はパイプライン処理されない命令の実行終了を待たなければならない。ここに逆依存が発生すると、パイプライン処理されない命令の待ち時間を効果的に使うことができない。
【００６７】
なぜなら、逆依存によって、それ以降の命令を待避命令より前に移動することができないため、パイプライン処理されない命令の待ち時間に実行するように配置することができないからである。
【００６８】
なお、逆依存とは、あるレジスタを参照する命令と、同じレジスタを定義する命令との間に生じる依存関係である。例えば
ＳＴＯＲＥ  ｒ１→ｍｅｍｏｒｙ
ＡＤＤ      ｒ２，ｒ３→ｒ１
では、レジスタｒ１について逆依存が発生している。
【００６９】
この例では、命令スケジューラは、プログラムの意味を変えて実行結果を変えることはできないので、命令の順序を逆にすることはできない。したがって、ＡＤＤ命令を、ＳＴＯＲＥ命令の前に移動することはできない。
【００７０】
なお、本実施例４に係るコンパイラ装置は、実施例１に係るコンパイラ装置と同様の機能構成を有し、レジスタ割り付け部がパイプライン処理されない命令に基づいてレジスタ割り付けを行う。そこで、レジスタ割り付け部によるレジスタ割り付け処理について説明する。
【００７１】
レジスタ割り付け部は、同時に値を保持する必要がある変数が、計算機の持つレジスタ数よりも多くなると、どれかの変数をメモリに待避しなければならない。この場合、なるべく待避命令の実行が少ないほど性能が良くなる。したがって、退避される数が少ない変数を退避することが良さそうであるが、必ずしも退避命令が出力される数が少ない変数が良いとは限らない。例えば、１００回通る場所に一つ退避命令を出すより、１回しか通らない場所に１０個退避命令を出した方が性能は良い。
【００７２】
そこで、レジスタ割り付け部は、変数を評価関数に通し、評価関数による点数で対象を決定する。その際、例えば、ループ構造内で参照されている変数は４の重みを掛け、ループが重なるごとに１６、６４、と増やしていく。この結果の点数が低い変数が、待避命令を出した場合のコストが低いと考えることができるので、待避対象に選ぶようにする。
【００７３】
ここで、レジスタ割り付け部は、パイプライン処理されない命令が定義する変数にはさらに重みを３倍する。こうすることで、同じ条件で定義／参照されている変数間では、パイプライン処理されない命令が定義する変数が退避対象となることを避けることができる。なお、評価関数を用いて評価した点数はスピルコスト（退避コスト）という。ここで、スピルは変数をメモリに退避することを意味する。
【００７４】
図７は、本実施例４に係るレジスタ割り付け部によるレジスタ割り付け処理の処理手順を示すフローチャートである。同図に示すように、このレジスタ割り付け部は、まずレジスタの割り付け順序を決定する（ステップＳ４０１）。ここで、レジスタの割り付け順序は、変数の干渉状況などに基づいて割り付けの難しさを基準に決定する。
【００７５】
そして、全ての変数にレジスタを割り付けることができるか否かを判定し（ステップＳ４０２）、割り付けることができれば処理を終了する。一方、全ての変数にレジスタを割り付けることができなければ、割り付け順序にしたがって、レジスタを割り振ってみる（ステップＳ４０３）。ここで、割り振るべきレジスタが存在しない変数をスピル候補と呼ぶこととする。
【００７６】
そして、評価関数を用いて変数を評価したスピルコストに基づく優先順位にしたがってスピル候補から変数を選択し（ステップＳ４０４）、スピル候補から選択した変数よりスピルコストの低い変数をレジスタを割り振られた変数から選択して実スピルリストに登録する（ステップＳ４０５）。ここで、実スピルリストは、メモリに退避することに決定した変数を登録するリストである。
【００７７】
そして、実スピルリストに登録した変数に割り振られていたレジスタをスピル候補から選択した変数に割り振り（ステップＳ４０６）、実スピルリストに登録した変数以外の全変数にレジスタが割り振られたか否かを判定する（ステップＳ４０７）。
【００７８】
その結果、実スピルリストに登録した変数以外の全変数にレジスタが割り振られていない場合には、ステップＳ４０４に戻ってスピル候補から新たな変数を選択して処理を行い、実スピルリストに登録した変数以外の全変数にレジスタが割り振られた場合には、実スピルリストに登録されている全ての変数に対して退避命令を発行し（ステップＳ４０８）、ステップＳ４０１に戻る。
【００７９】
ここで、ステップＳ４０１に戻る理由は、実スピルリストに登録した変数以外の全変数にレジスタが割り振られた場合でも、実際には、一時的に使用されるレジスタなどによってレジスタの割り付けが行えない場合があり、実際に割り付けを行う必要があるためである。
【００８０】
上述してきたように、本実施例４では、レジスタ割り付け部が、パイプライン処理されない命令により定義される変数の重みを重くしてスピルコストを計算し、スピルコストの高い変数はできるだけメモリへの退避を避けることとしたので、パイプライン処理されない命令により定義される変数のメモリの退避に起因する実行効率の低下を防ぐことができる。
【００８１】
なお、本実施例４では、退避対象を選ぶ際の評価関数の重み付けを用いて、パイプライン処理されない命令により定義される変数が退避対象に選ばれないようにする場合について説明したが、退避対象としてパイプライン処理されない命令により定義される変数が選ばれた場合に、別の候補となる変数を選択することで、パイプライン処理されない命令により定義される変数が退避対象に選ばれないようにすることもできる。
【００８２】
なお、本実施例４では、レジスタ割り付け部によるレジスタ割り付けについて説明したが、第一命令スケジューラについては、従来のように予め定められたスケジューリング範囲を用いることも、実施例１〜３のようにパイプライン処理されない命令に基づいてスケジューリング範囲を決定することもできる。
【００８３】
また、本実施例１〜４では、コンパイラ装置について説明したが、このコンパイラ装置が有する構成をソフトウェアによって実現することで、同様の機能を有するコンパイラプログラムを得ることができる。そこで、このコンパイラプログラムを実行するコンピュータシステムについて説明する。
【００８４】
図８は、本実施例１〜４に係るコンパイラプログラムを実行するコンピュータシステムを示す図である。同図に示すように、このコンピュータシステム２００は、本体部２０１と、本体部２０１からの指示により表示画面２０２ａに情報を表示するディスプレイ２０２と、このコンピュータシステム２００に種々の情報を入力するためのキーボード２０３と、ディスプレイ２０２の表示画面２０２ａ上の任意の位置を指定するマウス２０４と、ＬＡＮ２０６または広域エリアネットワーク（ＷＡＮ）に接続するＬＡＮインタフェースと、公衆回線２０７に接続するモデムとを有する。ここで、ＬＡＮ２０６は、他のコンピュータシステム（ＰＣ）２１１、サーバ２１２、プリンタ２１３などとコンピュータシステム２００とを接続している。
【００８５】
また、図９は、図８に示した本体部２０１の構成を示す機能ブロック図である。同図に示すように、この本体部２０１は、ＣＰＵ２２１と、ＲＡＭ２２２と、ＲＯＭ２２３と、ハードディスクドライブ（ＨＤＤ）２２４と、ＣＤ−ＲＯＭドライブ２２５と、ＦＤドライブ２２６と、Ｉ／Ｏインタフェース２２７と、ＬＡＮインタフェース２２８と、モデム２２９とを有する。
【００８６】
そして、このコンピュータシステム２００において実行されるコンパイラプログラムは、フロッピィディスク（ＦＤ）２０８、ＣＤ−ＲＯＭ２０９、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの可搬型記憶媒体に記憶され、これらの記憶媒体から読み出されてコンピュータシステム２００にインストールされる。
【００８７】
あるいは、このコンパイラプログラムは、ＬＡＮインタフェース２２８を介して接続されたサーバ２１２のデータベース、他のコンピュータシステム（ＰＣ）２１１のデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータシステム２００にインストールされる。
【００８８】
そして、インストールされたコンパイラプログラムは、ＨＤＤ２２４に記憶され、ＲＡＭ２２２、ＲＯＭ２２３などを利用してＣＰＵ２２１により実行される。
【００８９】
（付記１）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムであって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手順と、
前記スケジューリング範囲決定手順により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手順と、
をコンピュータに実行させることを特徴とするコンパイラプログラム。
【００９０】
（付記２）前記スケジューリング範囲決定手順は、パイプライン処理されない命令が平均的に一つ含まれる命令数を命令スケジューリングの対象とする命令群の大きさとすることを特徴とする付記１に記載のコンパイラプログラム。
【００９１】
（付記３）前記スケジューリング範囲決定手順は、命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令を含むクリティカルパスのレイテンシに基づいて決定することを特徴とする付記１に記載のコンパイラプログラム。
【００９２】
（付記４）前記スケジューリング範囲決定手順は、命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令の出現間隔に基づいて決定することを特徴とする付記１に記載のコンパイラプログラム。
【００９３】
（付記５）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムであって、
メモリへ退避する退避変数の選択に使用する退避コストをパイプライン処理されない命令によって定義される変数に対しては他の変数より大きなコストとなるように評価する退避コスト評価手順と、
前記退避コスト評価手順により評価された退避コストに基づいて退避変数を選択する退避変数選択手順と、
をコンピュータに実行させることを特徴とするコンパイラプログラム。
【００９４】
（付記６）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手順と、
前記スケジューリング範囲決定手順により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手順と、
をコンピュータに実行させるコンパイラプログラムを記録したことを特徴とするコンピュータ読み取り可能な記録媒体。
【００９５】
（付記７）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイル方法であって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定工程と、
前記スケジューリング範囲決定工程により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール工程と、
を含んだことを特徴とするコンパイル方法。
【００９６】
（付記８）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラ装置であって、
命令の実行順序を入れ替える命令スケジューリングの対象とする命令群の大きさをパイプライン処理されない命令に基づいて決定するスケジューリング範囲決定手段と、
前記スケジューリング範囲決定手段により決定された大きさの命令群に対して命令スケジューリングを行うスケジュール手段と、
を備えたことを特徴とするコンパイラ装置。
【００９７】
（付記９）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイル方法であって、
メモリへ退避する退避変数の選択に使用する退避コストをパイプライン処理されない命令によって定義される変数に対しては他の変数より大きなコストとなるように評価する退避コスト評価工程と、
前記退避コスト評価工程により評価された退避コストに基づいて退避変数を選択する退避変数選択工程と、
を含んだことを特徴とするコンパイル方法。
【００９８】
（付記１０）パイプライン処理されない命令を命令セットに含む計算機で実行される目的プログラムを生成するコンパイラ装置であって、
メモリへ退避する退避変数の選択に使用する退避コストをパイプライン処理されない命令によって定義される変数に対しては他の変数より大きなコストとなるように評価する退避コスト評価手段と、
前記退避コスト評価手段により評価された退避コストに基づいて退避変数を選択する退避変数選択手段と、
を備えたことを特徴とするコンパイラ装置。
【産業上の利用可能性】
【００９９】
以上のように、本発明に係るコンパイラ装置、コンパイル方法およびコンパイラプログラムは、パイプライン処理されない命令を命令セットに含む計算機に有用であり、特に、効率的なパイプライン処理が行われないことに起因する性能低下を解決したい場合に適している。
【図面の簡単な説明】
【０１００】
【図１】本実施例１に係るコンパイラ装置によるスケジューリング範囲決定処理の概念を説明するための説明図である。
【図２】本実施例１に係るコンパイラ装置の構成を示す機能ブロック図である。
【図３】本実施例１に係るスケジューリング範囲決定部によるスケジューリング範囲決定処理の処理手順を示すフローチャートである。
【図４】命令パスを示す図である。
【図５】本実施例２に係るスケジューリング範囲決定部によるスケジューリング範囲決定処理の処理手順を示すフローチャートである。
【図６】本実施例３に係るスケジューリング範囲決定部によるスケジューリング範囲決定処理の処理手順を示すフローチャートである。
【図７】本実施例４に係るレジスタ割り付け部によるレジスタ割り付け処理の処理手順を示すフローチャートである。
【図８】本実施例１〜４に係るコンパイラプログラムを実行するコンピュータシステムを示す図である。
【図９】図８に示した本体部の構成を示す機能ブロック図である。
【符号の説明】
【０１０１】
１００    コンパイラ装置
１１０    入力プログラム解析部
１２０    最適化部
１３０    第一命令スケジューラ
１３１    基本ブロック解析部
１３２    スケジューリング範囲決定部
１３３    スケジュール部
１４０    レジスタ割り付け部
１５０    第二命令スケジューラ
１６０    出力オブジェクト生成部
２００，２１１    コンピュータシステム
２０１    本体部
２０２    ディスプレイ
２０２ａ    表示画面
２０３    キーボード
２０４    マウス
２０６    ＬＡＮ
２０７    公衆回線
２０８    フロッピィディスク
２０９    ＣＤ−ＲＯＭ
２１２    サーバ
２１３    プリンタ
２２１    ＣＰＵ
２２２    ＲＡＭ
２２３    ＲＯＭ
２２４    ハードディスクドライブ
２２５    ＣＤ−ＲＯＭドライブ
２２６    フロッピィディスクドライブ
２２７    Ｉ／Ｏインタフェース
２２８    ＬＡＮインタフェース
２２９    モデム
【図１】
2006065682.tif 000003
【図２】
2006065682.tif 000004
【図３】
2006065682.tif 000005
【図４】
2006065682.tif 000006
【図５】
2006065682.tif 000007
【図６】
2006065682.tif 000008
【図７】
2006065682.tif 000009
【図８】
2006065682.tif 000010
【図９】
2006065682.tif 000011