JP3651774B2 - コンパイラ及びそのレジスタ割付方法 - Google Patents
コンパイラ及びそのレジスタ割付方法 Download PDFInfo
- Publication number
- JP3651774B2 JP3651774B2 JP2000276203A JP2000276203A JP3651774B2 JP 3651774 B2 JP3651774 B2 JP 3651774B2 JP 2000276203 A JP2000276203 A JP 2000276203A JP 2000276203 A JP2000276203 A JP 2000276203A JP 3651774 B2 JP3651774 B2 JP 3651774B2
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- dag
- interference
- instructions
- program
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
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)
Description
【発明の属する技術分野】
本発明は、コンピュータの命令レベル並列アーキテクチャを対象としたレジスタ割付に関する。
【0002】
【従来の技術】
通常、プログラミング言語で記述されたプログラムのソース・コードをコンパイルする際、当該プログラムの最適化を行っており、その最適化の手法の一つとして、当該プログラムにおける命令を実行するレジスタの割付を行っている。このレジスタ割付の手法として、各レジスタに異なる色を割り当て、プログラムの各命令を色分けするイメージでレジスタ割付を実行するカラーリングと呼ばれる手法がある。
【0003】
ところで、今日、コンピュータにおけるハードウェアの高性能化に伴い、マルチプログラミングによる並列処理が一般的となっている。そして、上述したコンパイル時のレジスタ割付においても、プログラムの並列性を反映したレジスタ割付の手法が提案されている。この種の命令レベル並列アーキテクチャを対象としたレジスタ割付では、逆依存の生成による命令間の並列性の低下を抑えることが重要である。
従来のこの種のレジスタ割付手法として、S. S. Pinterらによる並列化干渉グラフを用いたカラーリングの手法がある。本手法は、下記の文献に詳細に記載されている。
文献 S. S. Pinter, Register allocation with Instruction Scheduling: A New Approach, SIGPLAN '93 Conference on PLDI
【0004】
この並列化干渉グラフを用いたグラフカラーリングの手法では、並列に実行される可能性のある命令で用いられる変数間に干渉があるものとみなし、それらの干渉のある変数に異なったレジスタが割り付けられるようにする。この方法によって、並列に実行される命令間の逆依存が除去され、コードの並列性が保証されることとなる。
【0005】
【発明が解決しようとする課題】
上述したように、プログラムの並列性を反映したレジスタ割付の手法として、並列化干渉グラフを用いたグラフカラーリングが存在する。この従来の手法は、並列に実行される可能性のある命令が異なるレジスタを使用するように、すなわち、並列に実行される可能性のある命令で参照される変数どうしに干渉があるものとみなして、グラフカラーリングを行っていた。
【0006】
しかし、この方法では、並列化干渉グラフを用いたグラフカラーリングでは、処理対象であるプログラムにおける命令間の潜在的な並列実行可能性がくまなく考慮されてしまうため、変数間の干渉が莫大になってしまう。そして、変数間の干渉が増大すると、
1.コンパイルに要する時間が増加すること
2.干渉度が実レジスタの数を超えてしまい、スピルコードが必要となること
という問題が発生する。
【0007】
グラフカラーリングにおいて、干渉度が実レジスタの数を超えた場合の対処法としては、スピルコードを生成した後にもう一度干渉グラフを作成してカラーリングをやり直す方法が一般的である。したがって、干渉度が実レジスタの数を超える場合におけるカラーリングの処理コストは非常に大きい。また、プログラムの並列性を考慮したスピルデシジョンは困難である。
【0008】
図19は、上記従来のグラフカラーリングの手法により構築された干渉グラフの例を示す図である。図19(A)に示すDAG(Directed Acyclic Graph)に基づいて、図19(B)の干渉グラフが構築されている。図19(B)に示すように、干渉グラフは、変数間の干渉が膨大となっており、効率的なレジスタ割付の処理が困難となっている。
【0009】
そこで、本発明は、グラフカラーリングにおいて、命令の並列実行可能性を保証したまま、変数間の干渉数を減少させることを目的とする。
また、これにより、命令間の並列性を保証したグラフカラーリングにおいて、コンパイルに要する時間の増大や無駄なスピルコードの生成を回避することを目的とする。
【0010】
【課題を解決するための手段】
かかる目的のもと、本発明は、プログラミング言語で記述されたプログラムのソース・コードを機械語に変換し、プログラムの最適化を行うコンパイラにおいて、処理対象であるプログラムから命令のDAGを構築し、解析するDAG解析部と、この解析結果に基づいて、この命令が使用する変数間における干渉の有無を示す干渉グラフを構築する干渉グラフ構築部と、構築された干渉グラフに基づいて、この命令に対するレジスタ割付を行うグラフ識別部とを備え、この干渉グラフ構築部は、所定の複数の命令が並列に実行されないとこのプログラム全体の実行時間が延びてしまう場合に、この複数の命令が使用する変数を干渉するとみなして干渉グラフを構築する。
これにより、プログラムの並列性を保証する最低限の変数の干渉を干渉グラフに反映させることができる。
【0011】
ここで、この干渉グラフ構築部は、DAGのノードに対して、プログラムの実行時間が最小になるように位相整列順序を決定し、この位相整列順序における各命令の変数の生存区間が重なる場合に、この変数間の干渉を干渉グラフに反映させる。
【0012】
あるいは、この干渉グラフ構築部は、プログラムにおいて並列に実行される可能性のある複数の命令に関して、この複数の命令を並列に実行しない場合であってもこのプログラム全体の実行時間への影響がない場合、この複数の命令が定義する変数は干渉しないものとして前記干渉グラフに反映させる。
【0013】
また、このコンパイラにおいて、DAG解析部は、DAGのノードである命令を深さ優先で探索し、探索結果のリバースポストオーダーを生成し、干渉グラフ構築部は、このリバースポストオーダーに基づいて命令を順次取り出し、取り出した命令で使用されている変数と他の変数との間の干渉を決定し、決定結果を干渉グラフに反映させることにより、干渉グラフを段階的に構築する構成とすることができる。
【0014】
さらに、このコンパイラにおいて、DAG解析部は、DAGを構成するノードである各命令について、実行開始時刻を変更できる自由度と、最早実行開始時刻とを算出し、干渉グラフ構築部は、各命令の自由度及び最早実行開始時刻とに基づいて、各命令の実行開始時刻を決定し、この実行開始時刻に基づいて、各命令で使用されている変数の間の干渉を決定し、決定結果を前記干渉グラフに反映させることにより、干渉グラフを構築する構成とすることができる。
【0015】
さらにまた、このコンパイラにおけるグラフ識別部は、DAG解析部にて構築されたDAGにおける同じパス上で定義される変数に対して同一のレジスタを割り付ける。
【0016】
また、本発明は、入力されたプログラムのソース・コードをコンパイルするコンパイラを備えたコンピュータ装置において、コンパイラは、処理対象であるプログラムから命令のDAGを構築し、解析するDAG解析部と、この解析結果に基づいて、このプログラム全体の実行時間を延ばさないことを条件として、このプログラムの並列性を保証するために必要な、このプログラムの各命令が使用する変数間の干渉を示す干渉グラフを構築する干渉グラフ構築部と、この干渉グラフに基づいて、命令に対するレジスタ割付を行うレジスタ割付部とを備えたことを特徴とする。
【0017】
さらに、このコンピュータ装置は、レジスタ割付部によるレジスタ割付の結果を干渉グラフに記述し、この干渉グラフを出力する出力手段をさらに備える構成とすることができる。
【0018】
また、本発明は、プログラミングの処理効率を向上させるための最適化として、プログラムの各命令に対し、グラフカラーリングによるレジスタ割付を行うレジスタ割付方法において、処理対象であるプログラムから命令のDAGを構築し、解析するステップと、DAGにおける並列化できない最も長い命令列(クリティカルパス)を基準とし、DAGの解析結果に基づいて、所定の複数の命令が並列に実行されないとこのクリティカルパス列が延長されてしまう場合に、この複数の命令が使用する変数を干渉するとみなして干渉グラフを構築するステップと、構築された干渉グラフに基づいて、この命令に対するレジスタ割付を行うステップとを含むことを特徴とする。
【0019】
ここで、DAGを構築し解析するステップは、DAGを構成するノードである命令を深さ優先で探索するステップと、探索結果のリバースポストオーダーを生成するステップとを含む。
また、干渉グラフを構築するステップは、生成されたリバースポストオーダーに基づいてこのDAGから命令を順次取り出し、取り出した命令で使用されている変数と他の変数との間の干渉を決定するステップと、決定された変数間の干渉を干渉グラフに反映させることにより、干渉グラフを段階的に構築するステップとを含む。
【0020】
さらに詳しくは、DAGを構築し解析するステップは、DAGを構成するノードである各命令について、実行開始時刻を変更できる自由度と、最早実行開始時刻とを算出を算出するステップをさらに含む。
また、干渉グラフを構築するステップは、リバースポストオーダーに基づいてこのDAGから取り出した命令に関して、算出された各命令の自由度及び最早実行開始時刻とに基づいて、各命令の実行開始時刻を決定するステップをさらに含む。そして、決定された各命令の実行開始時刻に基づいて、各命令で使用されている変数の間の干渉を決定する。
【0021】
さらにここで、各命令の実行開始時刻を決定するステップは、この命令の自由度及び最早実行開始時刻に基づき、プログラム全体の実行時間を延ばさない範囲でこの命令の実行開始時刻を遅らせた場合に、この命令で使用する関数における他の関数との干渉の数が減るならば、この干渉の数が最も少なくなる時刻をこの命令の実行開始時刻に決定するステップを含む。
【0022】
また、本発明は、上記のレジスタ割付方法を処理対象であるプログラムのコンパイル時における最適化としてコンピュータに実行させるプログラムとして作成し、記憶媒体に格納したり、プログラム伝送装置で配信したりすることにより提供することができる。
【0023】
【発明の実施の形態】
以下、添付図面に示す実施の形態に基づいてこの発明を詳細に説明する。
まず、本発明の概要について説明する。本発明は、コンパイルの対象であるプログラムから命令を実行する順番を示す有指向性グラフであるDAG(Directed Acyclic Graph)を作成し、当該DAGに基づいて各命令が実行時間に影響する度合いを計算する。そして、この情報に基づいて命令を整列し、命令どうしの実行順序を考慮しながら干渉グラフを構築する。すなわち、プログラム全体の実行時間を延ばさないことを条件として最低限度必要な並列性を保証するための干渉を加えた干渉グラフを作成する。
【0024】
これを実現するために、本発明では、DAGのノード(プログラムの各命令)に対して、プログラムの実行時間が最小になるように位相整列順序を決定し、この順序において各命令における変数の生存区間が重なる場合に、その変数間の干渉だけを干渉グラフに反映させるようにする。なお、変数の生存区間とは、当該変数を定義する命令から当該定義において最後に使用する命令までの区間を意味する。例えば、命令Aが変数aを使用し、命令Bが変数bを使用する場合であって、命令A、Bが並列に実行される可能性があるものとする。このとき、所定の位相整列の結果において、命令Bが変数aの生存区間の終了後に実行されるならば、その位相整列順序を用い、変数a、b間の干渉はないものとして干渉グラフを構築する。
【0025】
また、本発明では、プログラム全体の実行時間に影響がない範囲で並列性を放棄する。すなわち、プログラムの重要な部分の並列性を保証するための干渉だけを干渉グラフに反映させるようにする。
【0026】
以上の手法により、本発明では考慮すべき変数間の干渉の数を最小化する。すなわち、プログラム全体の実行速度を落とさないことを考慮しながら命令をソートして実行順序を決定することにより、プログラムの並列性に伴い各命令が持つ実行順序の自由度に基づいて発生する推移的な干渉可能性を除去することが可能になる。これにより、命令間の並列性を保証しながら、干渉の数を大幅に削減することができる。この結果、構成要素のより少ない干渉グラフでグラフカラーリングを行うことができることとなり、計算にようする時間コストを改善することができる。
【0027】
図1は、本発明の実施の形態によるコンパイラにおけるレジスタ割付部の構成を説明する図である。
図1を参照すると、本実施の形態におけるレジスタ割付部10は、DAG解析部11と、干渉グラフ構築部12と、グラフカラーリング部13とを備え、プログラムにおける命令のレジスタ割付を行う。DAG解析部11は、処理対象であるプログラムからDAGを作成し、干渉グラフを作成するために必要な解析を行う。干渉グラフ構築部12は、DAG解析部11の解析結果に基づいて干渉グラフを構築する。グラフカラーリング部13は、干渉グラフ構築部12により構築された干渉グラフをカラーリングしてレジスタの割付を実行する。
【0028】
図1に示すレジスタ割付部10の各構成要素は、コンピュータプログラムにより制御されたCPUにて実現される仮想的なソフトウェアブロックである。CPUを制御する当該コンピュータプログラムはCD−ROMやフレキシブルディスクなどの記憶媒体に格納したり、ネットワークを介して伝送したりすることにより提供される。
【0029】
上記構成において、DAG解析部11は、処理対象であるプログラムからDAGを作成し、ノードである各命令の自由度及び最早実行開始時刻を計算し、さらにDAGを構成するノードに対して深さ優先探索を行い、探索結果に対するリバースポストオーダーを生成する。
図2は、DAG解析部11の動作を説明するフローチャートである。
図2を参照すると、DAG解析部11は、まず処理対象のプログラムからDAGを作成する(ステップ201)。図7にDAGの例を示す。図7において、命令a=f()乃至命令i=f(h)の命令列は、並列化できない最も長い命令列であり、当該DAGのクリティカルパスである。また、命令j=f(a)乃至命令l=f(k)のサブパスは、クリティカルパスにおける命令b=f(a)乃至命令e=f(d)と並列に実行できる命令列である。同様に、命令m=f(b)乃至命令o=f(n)のサブパスは、クリティカルパスにおける命令c=f(b)乃至命令f=f(e,l)と並列に実行できる命令列である。また、命令p=f(k)乃至命令q=f(p)のサブパスは、命令k=f(j)乃至命令g=f(f,o)と並列に実行できる命令列である。
【0030】
次に、作成されたDAGの各ノード(命令)の自由度を計算する(ステップ202)。自由度とは、DAGのクリティカルパスを延ばさずに、当該命令をDAG上でどれだけ移動できるかを表す指標である。言い換えれば、当該命令の実行開始時刻を変更できる度合いである。自由度が低ければ低いほど、命令の位置が固定化されるため、その命令が重要であるとみなすことができる。
各ノードの自由度は、各ノードのトップレベル値とボトムレベル値から計算される。ノードをv、トップレベル値をlt(v)、ボトムレベル値をlb(v)とすると、自由度sl(v)は、
sl(v)=(グラフのクリティカルパスの長さ)−lt(v)−lb(v)
で求められる。なお、各ノードのトッブレベル値lt(v)は、ノードvの実行サイクル数をcy(v)とすると、
で求められる。ここで、pred(v)は、ノードvのプレデセサーの集合である。また、各ノードのボトムレベル値lb(v)は、
で求められる。ここで、succ(v)は、ノードvのサクセサーの集合である。
【0031】
図8は図7に示したDAGにおいて、上式に基づいて算出された各命令の自由度を示す図である。図8を参照すると、クリティカルパスである命令a=f()乃至命令i=f(h)の各命令は自由度が0である。また、命令j=f(a)乃至命令l=f(k)の各命令は自由度が1である。また、命令m=f(b)乃至命令o=f(n)の各命令は自由度が1である。さらにまた、命令p=f(k)乃至命令q=f(p)の各命令は自由度が2である。
【0032】
次に、DAGの各ノード(命令)の最早実行開始時刻を計算する(ステップ203)。最早実行開始時刻とは、最初に実行する命令a=f()から順に命令を実行する場合に、当該命令を実行可能な最も早い時刻(サイクル)である。図9に図7のDAGにおける各ノードの最早実行開始時刻を示す。図9を参照すると、例えば、命令b=f(a)と命令j=f(a)とは、最も早い場合で、命令a=f()の直後に実行されるため、最早実行開始時刻は2である。また、命令m=f(b)は、最も早い場合で、命令b=f(a)の直後に実行できるため、最早実行開始時刻は3である。
【0033】
次に、DAGに対して深さ優先探索を行い、探索結果のリバースポストオーダーを求める(ステップ204)。探索経路が分岐して複数存在する場合は、自由度の高い方向を優先して探索する。すなわち、図9において、命令b=f(a)と命令j=f(a)とは、共に命令a=f()の直後に位置しているが、命令j=f(a)の方が自由度が高いため、優先される。これにより、本ステップで得られるリバースポストオーダーでは、自由度の低いノード(すなわち、より重要な命令)が先に出現することとなる。図10は、図7のDAGを深さ優先で探索して得られたリバースポストオーダーを示す図である。図10の各命令に付された数字は、リバースポストオーダーにおいて出現するノード(命令)の順番を示す。
【0034】
干渉グラフ構築部12は、DAG解析部11により生成されたDAGにおけるノード(命令)のリバースポストオーダー、各命令の自由度及び最早実行開始時刻を用いて、段階的に干渉グラフを構築する。
すなわち、DAGを深さ優先で探索した探索結果のリバースポストオーダーによってソートされた順番で、命令を取り出し、その命令で使用されている変数とその命令よりも前に並んでいる命令で使用されている変数との干渉を調べ、順番に干渉グラフに付け加える。これにより、DAGのノードに対して、プログラムの実行時間が最小になるように各ノードの相対的な順序を示す位相整列順序を決定し、この順序において各命令における変数の生存区間が重なる場合に、その変数間の干渉だけを干渉グラフに反映させることが実現される。
また、所定の命令で使用されている変数とそれ以前に現れた変数との間の干渉を干渉グラフに加える場合に、プログラム全体の実行時間を遅らせない範囲において当該命令の実行開始時間を遅らせることによって、当該命令で定義されている変数と他の変数との生存区間の重なりが減少するならば、当該命令の実行開始時間を遅らせて干渉を削減する。これにより、プログラムの重要な部分の並列性を保証するための干渉だけを干渉グラフに反映させ、プログラム全体の実行時間に影響がない範囲で並列性を放棄することが実現される。
【0035】
図3は、干渉グラフ構築部12の動作を説明するフローチャートである。
図3を参照すると、干渉グラフ構築部12は、まず、DAG解析部11により得られたリバースポストオーダーからノード(命令)を順番に取り出す(ステップ301)。そして、取り出した命令の実行開始時刻を決定し、この決定された実行開始時刻に基づいて、変数間の干渉を決定し、干渉グラフを段階的に作っていく(ステップ302、303)。以上の動作を、リバースポストオーダーにしたがって全ての命令について順次実行する(ステップ302)。
【0036】
図4は、図3のフローチャートにおけるステップ303の動作を詳細に説明するフローチャートである。
図4を参照すると、干渉グラフ構築部12は、DAGのリバースポストオーダーから取り出した命令の実行開始時刻の遅延範囲を計算する(ステップ401)。この命令の実行開始時刻の遅延範囲の計算方法を、図5のフローチャートを参照して説明する。
図5を参照すると、まず、取り出した命令で使用されている変数が、これまでに構築された干渉グラフに既に現れており、その生存区間が決定されているかどうかを判定する(ステップ501)。そして、当該変数の生存区間が決定されていたならば、当該命令の自由度とその生存区間の小さい方を、当該命令における実行開始時刻の遅延範囲とする(ステップ502)。一方、当該変数の生存区間が決定されていない場合は、当該命令の自由度を当該命令における実行開始時刻の遅延範囲とする(ステップ503)。すなわち、変数の生存区間が既に決定されている場合には、その生存区間を延ばさない範囲で当該命令の実行開始時刻を決定することとなる。
【0037】
図4に戻り、干渉グラフ構築部12は、ステップ401で決定された、当該命令における実行開始時刻の遅延範囲において、これまでに決定された変数間の干渉度が減る部分があるかどうかを調べる(ステップ402)。具体的な手法としては、例えば、これまでに構築された干渉グラフに現れている変数に関して生存区間図表を作成しておき、この生存区間図表における該当変数の生存区間と当該命令における実行開始時刻の遅延範囲とを比較する。そして、最早実行開始時刻よりも実行開始時刻を遅らせることによって、生存区間図表に記載された他の変数との干渉が削減されるかどうかを調べる。
【0038】
そして、干渉が減る部分がない場合は、最早実行開始時刻を当該命令の実行開始時刻とする(ステップ403、404)。
一方、干渉が減る部分がある場合は、その時刻を当該命令の実行開始時刻とする(ステップ403、405)。ステップ405において、命令の実行開始時刻を最早実行開始時刻よりも遅らせた場合、当該命令から到達可能であり、かつ当該命令よりも高い自由度を持っている命令に関して、自由度及び最早実行開始時刻を再計算する。この処理は、当該命令を指定してDAG解析部11に処理を渡して行わせても良いし、この再計算を行う機能を干渉グラフ構築部12に設けて行っても良い。
以上のようにして、DAGのリバースポストオーダーから命令を取り出すごとに、その実行開始時刻を決定する。これにより、当該命令が使用している変数と他の変数との干渉を決定し、その結果を干渉グラフに反映させることができる。
【0039】
図11乃至図17は、図10に示したDAGのリバースポストオーダーの順番にノード(命令)を取り出して生存区間図表を作成し、干渉グラフを構築する様子を説明する図である。
図11は、図10の1番目から5番目までの命令が取り出されて処理された結果を示す。ここでは、変数の干渉がないので、全ての命令の実行開始時刻は最早実行開始時刻となる。
【0040】
図12は、図10の6番目から8番目までの命令が取り出されて処理された結果を示す。ここで、6番目から8番目までの各命令は、図5のフローチャートに基づき、自由度1に応じた1サイクル分の実行開始時刻の遅延範囲を持つ。しかしながら、これらの命令の実行開始時刻を遅らせても他の変数との干渉の数は減らないので、各命令の実行開始時刻は最早実行開始時刻となる。
【0041】
図13は、図10の9番目の命令が取り出されて処理された結果を示す。この命令は、図12(a)の全ての変数の生存区間の終了後に実行されるため、変数の干渉はないものとして扱う。したがって、この命令の実行開始時刻は最早実行開始時刻となる。
【0042】
図14は、図10の10番目から12番目までの命令が取り出されて処理された結果を示す。ここでは、10番目乃至12番目の命令は、自由度1に応じた1サイクル分の実行開始時刻の遅延範囲を持つ。しかしながら、10番目及び11番目の命令に関しては、これらの命令の実行開始時刻を遅らせても他の変数との干渉の数は減らないので、各命令の実行開始時刻は最早実行開始時刻となる。一方、12番目の命令に関しては、実行開始時刻を1サイクル遅延させると、変数oの干渉数を削減することができる(図14(b)に示すように、変数fとのみ干渉することとなる)。そこで、当該12番目の命令の実行開始時刻は、最早実行開始時刻よりも1サイクル遅延させる。
【0043】
図15は、図10の13番目の命令が取り出されて処理された結果を示す。この命令が使用する変数は、図14(b)の干渉グラフに現れていないので、変数gと干渉する変数はない。したがって、この命令の実行開始時刻は最早実行開始時刻となる。
【0044】
図16は、図10の14番目と15番目の命令が取り出されて処理された結果を示す。ここでは、14番目の命令は、変数pと干渉する変数l、nの生存区間に応じた1サイクル分の実行開始時刻の遅延範囲を持つ。しかしながら、これらの命令の実行開始時刻を遅らせても他の変数との干渉の数は減らないので、各命令の実行開始時刻は最早実行開始時刻となる。一方、15番目の命令は、自由度2及び変数qと干渉する他の変数の生存区間とに応じて1サイクル分の実行開始時刻の遅延範囲を持つ。そして、この命令の実行開始時刻を1サイクル遅延させると、変数qの干渉数を削減することができる。(図16(b)に示すように、変数gとのみ干渉することとなる)。そこで、当該15番目の命令の実行開始時刻は、最早実行開始時刻よりも1サイクル遅延させる。
なお、当該15番目の命令から到達可能で、この命令よりも大きな自由度を持つ命令は存在しないので、ここでは、自由度の再計算は行わない。
【0045】
図17は、図10の16番目と17番目の命令が取り出されて処理された結果を示す。これらの命令は、図16(a)の全ての変数の生存区間の終了後に順次実行されるため、変数の干渉はないものとして扱う。したがって、この命令の実行開始時刻は最早実行開始時刻となる。
以上のようにして、プログラム全体の実行時間を延ばすことなく、最低限度必要な並列性を保証した上で、変数間の干渉を極力削減した干渉グラフが構築される。
【0046】
グラフカラーリング部13は、グラフ識別部として、上述のようにして干渉グラフ構築部12により構築された干渉グラフを解析し、ノードの識別を行う。そして、この識別結果に基づいてレジスタの割付を実行する。本実施の形態では、レジスタ割付の手法として、各レジスタに割り当てられた色で干渉グラフを彩色(色分け)するイメージで割付を行うグラフカラーリングを行う。グラフカラーリングを行う際には、DAGのサブパスにまたがる逆依存をなるべく少なくする。すなわち、DAGのサブパスへの分岐情報を利用して、同じサブパス上で定義される変数には同じ色が割り当てられるようにする。なお、レジスタ割付の手法としては、本実施の形態に示すグラフカラーリング以外の手法により干渉グラフのノードの識別を行い、レジスタ割付を行う態様を取ることも可能である
【0047】
本実施の形態では、干渉グラフ構築部12により構築された干渉グラフは、上述したように、並列に実行される可能性はあるが、仮に並列に実行されなくてもプログラム全体の実行時間への影響はないような命令における変数の干渉を削減している。これにより、扱うべき変数の干渉度が減少するため高速なグラフカラーリングが可能となっている。しかしながら、干渉度が減少した結果、異なる変数に同じ色を割り当てる(同じレジスタを割り付ける)ことによる逆依存が発生しやすくなっている。この逆依存の発生は、レジスタ割付の後に実行される命令スケジューラの自由度を制限してしまう可能性がある。例えば、高度な中間言語に対する最適化において、低レベルでの命令スケジューラの自由度を残しながらグラフカラーリングによるレジスタの割付を行い、その後に細かなハードウェアリソースを考慮した命令スケジューラを行う場合、逆依存の発生は命令スケジューラにおいて障害となる。
そこで、上記のように、DAGのパス情報(サブパスへの分岐情報)を利用して彩色を行うことにより、逆依存の発生を最低限に抑え、プログラムのコンパイルにおいて、本実施の形態によるレジスタ割付の後に行われる命令スケジューラの自由度を保持することができる。
【0048】
図6は、グラフカラーリング部13の動作を説明するフローチャートである。図6を参照すると、グラフカラーリング部13は、まず干渉グラフ構築部12にて構築された干渉グラフにおける各ノード対の干渉類似度を計算する(ステップ601)。ここで、干渉類似度の計算方法としては、従来からグラフカラーリングにおいて用いられている既存の手法を用いることができる。
【0049】
次に、干渉グラフのノード対における二つのノードがDAG上の同じパスに合ったかどうかをマークする(ステップ602)。そして、干渉グラフにおける各ノード対を類似度によりソートする(ステップ603)。同じ類似度のノード対があった場合は、ステップ602でマークした結果に基づき、DAG上の同じパスにあったものを優先してソートする。
【0050】
次に、ソートされたノード対を先頭から順番に取り出し、ノードどうしのマージを行う(ステップ604)。ここで、ノードマージの手法としては、従来からグラフカラーリングにおいて用いられている既存の手法を用いることができる。
【0051】
最後に、ノード対のマージが行われた干渉グラフに対して、グラフカラーリングを行う(ステップ605)。グラフカラーリングの手法としては、従来から用いられている既存の手法を用いることができる。なお、上述したように、DAGにおける同じサブパス上で定義される変数には同じ色を割り当てる。
【0052】
図18は、図17(b)に示した干渉グラフを対象として、上記のグラフカラーリングによりレジスタ(r1、r2、r3、r4)の割付を行った結果を示す図である。図18において、各ノードに括弧書きで添えられた記号が割り付けられたレジスタを示す。
図18の干渉グラフと、図19に示す従来のグラフカラーリングの手法において構築された干渉グラフとを比較すると、本実施の形態による図18の干渉グラフは、命令の並列実行可能性は十分に保証されながら、変数間の干渉数が劇的に減少していることがわかる。
【0053】
【発明の効果】
以上説明したように、本発明によれば、グラフカラーリングにおいて、命令の並列実行可能性を保証したまま、変数間の干渉数を減少させることができる。
また、これにより、命令間の並列性を保証したグラフカラーリングにおいて、コンパイルに要する時間の増大や無駄なスピルコードの生成を回避することができる。
【図面の簡単な説明】
【図1】 本発明の実施の形態によるコンパイラにおけるレジスタ割付部の構成を説明する図である。
【図2】 本実施の形態におけるDAG解析部の動作を説明するフローチャートである。
【図3】 本実施の形態における干渉グラフ構築部の動作を説明するフローチャートである。
【図4】 図3のフローチャートにおけるステップ303の動作を詳細に説明するフローチャートである。
【図5】 図4のフローチャートにおけるステップ401の動作を詳細に説明するフローチャートである。
【図6】 本実施の形態におけるグラフカラーリング部の動作を説明するフローチャートである。
【図7】 本実施の形態で用いるDAGの構成例を示す図である。
【図8】 図7に示したDAGにおける各命令の自由度を示す図である。
【図9】 図7に示したDAGにおける各命令の最早実行開始時刻を示す図である。
【図10】 図7に示したDAGを深さ優先で探索して得られたリバースポストオーダーを示す図である。
【図11】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、1番目から5番目までの命令が取り出されて処理された結果を示す図である。
【図12】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、6番目から8番目までの命令が取り出されて処理された結果を示す図である。
【図13】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、9番目の命令が取り出されて処理された結果を示す図である。
【図14】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、10番目から12番目までの命令が取り出されて処理された結果を示す図である。
【図15】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、13番目の命令が取り出されて処理された結果を示す図である。
【図16】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、14番目と15番目の命令が取り出されて処理された結果を示す図である。
【図17】 図10に示したDAGのリバースポストオーダーから生存区間図表と干渉グラフとを作成する様子を説明する図であり、16番目と17番目の命令が取り出されて処理された結果を示す図である。
【図18】 図17に示した干渉グラフを対象としてレジスタ割付を行った結果を示す図である。
【図19】 従来のグラフカラーリングの手法により構築された干渉グラフの例を示す図である。
【符号の説明】
10…レジスタ割付部、11…DAG解析部、12…干渉グラフ構築部、13…グラフカラーリング部
Claims (15)
- プログラミング言語で記述されたプログラムのソース・コードを機械語に変換し、プログラムの最適化を行うコンパイラにおいて、
処理対象であるプログラムから命令のDAGを構築し、解析するDAG解析部と、
前記DAG解析部による解析結果に基づいて、前記命令が使用する変数間における干渉の有無を示す干渉グラフを構築する干渉グラフ構築部と、
前記干渉グラフ構築部により構築された干渉グラフに基づいて、前記命令に対するレジスタ割付を行うグラフ識別部とを備え、
前記干渉グラフ構築部は、所定の複数の命令が並列に実行されないと前記プログラム全体の実行時間が延びてしまう場合に、当該複数の命令が使用する変数の干渉を反映させて干渉グラフを構築すること
を特徴とするコンパイラ。 - 前記干渉グラフ構築部は、前記DAGのノードに対して、前記プログラムの実行時間が最小になるように位相整列順序を決定し、当該位相整列順序における各命令の変数の生存区間が重なる場合に、当該変数間の干渉を前記干渉グラフに反映させる、請求項1に記載のコンパイラ。
- 前記干渉グラフ構築部は、前記プログラムにおいて並列に実行される可能性のある複数の命令に関して、当該複数の命令を並列に実行しない場合であっても当該プログラム全体の実行時間への影響がない場合、当該複数の命令が定義する変数が干渉しない干渉グラフを構築する、請求項1に記載のコンパイラ。
- 前記DAG解析部は、
前記DAGを構成するノードである命令を深さ優先で探索し、
探索結果のリバースポストオーダーを生成し、
前記干渉グラフ構築部は、
前記DAG解析部にて生成された前記リバースポストオーダーに基づいて命令を順次取り出し、
取り出した前記命令で使用されている変数と他の変数との間の干渉を決定し、決定結果を前記干渉グラフに反映させることにより、前記干渉グラフを段階的に構築する、
請求項1に記載のコンパイラ。 - 前記DAG解析部は、
前記DAGを構成するノードである各命令について、実行開始時刻を変更できる自由度と、最早実行開始時刻とを算出し、
前記干渉グラフ構築部は、
前記DAG解析部にて算出された各命令の自由度及び最早実行開始時刻とに基づいて、各命令の実行開始時刻を決定し、
決定された各命令の前記実行開始時刻に基づいて、各命令で使用されている変数の間の干渉を決定し、決定結果を前記干渉グラフに反映させることにより、前記干渉グラフを構築する、
請求項1に記載のコンパイラ。 - 前記グラフ識別部は、前記DAG解析部にて構築されたDAGにおける同じパス上で定義される変数に対して同一のレジスタを割り付ける、請求項1に記載のコンパイラ。
- 入力されたプログラムのソース・コードをコンパイルするコンパイラを備えたコンピュータ装置において、
前記コンパイラは、
処理対象であるプログラムから命令のDAGを構築し、解析するDAG解析部と、
前記DAG解析部による解析結果に基づいて、前記DAGのノードに対して前記プログラムの実行時間が最小になるように位相整列順序を決定し、当該位相整列順序において生存区間が重なる変数間の干渉を反映させた干渉グラフを構築する干渉グラフ構築部と、
前記干渉グラフ構築部により構築された干渉グラフに基づいて、前記命令に対するレジスタ割付を行うレジスタ割付実行部とを備えたこと
を特徴とするコンピュータ装置。 - 前記レジスタ割付実行部によるレジスタ割付の結果を前記干渉グラフに記述し、当該干渉グラフを出力する出力手段をさらに備えた、請求項7に記載のコンピュータ装置。
- プログラミングの処理効率を向上させるための最適化として、コンピュータが処理対象のプログラムの各命令に対し、グラフカラーリングによるレジスタ割付を行うレジスタ割付方法において、
前記コンピュータのDAG解析部が、処理対象であるプログラムから命令のDAGを構築し、解析するステップと、
前記コンピュータの干渉グラフ構築部が、前記DAGにおける並列化できない最も長い命令列を基準とし、前記解析の結果に基づいて、所定の複数の命令が並列に実行されないと当該命令列が延長されてしまう場合に、当該複数の命令が使用する変数の干渉を反映させて干渉グラフを構築するステップと、
前記コンピュータのレジスタ割付実行部が、構築された前記干渉グラフに基づいて、前記命令に対するレジスタ割付を行うステップと
を含むことを特徴とするレジスタ割付方法。 - 前記DAGを構築し解析するステップは、
前記コンピュータが、前記DAGを構成するノードである命令を深さ優先で探索するステップと、
前記コンピュータが、探索結果のリバースポストオーダーを生成するステップとを含み、
前記干渉グラフを構築するステップは、
前記コンピュータが、生成された前記リバースポストオーダーに基づいて前記DAGから命令を順次取り出し、取り出した前記命令で使用されている変数と他の変数との間の干渉を決定するステップと、
前記コンピュータが、決定された変数間の干渉を前記干渉グラフに反映させることにより、前記干渉グラフを段階的に構築するステップとを含む、
請求項9に記載のレジスタ割付方法。 - 前記DAGを構築し解析するステップでは、
前記コンピュータが、前記DAGを構成するノードである各命令について、実行開始時刻を変更できる自由度と、最早実行開始時刻とを算出し、
前記干渉グラフを構築するステップでは、
前記コンピュータが、前記リバースポストオーダーに基づいて前記DAGから取り出した命令に関して、算出された各命令の前記自由度及び前記最早実行開始時刻とに基づいて、各命令の実行開始時刻を決定し、決定された各命令の前記実行開始時刻に基づいて、各命令で使用されている変数の間の干渉を決定する、
請求項10に記載のレジスタ割付方法。 - 前記各命令の実行開始時刻を決定するステップでは、前記コンピュータが、前記命令の前記自由度及び前記最早実行開始時刻に基づき、プログラム全体の実行時間を延ばさない範囲で前記命令の実行開始時刻を遅らせた場合に、当該命令で使用する関数における他の関数との干渉の数が減るならば、当該干渉の数が最も少なくなる時刻を当該命令の実行開始時刻に決定する、請求項11に記載のレジスタ割付方法。
- 前記レジスタ割付を行うステップでは、前記コンピュータが、前記DAGの同じパス上で定義される変数に対して同一のレジスタを割り付ける、請求項9に記載のレジスタ割付方法。
- コンピュータに実行させるプログラムを当該コンピュータの入力手段が読取可能に記憶した記憶媒体において、
処理対象であるプログラムから命令のDAGを構築し、解析する処理と、
前記DAGにおける並列化できない最も長い命令列を基準とし、前記解析の結果に基づいて、所定の複数の命令が並列に実行されないと当該命令列が延長されてしまう場合に、当該複数の命令が使用する変数の干渉を反映させて干渉グラフを構築する処理と、
構築された前記干渉グラフに基づいて、前記命令に対するレジスタ割付を行う処理と
を前記コンピュータに実行させるプログラムを記憶した記憶媒体。 - コンピュータに、
処理対象であるプログラムから命令のDAGを構築し、解析する処理と、前記DAGにおける並列化できない最も長い命令列を基準とし、前記解析の結果に基づいて、所定の複数の命令が並列に実行されないと当該命令列が延長されてしまう場合に、当該複数の命令が使用する変数の干渉を反映させて干渉グラフを構築する処理と、構築された前記干渉グラフに基づいて、前記命令に対するレジスタ割付を行う処理とを実行させるプログラムを記憶する記憶手段と、
前記記憶手段から前記プログラムを読み出して当該プログラムを送信する送信手段と
を備えたプログラム伝送装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000276203A JP3651774B2 (ja) | 2000-09-12 | 2000-09-12 | コンパイラ及びそのレジスタ割付方法 |
US09/950,904 US7174546B2 (en) | 2000-09-12 | 2001-09-12 | Compiler and register allocation method |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000276203A JP3651774B2 (ja) | 2000-09-12 | 2000-09-12 | コンパイラ及びそのレジスタ割付方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2002091777A JP2002091777A (ja) | 2002-03-29 |
JP3651774B2 true JP3651774B2 (ja) | 2005-05-25 |
Family
ID=18761713
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000276203A Expired - Fee Related JP3651774B2 (ja) | 2000-09-12 | 2000-09-12 | コンパイラ及びそのレジスタ割付方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US7174546B2 (ja) |
JP (1) | JP3651774B2 (ja) |
Families Citing this family (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7185329B1 (en) * | 2003-03-28 | 2007-02-27 | Applied Micro Circuits Corporation | Use of different color sequences for variables of different sizes and different semantics |
US7469404B2 (en) * | 2004-06-30 | 2008-12-23 | Intel Corporation | Bank assignment for partitioned register banks |
US7774748B1 (en) * | 2004-08-03 | 2010-08-10 | Tensilica, Inc. | System and method for automatic conversion of a partially-explicit instruction set to an explicit instruction set |
US20060200811A1 (en) * | 2005-03-07 | 2006-09-07 | Cheng Stephen M | Method of generating optimised stack code |
CN100414505C (zh) * | 2005-07-08 | 2008-08-27 | 中国科学院计算技术研究所 | 一种基于组合并算法的偏移量分配优化方法 |
US7590977B2 (en) * | 2005-10-13 | 2009-09-15 | International Business Machines Corporation | Method and system for reducing memory reference overhead associated with threadprivate variables in parallel programs |
WO2007056893A1 (en) * | 2005-11-18 | 2007-05-24 | Intel Corporation | Latency hiding of traces using block coloring |
US8037466B2 (en) | 2006-12-29 | 2011-10-11 | Intel Corporation | Method and apparatus for merging critical sections |
JP5165969B2 (ja) * | 2007-08-29 | 2013-03-21 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラムのコンパイルのために変数にレジスタを割り付ける技術 |
JP4571996B2 (ja) * | 2008-07-29 | 2010-10-27 | 富士通株式会社 | 情報処理装置及び処理方法 |
US20100199270A1 (en) * | 2009-01-30 | 2010-08-05 | Ivan Baev | System, method, and computer-program product for scalable region-based register allocation in compilers |
CA2675686C (en) * | 2009-08-27 | 2011-10-11 | Ibm Canada Limited - Ibm Canada Limitee | Object collocation |
JP4806060B2 (ja) * | 2009-09-15 | 2011-11-02 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム |
US8230410B2 (en) * | 2009-10-26 | 2012-07-24 | International Business Machines Corporation | Utilizing a bidding model in a microparallel processor architecture to allocate additional registers and execution units for short to intermediate stretches of code identified as opportunities for microparallelization |
CN101887367B (zh) * | 2010-06-22 | 2013-06-19 | 天津大学 | 一种多级并行化编程方法 |
US8806460B2 (en) | 2012-01-26 | 2014-08-12 | Qualcomm Incorporated | Method and apparatus for avoiding register interference |
US8910134B2 (en) * | 2013-01-03 | 2014-12-09 | Oracle International Corporation | System for applying transformation to improve graph analysis |
US9582255B1 (en) | 2015-08-28 | 2017-02-28 | International Business Machines Corporation | Method of splitting register live ranges |
US9971570B2 (en) | 2015-12-15 | 2018-05-15 | Oracle International Corporation | Automated generation of memory consumption aware code |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4782444A (en) * | 1985-12-17 | 1988-11-01 | International Business Machine Corporation | Compilation using two-colored pebbling register allocation method such that spill code amount is invariant with basic block's textual ordering |
US5920716A (en) * | 1996-11-26 | 1999-07-06 | Hewlett-Packard Company | Compiling a predicated code with direct analysis of the predicated code |
US6077313A (en) * | 1997-10-22 | 2000-06-20 | Microsoft Corporation | Type partitioned dataflow analyses |
US6260190B1 (en) * | 1998-08-11 | 2001-07-10 | Hewlett-Packard Company | Unified compiler framework for control and data speculation with recovery code |
-
2000
- 2000-09-12 JP JP2000276203A patent/JP3651774B2/ja not_active Expired - Fee Related
-
2001
- 2001-09-12 US US09/950,904 patent/US7174546B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2002091777A (ja) | 2002-03-29 |
US7174546B2 (en) | 2007-02-06 |
US20020095668A1 (en) | 2002-07-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3651774B2 (ja) | コンパイラ及びそのレジスタ割付方法 | |
US20110119660A1 (en) | Program conversion apparatus and program conversion method | |
US6381739B1 (en) | Method and apparatus for hierarchical restructuring of computer code | |
US6718541B2 (en) | Register economy heuristic for a cycle driven multiple issue instruction scheduler | |
JP3641997B2 (ja) | プログラム変換装置及び方法並びに記録媒体 | |
US5889999A (en) | Method and apparatus for sequencing computer instruction execution in a data processing system | |
JP4042604B2 (ja) | プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム | |
US5828886A (en) | Compiling apparatus and method for promoting an optimization effect of a program | |
US6973644B2 (en) | Program interpreter | |
JP3190773B2 (ja) | 言語処理プログラムのコンパイル処理方法 | |
JP2921190B2 (ja) | 並列実行方式 | |
JP6141365B2 (ja) | 逐次コンピュータプログラムコードを並列処理する方法及びシステム | |
JP2002116916A (ja) | プログラムの最適化方法及びこれを用いたコンパイラ | |
JPH05257709A (ja) | 並列化判別方法およびそれを用いた並列化支援方法 | |
KR20080093108A (ko) | 프로그램 병렬 실행 시스템 및 방법 | |
US7827542B2 (en) | Compiler apparatus | |
CA2010067C (en) | Reducing pipeline delays in compilers by code hoisting | |
Porpodas | Supergraph-slp auto-vectorization | |
US10013244B2 (en) | Apparatus and method to compile a variadic template function | |
US8117604B2 (en) | Architecture cloning for power PC processors | |
Bahmann et al. | Perfect reconstructability of control flow from demand dependence graphs | |
Dooley et al. | Detecting and using critical paths at runtime in message driven parallel programs | |
Osmialowski | How the Flang frontend works: Introduction to the interior of the open-source fortran frontend for LLVM | |
JP3551352B2 (ja) | ループ分割方法 | |
JP2007108838A (ja) | コンパイル方法及びコンパイル装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20041026 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050118 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20050208 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20050209 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050217 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090304 Year of fee payment: 4 |
|
LAPS | Cancellation because of no payment of annual fees |