次に、本発明の実施の形態について図面を参照して詳細に説明する。
《第1の実施の形態》
図1−1を参照すると、本発明の第1の実施の形態にかかるプログラム並列化装置100は、図示しない逐次コンパイラによって生成された機械語命令形式の逐次処理プログラム101を入力し、マルチスレッド型並列プロセッサ向けの並列化プログラム103を生成し出力する装置であり、入力となる逐次処理プログラム101を記憶する磁気ディスク等の記憶装置102と、出力となる並列化プログラム103を記憶する磁気ディスク等の記憶装置104と、逐次処理プログラム101を並列化プログラム103に変換する過程で生成される各種のデータを記憶する磁気ディスク等の記憶装置105と、逐次処理プログラム101を並列化プログラム103に変換する過程で使用する予め定められた各種のデータを記憶する磁気ディスク等の記憶装置106と、これらの記憶装置102、104、105および106に接続された中央処理装置等の処理装置107とで構成されている。また処理装置107は、フォーク箇所決定部110と、フォーク箇所組合せ決定部120と、並列化プログラム出力部130とを備えている。
このようなプログラム並列化装置100は、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスクなどのコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にフォーク箇所決定部110、フォーク箇所組合せ決定部120および並列化プログラム出力部130といった機能手段を実現する。
フォーク箇所決定部110は、記憶装置102の記憶部101Mから逐次処理プログラム101を入力して解析し、並列化により適した逐次処理プログラムおよびフォーク箇所の集合を決定し、処理結果を中間データ141として記憶装置105の記憶部141Mに書き出す。好ましくは、フォーク箇所決定部110は、逐次処理プログラム101の一部の命令列をその命令列と等価な他の命令列にプログラム変換した少なくとも1つの逐次処理プログラムを生成し、逐次処理プログラム101およびプログラム変換によって生成した逐次処理プログラム毎に、予め定められたフォーク箇所条件を満たすフォーク箇所の集合及びそのフォーク箇所集合の並列実行性能の指標となる値を求め、並列実行性能の指標となる値が最も優れているフォーク箇所の集合および逐次処理プログラムを選択する。さらに好ましくは、この選択したフォーク箇所の集合に含まれるフォーク箇所のうち、記憶装置106の記憶部151Mに予め記憶された静的足切り条件151を満たす静的ブースト値を持つものを集合中から取り除く。このフォーク箇所決定部110で決定されるフォーク箇所の集合には、互いに同時に実行できない排他関係にあるフォーク箇所が含まれる。
上記のプログラム変換の例として、逐次処理プログラムの命令の並べ替え、レジスタ割当の変更、或いはそれらの組合せがある。
上記のフォーク箇所条件として、「プログラム中のある区間をBとすると、Bの出口で生存するレジスタに対して、B内で書き込みを行っていない場合、その区間の入口をフォーク元ポイント、出口をフォーク先ポイントとする」なる条件(以下、フォーク箇所条件1と称す)を採用することができる。また、フォーク箇所条件1より条件を緩和し、「プログラム中のある区間Bにおいて、Bの入口で生存(alive)するレジスタをAh、出口で生存するレジスタをAtとするとき、Ah⊇Atで、出口で生存するレジスタと、対応する入口のレジスタの値が一致するとき、入口をフォーク元ポイント、出口をフォーク先ポイントとする」なる条件(以下、フォーク箇所条件2と称す)を採用するようにしてもよい。
上記の並列実行性能の指標となる値としては、フォーク箇所の集合に含まれる各フォーク箇所の静的ブースト値の合計値、或いは、フォーク箇所の集合に含まれるフォーク箇所の総数を用いることができる。フォーク箇所の静的ブースト値は、フォーク箇所のフォーク元ポイントからフォーク先ポイントまでの全命令の重みの合計値を意味する。命令の重みは、実行サイクル数が多い命令ほど大きな値とされる。
フォーク箇所組合せ決定部120は、中間データ141を入力し、フォーク箇所決定部110により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定し、処理結果を中間データ142として記憶装置105の記憶部142Mに書き出す。好ましくは、フォーク箇所組合せ決定部120は、フォーク箇所決定部110で決定された並列化により適した逐次処理プログラムを記憶装置106の記憶部152Mに予め記憶された入力データ152の下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎に以下の処理a〜cを実行することにより、フォーク箇所決定部110が決定したフォーク箇所の集合に含まれるフォーク箇所のうち当該分割区間において出現するフォーク箇所の集合からフォーク箇所の最適な組合せを求め、最後に各分割区間でのフォーク箇所の最適な組合せを1つに統合する。
a)フォーク箇所決定部110により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。
動的ブースト値は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がn回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がC1、C2、…、CNであった場合、その合計の実行サイクル数のことを意味する。
最小実行サイクル数は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がn回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がC1、C2、…、CNであった場合、そのn個中での最小の実行サイクル数を意味する。
或るフォーク箇所の排他フォーク集合とは、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を意味する。
b)フォーク箇所決定部110により決定されたフォーク箇所の集合に含まれるフォーク箇所のうち、その動的ブースト値が記憶装置106の記憶部153Mに予め記憶された動的足切り条件153を満たすフォーク箇所を取り除く。
c)上記bの動的足切り処理後のフォーク箇所の集合に含まれるフォーク箇所のうち、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる組合せを生成する。また好ましくは、この生成した組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する。
並列化プログラム出力部130は、中間データ141および中間データ142を入力し、フォーク箇所組合せ決定部120が決定したフォーク箇所の最適組合せに含まれる各フォーク箇所にフォーク命令を挿入することにより、フォーク箇所決定部110が決定した並列化により適した逐次処理プログラムから並列化プログラム103を生成し、後処理として、記憶装置104の記憶部103Mに書き出す。また好ましくは、並列化プログラム出力部130は、フォーク箇所組合せ決定部120により決定された最適な組合せ中のフォーク箇所のフォーク元ポイントおよびフォーク先ポイントをまたいだ命令の入れ替えは行わないという制限の下に、命令スケジューリングを行う。
次に本実施の形態にかかるプログラム並列化装置100の概略動作を説明する。
図1−2を参照すると、本実施の形態にかかるプログラム並列化装置100は、起動されると、処理装置107のフォーク箇所決定部110により、逐次処理プログラム101及びその一部の命令列をそれと等価な他の命令列に変換した少なくとも1つの逐次処理プログラムを解析し、それら複数の逐次処理プログラムのうち、より並列化に適した逐次処理プログラムを選択する(ステップS11)。また、フォーク箇所決定部110により、前記選択した逐次処理プログラムからフォーク箇所を網羅的に抽出し(ステップS12)、その抽出したフォーク箇所のうち、静的ブースト値が静的足切り条件151を満たすものを取り除く(ステップS13)。
次に、処理装置107のフォーク箇所組合せ決定部120により、フォーク箇所決定部110で決定された並列化により適した逐次処理プログラムを入力データ152の下で実行したときの逐次実行トレース情報を生成し、それを複数の区間に分割する(ステップS14)。そして、フォーク箇所組合せ決定部120により、逐次実行トレース情報の各分割区間毎にステップS15〜S18の処理を繰り返す。ステップS15では、フォーク箇所決定部110により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。ステップS16では、求められた動的ブースト値および最小実行サイクル数と動的足切り条件153とを比較し、動的足切り条件153を満たすフォーク箇所を取り除く。ステップS17では、動的足切り後のフォーク箇所から、並列実行性能のよいフォーク箇所の初期組合せを生成し、この初期組合せを初期解としてステップS18で反復改善法により最適な組合せを探索する。次に、フォーク箇所組合せ決定部120により、各分割区間での最適な組合せを適当な基準で統合して、1つの最適なフォーク箇所の組合せを生成する(ステップS19)。
最後に、並列化プログラム出力部130により、必要に応じて後処理を行った後(ステップS20)、フォーク箇所組合せ決定部120で決定された最適なフォーク箇所の組合せに基づいて、フォーク箇所決定部110が決定した並列化により適した逐次処理プログラムにフォーク命令を挿入して並列化プログラム103を生成する(ステップS21)。
次に、本実施の形態の効果を説明する。
本実施の形態によれば、並列実行性能のよりよい並列化プログラムを生成することができる。
その理由は、入力となる逐次処理プログラムそのものだけでなく、それをプログラム変換した等価な逐次処理プログラムも考慮に入れ、入力となる逐次処理プログラムよりも並列実行性能の指標値の良い等価な逐次処理プログラムが見つかれば、その逐次処理プログラムから並列化プログラムを生成するようにしているためである。なお、入力の逐次処理プログラムと等価な逐次処理プログラムを命令の並べ替えによって生成する場合、変換後の逐次処理プログラムの逐次性能が入力の逐次処理プログラムより低下している可能性があるが、その影響は、後処理において実施する命令スケジューリングによって緩和することができる。
また本実施の形態によれば、並列実行性能のよりよい並列化プログラムを高速に生成することができる。
その第1の理由は、静的足切りおよび動的足切りの少なくとも一方により、並列実行性能への寄与が少ないフォーク箇所を処理の早い段階で切り捨てているため、動的フォーク情報の収集処理、最適なフォーク箇所の組合せ決定処理などの後続の処理の時間が短縮されるためである。
また第2の理由は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎に、フォーク箇所決定部が決定したフォーク箇所の集合に含まれるフォーク箇所のうち当該分割区間において出現するフォーク箇所の集合からフォーク箇所の最適な組合せを求め、最後に各分割区間でのフォーク箇所の最適な組合せを1つに統合しているためである。つまり、フォーク箇所の最適な組合せを決定するのに要する処理時間は候補となるフォーク箇所の数に応じて指数関数的に増加するが、各分割区間において出現するフォーク箇所の集合は、フォーク箇所決定部が決定したフォーク箇所の集合の部分集合になるため、全フォーク箇所の集合から一度に最適なフォーク箇所の組合せを求める場合に比べて、フォーク箇所の最適な組合せを求める処理に要する時間が大幅に短くなり、後の統合時間を加味しても全体的な時間が短縮されるからである。
また第3の理由は、フォーク箇所組合せ決定部において、フォーク箇所の集合に含まれるフォーク箇所のうち、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる組合せを生成しており、この生成される組合せは最適な組合せに近いため、その組合せを初期解として反復改善法によって並列実行性能のよりよい組合せをさらに探索する際の処理時間が大幅に短縮できるからである。
次に、本実施の形態にかかるプログラム並列化装置100の各部の詳細を説明する。
まず、フォーク箇所決定部110について詳細に説明する。
図2を参照すると、フォーク箇所決定部110は、フォーク箇所網羅部111、静的足切り部112、例えば記憶装置105上のワーク領域113〜115で構成される。
フォーク箇所網羅部111は、逐次処理プログラム101およびその一部の命令列を他の命令列に変換した少なくとも1つの逐次処理プログラムのうち、並列実行性能のよりよい並列化プログラムを生成するのに適した逐次処理プログラムを決定し、この決定した逐次処理プログラムのフォーク箇所の集合を網羅的に求める部分である。このフォーク箇所網羅部111は、制御・データフロー解析部1111、プログラム変換部1112、フォーク箇所抽出部1113、並列実行性能の指標値算出部1114および選択部1115から構成される。
図3にフォーク箇所網羅部111の処理例を示す。図3を参照すると、フォーク箇所網羅部111は、まず、入力の逐次処理プログラム101をワーク領域113の記憶部1131Mに格納し、制御・データフロー解析部1111により逐次処理プログラム101を解析して、制御フローグラフ(control flow graph)およびデータ依存グラフ(data dependence graph)を含む制御・データフロー解析結果1132を記憶部1132Mに格納する(ステップS101)。
制御フローグラフは、プログラムの分岐や合流の様子をグラフで表現したもので、分岐も合流もない部分(これは基本ブロック(Basic Block)と呼ばれる)をノード(node)とし、それらの間を分岐や合流を表すエッジ(edge)で結んだ有向グラフである。制御フローグラフに関する詳しい解説は、『コンパイラの構成と最適化』(2004年3月20日、朝倉書店発行。以下、参考文献1と称す)の第268頁〜第270に記載されている。また、データ依存グラフは、プログラム内のデータ依存関係(定義と使用の関係)をグラフで表現したものである。データ依存グラフに関する詳しい解説は、参考文献1の第336頁、第365頁に記載されている。
次にフォーク箇所網羅部111は、フォーク箇所抽出部1113により、制御・データフロー解析結果1132を参照して、入力の逐次処理プログラム101のフォーク箇所をすべて抽出し、フォーク箇所の集合1133として記憶部1133Mに格納する(ステップS102)。ここで、フォーク箇所は、フォーク元ポイント(フォーク元アドレス)とフォーク先ポイント(フォーク先アドレス)の組で構成され、本明細書ではfと表記する。また、フォーク元ポイントとフォーク先ポイントを明示する場合は、フォーク元ポイントをi、フォーク先ポイントをjとした場合、f(i,j)と表記する。
フォーク箇所抽出部1113の処理例を図4に示す。この処理例は、フォーク箇所条件1に適合するフォーク箇所を抽出する場合のものである。
図4を参照すると、フォーク箇所抽出部1113は、対象とする逐次処理プログラム中の全命令において、その命令の地点で生存している(alive)レジスタを、その逐次処理プログラムの制御・データフロー解析結果を参照して調査し、メモリ等に記録する(ステップS111)。次に、対象とする逐次処理プログラム中の全命令の組合せの中から、フォーク元ポイントとみなす命令とフォーク先ポイントとみなす命令の組を決定し(ステップS112)、フォーク先ポイントの命令からフォーク元ポイントの命令まで、制御フローをたどることができるかどうかを調査する(ステップS113)。もし、たどれなければ、その組はフォーク箇所でないので、ステップS117へ進む。もし、たどることができれば、フォーク先ポイントで生存しているレジスタの値が、たどる途中で替えられていたかどうかを調べ(ステップS115)、変えられていれば、その組はフォーク箇所でないので、ステップS117へ進む。もし、変えられていなければ、その組をフォーク箇所としてフォーク箇所集合に出力し(ステップS116)、ステップS117へ進む。ステップS117では、対象とする逐次処理プログラム中の全命令の組合せに関してフォーク箇所の可能性を調査し終えたかどうかを判定し、未調査の命令の組合せが残っていれば、ステップS112に戻って上述した処理と同様の処理を繰り返す。全組合せについて調査し終えていれば、フォーク箇所の抽出処理を終了する。
次にフォーク箇所網羅部111は、並列実行性能の指標値算出部1114により、フォーク箇所の集合1133の並列実行性能の指標値1134を算出し、記憶部1134Mに格納する(ステップS103)。本例では、並列実行性能の指標値として、フォーク箇所の静的ブースト値の合計値を用いる。また、静的足切り部112の便宜のために合計値だけでなく個々のフォーク箇所の静的ブースト値もあわせて格納する。
或るフォーク箇所の静的ブースト値は、そのフォーク箇所のフォーク元ポイントの命令からフォーク先ポイントの命令までの全命令の重みの総和であり、逐次処理プログラムとその制御・データフロー解析結果から機械的に計算できる。例えば、制御・データフロー解析結果に基づいて逐次処理プログラムの重み付きデータフローグラフ(エッジに重みを付与したデータフローグラフ)を作成し、各フォーク箇所毎に、そのフォーク箇所のフォーク元ポイントからフォーク先ポイントに至る前記グラフ上の重みを累積すれば、各フォーク箇所毎の静的ブースト値が得られる。本明細書では、或るフォーク箇所fの静的ブースト値をstatic_boost(f)と表記する。命令の重みとしては、例えば、その命令の実行に要するサイクル数が使用される。フォーク箇所の静的ブースト値の具体例を図5(a)に示すプログラムを用いて以下に示す。
図5(a)に示すプログラムの1行目と3行目は、レジスタr0、r2に値10、1000を入れるmov命令、2行目は、レジスタr0の値と値100とを加算し、結果をレジスタr1に置くadd命令、4行目は、レジスタr2の値と値10とで定まるメモリアドレスに格納されている値をレジスタr3にロードするldr命令である。このプログラムでの1つのフォーク箇所を、フォーク元ポイントが1行目、フォーク先ポイントが3行目であるf(1,3)=f1とすると、命令の重みがmovとaddで1の場合、当該フォーク箇所の静的ブースト値static_boost(f1)は2となる。
このような静的ブースト値およびその合計値が、並列実行性能の1つの指標にすることができる理由を図5(b)の概念図を参照して説明する。図5(b)の左側に示す単一のスレッドに、命令aをフォーク元ポイント、命令bをフォーク先ポイントとするフォーク箇所を設定し、同図の右側に示すように2つのスレッドに分割して並列実行した場合を考える。このとき、同図のΔだけ実行時間が短縮されるが、このΔは、当該フォーク箇所のフォーク元ポイントaからフォーク先ポイントbまでの命令の重みを加算した静的ブースト値に相当する。
次にフォーク箇所網羅部111は、プログラム変換部1112により、入力の逐次処理プログラム101の一部の命令列をそれと等価な他の命令列に変換した逐次処理プログラム1141を生成し、ワーク領域114の記憶部1141Mに格納する(ステップS104)。そして、入力の逐次処理プログラム101について求めた場合と同様に、プログラム変換して生成した逐次処理プログラム1141の制御・データフロー解析結果1142を制御・データフロー解析部1111により、その逐次処理プログラムのフォーク箇所の集合1143をフォーク箇所抽出部1113により、そのフォーク箇所の集合の並列実行性能の指標値1144を並列実行性能の指標値算出部1114により、それぞれ求めて、記憶部1142M、1143M、1144Mに格納する(ステップS105〜S107)。
入力の逐次処理プログラム101と等価かつそれぞれ互いに異なる複数の逐次処理プログラムを生成し、それらの制御・データフロー解析結果、フォーク箇所集合、並列実行性能の指標値を求めるようにしてもよい。この場合、ステップS104〜S107が複数回繰り返される。
最後に、フォーク箇所網羅部111は、選択部1115により、逐次処理プログラム101および1以上の逐次処理プログラム1141の中から、並列実行性能の指標値が最もよい、つまり静的ブースト値の合計値が最も大きい逐次処理プログラムを選択し、ワーク領域115の記憶部1151に逐次処理プログラム1151として格納する(ステップS108)。同時に、その逐次処理プログラム1151の制御・データフロー解析結果1152、フォーク箇所の集合1153、並列実行性能の指標値1154をワーク領域115の記憶部1152M、1153M、1154Mに格納する。
静的足切り部112は、フォーク箇所の集合1153に含まれるフォーク箇所のうち、その静的ブースト値が静的足切り条件151を満たすものを並列化性能への寄与が少ないものとして取り除き、残りのフォーク箇所だけをフォーク箇所の集合1413として記憶装置105の記憶部141Mにおける記憶部1413Mに書き出す。また、逐次処理プログラム1151とその制御・データフロー解析結果1152を記憶部141Mの記憶部1411M、1412Mに書き出す。
フォーク箇所の集合1153に含まれるフォーク箇所の静的ブースト値は、並列実行性能の指標値1154の中に記録されているので、静的足切り部112は、記録されている静的ブースト値と静的足切り条件151とを比較することにより、各フォーク箇所毎に、採用するか、捨て去るかを判断する。
静的足切り条件151の例を以下に示す。
静的足切り条件1:静的ブースト値<Ms
静的足切り条件2:静的ブースト値>Ns
静的ブースト値が下限閾値Msより小さなフォーク箇所を取り除く静的足切り条件1の根拠は、静的ブースト値が小さ過ぎる場合、並列化に伴うオーバヘッドに比べて当該フォーク箇所の寄与する並列効果が小さく、結果として当該フォーク箇所が並列化の性能に寄与しないからである。Msの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
静的ブースト値が上限閾値Nsより大きなフォーク箇所を取り除く静的足切り条件2の根拠は、静的ブースト値が大き過ぎる場合、真依存関係(RAW:Read After Write)の違反が発生し易くなり、結果として当該フォーク箇所が並列化の性能に寄与しないからである。図6−1(a)に真依存関係の簡単なイメージを示す。真依存関係とは、或るサイクルで書き込んだデータを、後で読み出すことである。図6−1(a)では、白丸の箇所でメモリの100番地にストアしたデータを黒丸の箇所で再び読み出している。ここではメモリのデータを例に挙げているが、レジスタのデータなどでも同じである。逐次実行の場合、この依存関係においては問題は発生しないが、並列実行では、状況によって問題が発生する。今、図6−1(a)の単一のスレッドに、図示するフォーク元ポイントとフォーク先ポイントのフォーク箇所を設定し、図6−1(b)に示すように複数のスレッドに分割して並列実行することを考える。本来ならば、白丸の箇所でストアされたデータを黒丸の箇所で読み出すはずが、図6−1(b)では、黒丸のロード命令が白丸のストア命令を時間的に追い越して実行されている。つまり、真依存関係の違反が発生している。このような真依存関係の違反は、フォーク元ポイントからフォーク先ポイントまでのスレッド長が長ければ長いほど、つまり静的ブースト値が大きいほど発生し易くなる。真依存関係の違反が発生すると、子スレッドの再実行が行われるマルチスレッド型並列プロセッサでは、並列実行性能が低下する。
静的ブースト値が上限閾値Nsより大きなフォーク箇所を取り除く他の理由は、子スレッドをフォークするプロセッサを自プロセッサの一方の隣接プロセッサに限定したリング型フォークモデルのマルチスレッド型並列プロセッサにおいては、静的ブースト値が大き過ぎると、各プロセッサが長時間にわたりビジー状態になるため、フォークの連鎖が途絶え、処理効率が低下するためである。図6−2(a)にその様子を示す。プロセッサ#0からその隣接プロセッサ#1に、プロセッサ#1からその隣接プロセッサ#2に、プロセッサ#2からその隣接プロセッサ#3にそれぞれ子スレッドをフォークし、プロセッサ#3のフォーク点でプロセッサ#0がフリー状態になっているため、プロセッサ#3からプロセッサ#0への子スレッドのフォークも成功しているが、このプロセッサ#0に新たに生成されたスレッドのフォーク点では、隣接プロセッサ#1がビジー状態であるためフォークが不可能になっている。このような場合、図6−2(b)に示すように、プロセッサ#0においてフォークをスキップ(無効化)し、本来隣接プロセッサ#1で行うべき子スレッドを自身で実行するマルチスレッド型並列プロセッサでは、隣接プロセッサ#1がフリー状態になるまで処理を待ち合わせるマルチスレッド型並列プロセッサ方法に比べて処理の効率が高まるとは言え、並列実行の性能は低下する。
上限閾値Nsの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
次に、プログラム変換部1112の詳細を説明する。
プログラム変換部1112は、命令並べ替えおよびレジスタ割当変更の少なくとも一方を実施することにより、入力の逐次処理プログラム101と等価な逐次処理プログラム1141を少なくとも1つ生成する。以下、命令並べ替えとレジスタ割当変更について個別に説明する。
○命令並べ替え
通常、スーパスカラマシンなど命令レベル並列実行可能なプロセッサ向けの目的プログラムを生成する逐次コンパイラは、パイプラインストールを回避するためや命令レベル並列性を高めるため等を目的として、データ依存関係のある命令が互いになるべく離れる、つまり変数が利用されている期間である生存(alive)区間が拡がるように命令を配置する最適化を行っている。この最適化は一般に命令スケジューリングと呼ばれるが、このような最適化がスレッド並列性の抽出を阻害する要因となり得る。なぜなら、命令スケジューリングによって変数の生存区間が拡がると、抽出できるフォーク箇所の候補数が減って静的ブースト値の合計である並列実行性能の指標値も減る場合があるためである。そこで、命令スケジューリングとは逆に、データ依存関係のある命令が互いになるべく近づく、つまり変数の生存区間が狭まるように命令を並べ替えた逐次処理プログラム1141を生成し、若し、元の逐次処理プログラム101より並列実行性能の指標値が改善されたならば、命令並べ替えした逐次処理プログラム1141を採用することで、よりよい並列実行性能の並列化プログラムが得られるようにする。
命令並べ替え処理では、任意のレジスタに書き込みを行う命令がある場合、当該レジスタを最終的に読み出す命令を、その書き込み命令に近づけるように命令を再配置する。ただし、データの依存関係を崩してはならない。レジスタのリネーミングを行う(命令追加、削除も行う)場合、命令間の真依存関係(RAW)を満たす必要がある。レジスタのリネーミングを行わない場合、命令間の真依存関係(RAW)、逆依存関係(WAR)、出力依存関係(WAW)を満たす必要がある。再配置する順序は、例えばブロックの上端から出現した命令から順に移動させても良い。基本ブロック内での命令並べ替えに限定し且つレジスタのリネーミングを行わずに命令の再配置を行う処理の一例を図7に示す。図7の処理は1つの基本ブロックに対する処理であり、制御フローを解析して逐次処理プログラムから抽出される各基本ブロックに対して同様の処理が繰り返される。
図7を参照すると、プログラム変換部1112は、まず、基本ブロックBB内の各命令をノードとし、RAW関係をエッジとするDAG(Directed Acyclic Graph:有向非循環グラフ)のグラフGrと、各命令をノードとし、RAWだけでなく全てのデータ依存関係(RAW、WAR、WAW)をエッジとするDAGのグラフGaとを、図示しないメモリ上に作成する(ステップS201)。
次にプログラム変換部1112は、データ依存関係のあるノード集合のうち、基本ブロックの上端で生存中の変数からパスのあるノード集合を順次に抽出して、基本ブロック再配置用に確保した再配置ブロックの上端に近い空きエリアから順に配置していく(ステップS202〜S205)。具体的には、Grに、基本ブロックBB上端で生存中の変数からGrでリーフノードへのパスがあるノード集合が存在するかどうかを判定し(ステップS202)、そのようなノード集合が存在すれば、そのうちコスト最小のノード集合NrをGrから抜き出し(ステップS203)、Ga中で当該Nrへパスのあるノード集合NaをGaから抜き出してNrとマージし(ステップS204)、再配置ブロックの上端に近い空きエリアからマージ後のNrを配置する(ステップS205)。ここで、コストとしては、例えば命令の実行サイクル数が使用される。
次にプログラム変換部1112は、データ依存関係のある残りのノード集合のうち、入力数(Indegree)0のノード(レジスタに定数を設定する命令など、初期WRITEのノード)から当該基本ブロックの下端で生存する変数につながるパスのあるノード集合を順次に抽出して、再配置ブロックの下端に近い空きエリアから順に配置していく(ステップS206〜S209)。具体的には、Grに、入力数0のノードから基本ブロックBB下端で生存する変数につながるパスがあるノード集合が存在するかどうかを判定し(ステップS206)、そのようなノード集合が存在すれば、そのうちコスト最小のノード集合NrをGrから抜き出し(ステップS207)、Ga中で当該Nrへパスのあるノード集合NaをGaから抜き出してNrとマージし(ステップS208)、再配置ブロックの下端に近い空きエリアからマージ後のNrを配置する(ステップS209)。
最後にプログラム変換部1112は、データ依存関係のある残りのノード集合を順次に抽出して、再配置ブロックの上端に近い空きエリアから順に配置していく(ステップS210〜S213)。具体的には、Grにノード集合が残っているかどうかを判定し(ステップS210)、ノード集合が残っていれば、そのうちの任意のノード集合NrをGrから抜き出し(ステップS211)、Ga中で当該Nrへパスのあるノード集合NaをGaから抜き出してNrとマージし(ステップS212)、再配置ブロックの上端に近い空きエリアからマージ後のNrを配置する(ステップS213)。
次にプログラム変換部1112による命令並べ替え処理の具体例を説明する。
命令並べ替え前のプログラム例を図8−1に、このプログラムの制御の流れ(制御フロー)を図8−2に、それぞれ示す。このプログラムにおいて、基本ブロックBB1から基本ブロックBB2へ伝搬されるレジスタ(つまり基本ブロックBB2の上端で生存するレジスタ)はレジスタr0、r4である。また、基本ブロックBB2から以降へ伝搬されるレジスタ(つまり基本ブロックBB2の下端で生存するレジスタ)は、レジスタr2、r3である。このプログラムのRAWのみに注目したDAGは図8−3に示すようになり、全てのデータ依存関係(RAW、WAR、WAW)に注目したDAGは図8−4に示すようになる。図中、実線の矢印がRAW、破線の矢印がWARまたはWAWを示している。
今、基本ブロックBB2内の命令の並べ替えを行うことを考える。RAWのDAGで、基本ブロックBB2の上端で生存する変数につながるパスを持つノード集合は、図8−3の(a)、(c)であるが、この2つのうち、コストの小さい方は(c)であるため、まず(c)のノード集合の命令を基本ブロックの上端から配置していく。(c)を配置し終わったら、続いて(a)のノード集合の命令を配置していく。しかし、(a)のノード集合を図8−4から参照すると、当該ノード集合につながるノード集合(図8−4(a)中の楕円で囲まれたノード集合、図8−3では(b)がそれにあたる)が存在する。このため、この接続されたノード集合も加えて命令を配置する。ここまでの処理を終えた命令列が図8−5である。なお、図8−5には、基本ブロックBB2以外の命令列は示していない。
次に、基本ブロックBB2の下端で生存する変数につながるパスを持つノード集合に注目する。図8−3内では(a)と(d)がそれにあたるが、既に(a)は配置済なので、残る(d)の配置を行う。図8−4の(a)では、当該ノード集合につながる他のノード集合が存在するが、それらの命令は既に配置済なので、これは気にしなくてよい。
最後に、基本ブロックBBの上端および下端に生存する変数に依存しないノード集合に着目する(つまり、残りのノード集合)。残ったノード集合は図8−3の(e)である。これを基本ブロックのできるだけ上の方から配置する。
上記の手順で並べ替えた結果が図8−6である。
図8−7は命令並べ替え前の命令列におけるレジスタの生存区間と書き込みの様子を示し、図8−8は命令並べ替え後の同様の様子を示す。図中、r0などのレジスタの下に延びる縦の線がそのレジスタの生存区間を表している。また、縦線上の黒丸は当該レジスタへの書き込みが発生していることを示す。バツ印はその箇所の命令をもって、当該レジスタの生存区間が終了したことを表す。
フォーク箇所条件として、前述したフォーク箇所条件1および2のうち、より厳しいフォーク箇所条件1を使用するものとして、命令並べ替え前のフォーク箇所を求めると、f(P05,P06)、f(P09,P10)の2箇所である。これに対して命令並べ替え後のフォーク箇所は、f(P01,P03)、f(P02,P03)、f(P07,P08)、f(P11,P12)の4箇所になる。
○レジスタ割当変更
一般的に、変数がレジスタに割り付けられていれば、メモリに入っている場合よりもアクセスが速く、且つ取り出しや格納(load、store)の命令が不要になるため、逐次処理プログラムを生成する逐次コンパイラは、基本的にそのようなレジスタ割当を実施する。しかし、レジスタの数には限度があるため、新たな変数を割り付けるレジスタが不足した場合、既にレジスタに割り付けられている変数のどれかをメモリに退避することによりレジスタを確保し、メモリに退避した変数に対し、後刻にレジスタを再度割り当てる場合がある。このとき、前回と同じレジスタが割り当てられる保証がないため、若し、逐次処理プログラム101において、別のレジスタが割り当てられていると、退避した時点と復帰した時点とでレジスタが一致しないために、退避した時点をフォーク元ポイント、復帰した時点をフォーク先ポイントとするようなフォーク箇所を抽出できない。そこで、プログラム変換部1112は、このような場合にレジスタ割当を退避と復帰時で一致させることにより、つまり変数の割り当てられるレジスタをできるだけ変えないようにレジスタ割当を変更した逐次処理プログラム1141を生成し、若し、元の逐次処理プログラム101より並列実行性能の指標値が改善されたならば、レジスタ割当変更した逐次処理プログラム1141を採用することで、よりよい並列実行性能の並列化プログラムが得られるようにする。
レジスタ割当変更の処理例について、具体的な命令列を例に以下説明する。なお、説明を簡単にするために、プロセッサの使用できるレジスタは、レジスタr0、r1の高々2つとする。
図9−1はレジスタ割当変更前のプログラムの一例を示し、左側が言語Cのような高級言語による記述、右側がその高級言語を低級言語(擬似的なアセンブラ)に落とし込んだ記述を示し、入力の逐次処理プログラム101に相当する。特に表記がなければ、左側のプログラムのことをソースプログラムと呼び、右側のプログラムをターゲットプログラムと呼ぶことにする。
図9−2は、ソースプログラムで用いられている変数(a〜d)が、ターゲットプログラムでのレジスタに割り当てられてから必要なくなるまでの期間を表したものである。縦線の上のP01などは、ターゲットプログラムの命令の横に表記してある識別子と一致している。横線の黒丸部分は該当する命令に含まれる期間、白丸は含まれないことを表す。例えば、変数aの生存区間1(横線に割り振られている番号を参照)は、P03の命令(st r0,40)まではレジスタに割り当てられているが、P04の命令(ld r0,44)ではすでに変数としては必要としていない、ということを表している。
図9−3は、図9−2をもとに作成されたレジスタ干渉グラフである。レジスタ干渉グラフとは、ノードが任意のレジスタに任意の値もしくは変数が割り当てられている区間(つまり任意のレジスタの生存区間)で、生存区間の重なり合う2つの生存区間をエッジで結んだグラフである。ノードの番号は、図9−2の期間の横線の番号に対応している。ノードで、白いものと灰色のものとがあるが、これは割り付けられているレジスタの種類に対応する。白はターゲットプログラムでのレジスタr0、灰色はターゲットプログラムでのレジスタr1を表す。例えば、変数aの生存区間1は、レジスタr0(白)に割り当てられているが、同じく変数aの生存区間4はレジスタr1(灰色)に割り当てられているのがわかる。
今、ターゲットプログラムの命令P01から命令P09までの命令列の中で、レジスタ割当の変更を考える。
まず、図9−2を参照すると、生存区間1と生存区間4は同一変数(a)のものだということがわかる。そこで、まず図9−3のノード1とノード4を一緒にする。その結果が図9−4である。このとき、まだ各ノードへの色づけ(つまりレジスタ割当)は行っていない。そして、このグラフに対してk−彩色問題を解く。k−彩色問題とは、グラフ上で、隣接するどのノードも同じ色にならないようにして、すべてのノードをk色で塗ることは可能か、という問題であり、本例においては、プロセッサで使用できるレジスタ数が2つなので、kは2になる。k−彩色問題を解いた結果、判定がYES(つまり、2色で彩色可能)ならば、実際にレジスタの割当を行い直す。一例として、彩色後のグラフを図9−5に示す。
図9−5に従ってレジスタの割当を変更したターゲットプログラムを図9−6に示す。変更されている点は、P07以降の変数aと変数dの割り当てられるレジスタである。フォーク箇所条件として前述したフォーク箇所条件2を使った場合、レジスタ割当変更前の図9−1のターゲットプログラムでは、f(P03,P04)、f(P06,P07)の2つであるのに対し、レジスタ割当変更後の図9−6のターゲットプログラムでは、さらにf(P02,P07)、f(P02,P08)、f(P03,P07)、f(P03,P08)、f(P04,P07)、f(P04,P08)が加わり、合計8個になる。
次にフォーク箇所組合せ決定部120の詳細を説明する。
図10を参照すると、フォーク箇所組合せ決定部120は、逐次実行トレース情報取得部121、分割部122、繰り返し部123、統合部124、例えば記憶装置105上のワーク領域125で構成される。
逐次実行トレース情報取得部121は、記憶部141の中間データ141に含まれる逐次処理プログラム(図2の1151)を、プロセッサあるいはシミュレータを使って、記憶部152Mに予め記憶された入力データ152の下に実行することにより、逐次実行トレース情報1251を生成し、ワーク領域125の記憶部1251Mに保存する。逐次実行トレース情報1251には、1マシンサイクル毎に、そのマシンサイクルで実行された逐次処理プログラム1151の命令文を特定するアドレスなどの識別情報が記録されている。また、逐次実行時の総サイクル数SNも記録されている。
分割部122は、記憶部1251Mに保存された逐次実行トレース情報を、予め定められた逐次実行サイクル数Nで分割し、得られた個々の逐次実行トレース部分情報1252を記憶部1252Mに保存する。逐次実行トレース情報1251の総実行サイクル数SNがNの整数倍でないとき、最後の1つの逐次実行トレース部分情報はサイズが小さくなる。若し、Nより十分に小さくなる場合には、1つ前の逐次実行トレース部分情報に合体させるようにしてもよい。逐次実行サイクル数Nの値にもよるが、1つの逐次実行トレース部分情報1252には、フォーク箇所決定部110により決定されたフォーク箇所の集合(図2の1413)に含まれるフォーク箇所の一部のみが現れる。
繰り返し部123は、動的フォーク情報取得部1231、動的足切り部1232、初期組合せ決定部1233および組合せ改善部1234を備えており、分割部122が生成した個々の逐次実行トレース部分情報1252毎に、動的フォーク情報の取得、動的足切り、フォーク箇所の初期組合せの生成およびその改善を行う。以下、動的フォーク情報取得部1231、動的足切り部1232、初期組合せ決定部1233および組合せ改善部1234について説明する。
動的フォーク情報取得部1231は、各逐次実行トレース部分情報1252毎に、フォーク箇所決定部110により決定されたフォーク箇所集合1413に含まれる各フォーク箇所毎の動的ブースト値、最小実行サイクル数および排他フォーク集合を求め、動的フォーク情報1253として記憶部1253Mに格納する。動的フォーク情報取得部1231の処理例を図11に示す。
図11を参照すると、動的フォーク情報取得部1231は、まず、フォーク箇所集合1413に含まれる各フォーク箇所毎に、そのフォーク箇所の動的ブースト値、最小実行サイクル数および排他フォーク集合をそれぞれ保存するための構造体を記憶部1253Mに確保し、それらの値を初期値に設定する(ステップS301)。例えば、動的ブースト値は最小値に、最小実行サイクル数は最大値に、排他フォーク集合は空にそれぞれ初期設定する。ここで、排他集合を保存する構造体として、各ビットがフォーク箇所と1対1に対応し排他関係にあれば1が立つビット列を使用すれば、メモリ使用量を削減することができる。
次に動的フォーク情報取得部1231は、フォーク箇所集合1413中の1つのフォーク箇所に注目し(ステップS302)、そのフォーク箇所のフォーク先ポイントが現れる箇所を逐次実行トレース部分情報1252の先頭から順に検索する(ステップS303)。該当する1つのフォーク先ポイントが見つかると(ステップS304でNo)、見つかったフォーク先ポイントとペアになるフォーク先ポイントを逐次実行トレース部分情報1252から検索し(ステップS305)、逐次実行トレース部分情報1252上で前記フォーク元ポイントと前記フォーク先ポイントとの間の実行サイクル数をカウントする(ステップS306)。そして、構造体に保存されている注目中フォーク箇所の最小実行サイクル数と比較し(ステップS307)、今回の実行サイクル数の方が少なければ、最小実行サイクル数を今回の実行サイクル数に置き換える(ステップS308)。次に、構造体に保存されている注目中フォーク箇所の動的ブースト値に今回の実行サイクル数を加算する(ステップS309)。次に、フォーク箇所集合1413中の注目中フォーク箇所以外の他のフォーク箇所であって、注目中フォーク箇所の前記フォーク元ポイントとフォーク先ポイントの間にフォーク元ポイントおよびフォーク先ポイントの少なくとも一方が存在するフォーク箇所を調べ、それらを注目中のフォーク箇所の排他フォーク集合に入れる(ステップS310)。なお、ステップS303で検索したフォーク元ポイントとペアになるフォーク先ポイントが処理対象とする逐次実行トレース部分情報1252に存在しない場合もあり、そのときはステップS305の検索に失敗するが、その場合には、他の逐次実行トレース部分情報1252を検索するようにしてもよいし、或いはステップS306〜S310をスキップしてもよい。
注目中のフォーク箇所に関する逐次実行トレース部分情報1252上の1つのフォーク元ポイントとフォーク先ポイントのペアについて上述した処理を終えると、ステップS303に戻り、当該注目中のフォーク箇所の別のフォーク元ポイントを逐次実行トレース部分情報1252から検索し、あれば前述の処理と同様の処理を繰り返す(ステップS305〜S310)。
逐次実行トレース部分情報1252上に現れる注目中フォーク箇所のすべてについて上述した処理を終えると(ステップS304でYes)、フォーク箇所集合1413中の次の1つのフォーク箇所に注目を移し(ステップS311)、前述の処理と同様の処理を繰り返す。フォーク箇所集合1413中の全てのフォーク箇所について前述した処理を終えると(ステップS312)、当該逐次実行トレース部分情報1252からの動的ブースト値、最小実行サイクル数および排他フォーク集合の取得処理を終える。なお、当該逐次実行トレース部分情報1252に現れないフォーク箇所の動的ブースト値、最小実行サイクル数および排他フォーク集合は、初期値のままになる。
次に動的足切り部1232について説明する。
動的足切り部1232は、フォーク箇所決定部110により決定されたフォーク箇所集合1413に含まれるフォーク箇所のうち、動的フォーク情報1253中の動的ブースト値および最小実行サイクル数が動的足切り条件153を満たすものを、並列化性能への寄与が少ないものとして取り除き、残りのフォーク箇所を動的足切り後のフォーク箇所集合1254として記憶部1254Mに格納する。動的足切り部1232の処理例を図12に示す。
図12を参照すると、動的足切り部1232は、まず、フォーク箇所集合1413中の1つのフォーク箇所に注目し(ステップS321)、動的フォーク情報1253中の注目中フォーク箇所の動的ブースト値および最小実行サイクル数と動的足切り条件153とを比較する(ステップS322)。注目中のフォーク箇所の動的ブースト値および最小実行サイクル数の少なくとも一方が動的足切り条件153を満たす場合(ステップS323でYes)、当該フォーク箇所は動的足切り後のフォーク箇所集合1254に記録せず、動的ブースト値および最小実行サイクル数の双方が動的足切り条件153を満たしていれば、当該フォーク箇所を動的足切り後のフォーク箇所集合1254に記録する(ステップ324)。
動的足切り部1232は、フォーク箇所集合1413中の1つのフォーク箇所に注目して上述した処理を終えると、フォーク箇所集合1413中の次の1つのフォーク箇所に注目を移し(ステップS325)、前述の処理と同様の処理を繰り返す(ステップS322〜S324)。以上と同様の処理をフォーク箇所集合1413中の残りの全てのフォーク箇所について繰り返し終えると(ステップS326でYes)、1つの動的フォーク情報1253に基づく動的足切り処理を終える。
動的足切り条件153の例を以下に示す。
動的足切り条件1:(動的ブースト値/逐次実行サイクル)<Md
動的足切り条件2:最小サイクル数>Nd
動的足切り条件1における逐次実行サイクルは、動的ブースト値を取得した逐次実行トレース部分情報1252の総実行サイクル数、つまり分割に使用した逐次実行サイクル数Nを意味する。従って、動的ブースト値/逐次実行サイクルは、総実行サイクル数に対する当該フォーク箇所によって短縮される実行サイクル数の割合を意味する。この割合が下限閾値Mdより小さなフォーク箇所を取り除く理由は、静的足切り条件1と同じである。Mdの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
動的足切り条件2を満たすフォーク箇所を取り除く理由は、静的足切り条件2の場合と同じである。Ndの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
次に初期組合せ決定部1233について説明する。
初期組合せ決定部1233は、動的足切り後のフォーク箇所集合1254と、動的フォーク情報1253中の排他フォーク集合および動的ブースト値とを入力し、キャンセルの発生しないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる組合せを初期組合せ1255として生成し、記憶部1255Mに格納する。初期組合せ決定部1233の処理例を図13に示す。
図13を参照すると、初期組合せ決定部1233は、まず、フォーク箇所集合1254中の各フォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の動的ブースト値を重みとして付与した重み付きグラフを生成する(ステップS401)。フォーク箇所どうしが排他関係にあるかどうかは、動的フォーク情報1253の各フォーク箇所毎の排他集合を参照して判断する。また、各フォーク箇所の動的ブースト値も動的フォーク情報1253から参照する。
例えば図14(a)の左側に示すような5つのフォーク箇所f1[15]、f2[7]、f3[10]、f4[5]、f5[8]から構成されるフォーク箇所集合を考えてみる。[]内の数値は動的ブースト値を示し、図14(a)において破線で結ばれたフォーク箇所どうしは排他関係にあることを示す。このようなフォーク箇所集合の場合、重み付きグラフは図14(b)の左側に示すようなグラフになる。
次に初期組合せ決定部1233は、重み付きグラフの重み付き最大独立集合(Maximum Weight Independent Set)を求める(ステップS402)。重み付き最大独立集合とは、隣り合わない(つまり独立)頂点の集合であって、重みの和が最大となる集合のことである。重み付き最大独立集合を求める解法の例については後述するが、図14(b)の重み付き最大独立集合の解は、右側のグラフにおける黒丸の2つの頂点を含む集合になる。
次に初期組合せ決定部1233は、求めた重み付き最大独立集合に含まれるノードに対応するフォーク箇所の集合を初期組合せ1255として記憶部1255Mに格納する(ステップS403)。図14(b)の場合、図14(a)の右側に示すように、フォーク箇所f1[15]とフォーク箇所f5[8]とを含む集合が初期組合せ1255となる。
次に重み付き最大独立集合の解法例について説明する。
今、図15−1に示すような重み付きグラフを考える。グラフ中の各ノードがフォーク箇所を表し、ノードの横の数字がそのノードの重み(つまり動的ブースト値)を表す。また、ノードを接続するエッジが排他関係を表している。
重み付き最大独立集合の近似アルゴリズムの一例を以下に示す。
1.選択されていない、もしくは削除されていないノードの中で最も重みの大きいノードを選ぶ。
2.上記の1で選んだノードと接続しているノードをグラフから削除する。
3.選択できるノードがなくなるまで、上記の1と2を繰り返す。
以上のアルゴリズムによる重み付き最大独立集合の解法例を、図15−1のグラフを用いて以下に示す。
まず最も重みの大きいフォーク箇所f7を選択する。そして、フォーク箇所f7に隣接するノードを削除する。その様子を図15−2に示す。黒いノードが選択されたノード、灰色のノードは削除されたノードを表す。
同様にして、選択および削除されていないノードの中で重み最大のノードであるフォーク箇所f3を次に選択する。選択後の様子を図15−3に示す。
最後に残ったフォーク箇所f1を選択し、処理を終了する。終了時点の様子を図15−4に示す。結果として、選択されたフォーク箇所は、f1、f3、f7の3つになる。
次に組合せ改善部1234について説明する。
組合せ改善部1234は、初期組合せ決定部1233が決定した初期組合せ1255、動的足切り後のフォーク箇所集合1254、中間データ141中の逐次処理プログラム1151およびその制御・データフロー解析結果1152を入力し、初期組合せ1255を初期解として、並列実行性能のよりよいフォーク箇所の組合せである最適組合せ1256を探索し、記憶部1256Mに書き出す。つまり、初期組合せ1255に対して僅かな変更を加えて得られる試行組合せを探索し、並列実行性能のよりよい試行組合せが得られれば、改めてこの試行組合せを初期解として探索を続ける、いわゆる反復改善法によって最適解を探索する。組合せ改善部1234の処理例を図16に示す。
組合せ改善部1234は、まず、動的足切り後のフォーク箇所集合1254に含まれるフォーク箇所を動的ブースト値の昇順にソートする(ステップS411)。次に、初期組合せ1255による並列実行をシミュレートし、初期組合せ1255による並列実行性能(例えば実行サイクル数)を取得する(ステップS412)。初期組合せ1255による並列実行は、逐次実行トレース部分情報1252を使って行うことができる。つまり、逐次実行トレース部分情報1252を初期組合せ1255に含まれるフォーク箇所で並列化したときの動作を、中間データ141に記録されている逐次処理プログラム1151の制御・データフロー解析結果、ターゲットとなるマルチスレッド型並列プロセッサのプロセッサ数などを参照して、シミュレートし、総実行サイクル数を求める。勿論、他の方法、例えば、初期組合せ1255に含まれるフォーク箇所に基づいて逐次処理プログラム1151から生成される並列化プログラムの動作を、ターゲットとなるマルチスレッド型並列プロセッサあるいはシミュレータで或る入力データの下に実行して総実行サイクルを求めるようにしてもよい。
次に、組合せ改善部1234は、初期組合せ1255を現時点の最適な組合せである最適組合せに設定し(ステップS413)、以下のようにして反復改善法によって最適解を探索する。
まず、最適組合せに含まれず且つ動的ブースト値の最も大きいフォーク箇所を前記ソート後のフォーク箇所集合1254から選択し、この選択したフォーク箇所を最適組合せに追加したものを試行組合せとする(ステップS414)。また、前記追加したフォーク箇所と排他関係にあるフォーク箇所が試行組合せに存在するかどうかを調べ、存在すればそれらを試行組合せから除去する(ステップS415)。そして、試行組合せによる並列実行をシミュレートし、試行組合せによる並列実行性能を取得する(ステップS416)。
次に、試行組合せによる並列実行性能と最適組合せによる並列実行性能とを比較し、試行組合せの方が並列実行性能が良いかどうか、つまり並列実行性能が改善したかどうかを判定する(ステップS417)。若し、改善していれば、試行組合せを新たな最適組合せに設定し(ステップS418)、ステップS419の処理へ進む。他方、改善していなければ、最適組合せを現状のままにしてステップS419の処理へ進む。
ステップS419において、組合せ改善部146は、現在の試行組合せに含まれるフォーク箇所と排他関係にないフォーク箇所であって且つ動的ブースト値が最も大きいフォーク箇所を前記ソート後のフォーク箇所集合1254から1つ選択し、この選択したフォーク箇所を現在の最適組合せに追加したものを、新たな試行組合せに設定する。そして、この試行組合せによる並列実行をシミュレートし、試行組合せによる並列実行性能を取得する(ステップS420)。
次に、試行組合せによる並列実行性能と最適組合せによる並列実行性能とを比較し、試行組合せの方が並列実行性能が良いかどうか、つまり並列実行性能が改善したかどうかを判定する(ステップS421)。若し、改善していれば、試行組合せを新たな最適組合せに設定し(ステップS422)、ステップS423の処理へ進む。他方、改善していなければ、最適組合せを現状のままにしてステップS423の処理へ進む。
ステップS423において、組合せ改善部146は、直前の2つの試行組合せの少なくとも一方で並列実行性能の改善があったかどうかを判定する。何れか一方でも並列実行性能の改善があった場合には、改善後の最適組合せから、よりよい組合せをさらに探索すべく、ステップS414の処理に戻って探索を続ける。
他方、直前の2つの試行組合せの何れも並列実行性能が改善されていなかった場合、組合せ改善部146は、まだ選択していないフォーク箇所がフォーク箇所集合1254に残っているかどうかを判定し(ステップS424)、残っていれば、現在の最適組合せに含まれず且つ動的ブースト値が次に大きいフォーク箇所を前記ソート後のフォーク箇所集合1254から選択し、この選択したフォーク箇所を最適組合せに追加したものを試行組合せとし(ステップS425)、ステップS415に戻って上述した処理と同様の処理を繰り返す。一方、フォーク箇所集合1254に未選択のフォーク箇所が残っていなければ、もはや改善の余地がないとみなして、現在の最適組合せを最適組合せ1256として記憶部1256Mに書き出す(ステップS426)。
次に、統合部124について説明する。
統合部124は、繰り返し部123の組合せ改善部1234によって求められた各分割区間毎での最適組合せ1256を適当な基準を用いて1つに統合し、統合された最適組合せ1421として記憶部142に出力する。統合部124の処理例を図17−1〜図17−3に示す。
図17−1に示す方法では、まず、最適組合せ1256に含まれるフォーク箇所毎に、その動的ブースト値の合計を計算する(ステップS501)。例えば、最適組合せ1256が、A0、A1、A2の3つとし、或るフォーク箇所f1がA0とA1だけに含まれ、A0の生成に使われた動的フォーク情報中でのフォーク箇所f1の動的ブースト値が20、A1の生成に使われた動的フォーク情報中でのフォーク箇所f1の動的ブースト値が30とすると、フォーク箇所f1の動的ブースト値の合計値は50になる。
次に、動的ブースト値の合計値が一定値以上のフォーク箇所の集合を、統合された最適組合せとする(ステップS502)。一定値としては、全フォーク箇所の動的ブースト値の合計値の平均などが考えられる。
図17−2に示す方法は、図17−1に示した方法に、排他フォーク集合を考慮に入れて統合するようにしたものである。具体的には、図17−1に示す方法と同様に、最適組合せ1256に含まれるフォーク箇所毎に、その動的ブースト値の合計を計算する(ステップS511)。次に、最適組合せに含まれるフォーク箇所毎に、その排他フォーク集合に含まれる各フォーク箇所の動的ブースト値の合計値を算出し、そのフォーク箇所の動的ブースト値の合計値から減算する(ステップS512)。例えば、前述した例において、フォーク箇所f1と排他関係にあるフォーク箇所としてf2、f3が例えばA2などに存在し、フォーク箇所f2、f3についてステップS511で算出された動的ブースト値の合計値をそれぞれ10、15とすると、その合計値25がフォーク箇所f1の動的ブースト値の合計値50から減算される。
次に、動的ブースト値の合計値が一定値以上のフォーク箇所の集合を、統合された最適組合せとする(ステップS513)。ここでの一定値としては、例えば0などの値が考えられる。
図17−3は、より高精度な方法で統合する例を示す。まず、図17−1に示す方法と同様に、最適組合せ1256に含まれるフォーク箇所毎に、その動的ブースト値の合計を計算する(ステップS521)。次に、最適組合せに含まれるフォーク箇所毎に、その排他フォーク集合を求める。例えば、前述した例において、フォーク箇所f1と排他関係にあるフォーク箇所が、全ての最適組合せを通じて、f2とf3の2つであった場合、フォーク箇所f1の排他フォーク集合は、f2とf3を含む集合となる。
次に、全ての最適組合せ1256中のフォーク箇所から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計値が最大になる組合せを生成し、これを統合された最適組合せ1421とする(ステップS523〜S525)。具体的には、重み付き最大独立集合問題に置き換えて扱う。すなわち、まず、最適組合せ1256に含まれる各フォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の動的ブースト値の合計値を重みとして付与した重み付きグラフを生成する(ステップS523)。次に、重み付きグラフの重み付き最大独立集合を求める(ステップS524)。そして、求めた重み付き最大独立集合に含まれるノードに対応するフォーク箇所の集合を、統合された最適組合せとする(ステップS525)。
次に並列化プログラム出力部130の詳細を説明する。
図18を参照すると、並列化プログラム出力部130は、後処理部131、フォーク命令挿入部132、例えば記憶装置105上のワーク領域132で構成される。
後処理部131は、中間データ141に含まれる逐次処理プログラム1151、その制御・データフロー解析結果1152、中間データ142に含まれる統合された最適組合せ1421を入力し、フォーク箇所決定部110におけるプログラム変換部1112において実施された命令並べ替えによる各スレッドの逐次性能に対する悪影響を緩和するための後処理を実施し、後処理を施した逐次処理プログラム1331をワーク領域133の記憶部1331Mに書き出す。
具体的には、後処理部131は、統合された最適組合せ1421に含まれるフォーク箇所のフォーク元ポイントおよびフォーク先ポイントをまたいだ命令の入れ替えはしないという制限の下に、データ依存関係のある命令が互いになるべく離れる、つまり変数の生存区間が拡がるように命令の並べ替えを行う。これは、データ依存関係を壊さない範囲で、同じレジスタへのライトからリードまでの期間をできるだけ長くする既存のコンパイラにおける命令スケジューリング機能に、フォーク元ポイントとフォーク先ポイントをまたいだ命令の入れ替えは行わないという制限を持たせたものに相当する。
プログラム変換部1112において、データ依存関係のある命令が互いになるべく近づく、つまり変数の生存区間が狭まるような命令の並べ替えが実施されていると、逐次処理性能が低下する可能性があるため、後処理部131で上述した処理を行うことにより、影響を緩和することができる。
フォーク命令挿入部132は、後処理後の逐次処理プログラム1331と、中間データ142に含まれる統合された最適組合せ1421を入力し、最適組合せ1421に含まれる各フォーク箇所にフォーク命令を挿入することにより、逐次処理プログラム1331から並列化プログラム103を生成し、記憶部103Mに書き出す。
《第2の実施の形態》
図19−1を参照すると、本実施の形態にかかるプログラム並列化装置100Aは、第1の実施の形態にかかるプログラム並列化装置100と比較して、フォーク箇所決定部110および並列化プログラム出力部130の代わりにフォーク箇所決定部110Aおよび並列化プログラム出力部130Aを備えている点で相違する。
フォーク箇所決定部110Aは、図2に示したフォーク箇所決定部110の構成要素からプログラム変換部1112およびワーク領域114などのプログラム変換に関連する部分を省略し、並列化プログラム出力部130Aは、図18に示した並列化プログラム出力部130の構成要素から後処理部131およびワーク領域133などの後処理に関連する部分を省略したものであり、入力の逐次処理プログラム101を並列化の対象とする。
図19−2を参照すると、本実施の形態にかかるプログラム並列化装置100Aは、起動されると、処理装置107のフォーク箇所決定部110Aにより、逐次処理プログラム101を解析し、制御フローおよびデータフロー解析結果に基づいて逐次処理プログラム101からフォーク箇所を網羅的に抽出し(ステップS12)、その抽出したフォーク箇所のうち、静的ブースト値が静的足切り条件151を満たすものを取り除く(ステップS13)。次に、フォーク箇所組合せ決定部120において、第1の実施の形態と同様の処理を行う(ステップS15〜S19)。最後に、並列化プログラム出力部130Aにおいて、フォーク箇所組合せ決定部120で決定された最適なフォーク箇所の組合せに基づいて入力の逐次処理プログラム101にフォーク命令を挿入し、並列化プログラム103を生成する(ステップS21)。
《第3の実施の形態》
図20−1を参照すると、本実施の形態にかかるプログラム並列化装置100Bは、第1の実施の形態にかかるプログラム並列化装置100と比較して、フォーク箇所組合せ決定部120の代わりにフォーク箇所組合せ決定部120Bを備えている点で相違する。
フォーク箇所組合せ決定部120Bは、図10に示したフォーク箇所組合せ決定部120の繰り返し部123の初期組合せ決定部1333の代わりに簡略された初期組合せ決定部をを備えている。
図20−2を参照すると、本実施の形態にかかるプログラム並列化装置100Bは、起動されると、処理装置107のフォーク箇所決定部110により第1の実施の形態と同様の処理を行う(ステップS11〜S13)。
次に、処理装置107のフォーク箇所組合せ決定部120Bにより、フォーク箇所決定部110で決定された並列化により適した逐次処理プログラムを入力データ152の下で実行したときの逐次実行トレース情報を生成し、それを複数の区間に分割する(ステップS14)。そして、フォーク箇所組合せ決定部120Bにより、逐次実行トレース情報の各分割区間毎にステップS15、S16、S17Bの処理を繰り返す。ステップS15では、フォーク箇所決定部110により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。ステップS16では、求められた動的ブースト値および最小実行サイクル数と動的足切り条件153とを比較し、動的足切り条件153を満たすフォーク箇所を取り除く。ステップS17Bでは、動的足切り後のフォーク箇所から、動的ブースト値のより大きな上位幾つかのフォーク箇所の組合せを初期組合せとして生成し、この初期組合せを初期解として反復改善法により最適な組合せを探索する。次に、フォーク箇所組合せ決定部120Bにより、各分割区間での最適な組合せを適当な基準で統合して、1つの最適なフォーク箇所の組合せを生成する(ステップS19)。
最後に、並列化プログラム出力部130により、第1の実施の形態と同様の処理を行う(ステップS20、S21)。
《第4の実施の形態》
図21−1を参照すると、本実施の形態にかかるプログラム並列化装置100Cは、第1の実施の形態にかかるプログラム並列化装置100と比較して、フォーク箇所決定部110およびフォーク箇所組合せ決定部120の代わりにフォーク箇所決定部110Cおよびフォーク箇所組合せ決定部120Cを備えている点で相違する。
フォーク箇所決定部110Cは、図2に示したフォーク箇所決定部110の構成要素から静的足切り部112を省略した構成を持つ。
フォーク箇所組合せ決定部120Cは、図10に示したフォーク箇所組合せ決定部120の構成要素から動的足切り部1232を省略した構成を持つ。
図21−2を参照すると、本実施の形態にかかるプログラム並列化装置100Cは、起動されると、処理装置107のフォーク箇所決定部110Cにより、逐次処理プログラム101及びその一部の命令列をそれと等価な他の命令列に変換した少なくとも1つの逐次処理プログラムを解析し、それら複数の逐次処理プログラムのうち、より並列化に適した逐次処理プログラムを選択し(ステップS11)、また、前記選択した逐次処理プログラムからフォーク箇所を網羅的に抽出する(ステップS12)。
次に、処理装置107のフォーク箇所組合せ決定部120Cにより、フォーク箇所決定部110Cで決定された並列化により適した逐次処理プログラムを入力データ152の下で実行したときの逐次実行トレース情報を生成し、それを複数の区間に分割する(ステップS14)。そして、フォーク箇所組合せ決定部120Cにより、逐次実行トレース情報の各分割区間毎にステップS15、S17C、S18の処理を繰り返す。ステップS15では、フォーク箇所決定部110Cにより決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。ステップS17Cでは、フォーク箇所決定部110Cにより決定されたフォーク箇所の集合に含まれるフォーク箇所のうち、当該分割区間の逐次実行トレース情報に現れるトレース箇所から、並列実行性能のよいフォーク箇所の初期組合せを生成する。ステップS18では、この初期組合せを初期解として、反復改善法により最適な組合せを探索する。次に、フォーク箇所組合せ決定部120Cにより、各分割区間での最適な組合せを適当な基準で統合して、1つの最適なフォーク箇所の組合せを生成する(ステップS19)。
最後に、並列化プログラム出力部130により、第1の実施の形態と同様の処理を行う(ステップS20、S21)。
本実施の形態では、第1の実施の形態から静的足切りおよび動的足切り双方の構成部分を省略したが、何れか一方だけを省略した実施の形態も考えられる。
《第5の実施の形態》
図22−1を参照すると、本実施の形態にかかるプログラム並列化装置100Dは、第1の実施の形態にかかるプログラム並列化装置100と比較して、フォーク箇所組合せ決定部120の代わりにフォーク箇所組合せ決定部120Dを備えている点で相違する。
フォーク箇所組合せ決定部120Dは、図10に示したフォーク箇所組合せ決定部120の構成要素から分割部122および統合部124を省略したもので、逐次実行トレース情報を分割せず一括して処理する。
図22−2を参照すると、本実施の形態にかかるプログラム並列化装置100Dは、起動されると、処理装置107のフォーク箇所決定部110により第1の実施の形態と同様の処理を行う(ステップS11〜S13)。
次に、フォーク箇所組合せ決定部120Dにより、次の処理を行う。まず、フォーク箇所決定部110で決定された並列化により適した逐次処理プログラムを入力データ152の下で実行したときの逐次実行トレース情報を生成する(ステップS14D)。次に、フォーク箇所決定部110により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める(ステップS15D)。次に、求められた動的ブースト値および最小実行サイクル数と動的足切り条件153とを比較し、動的足切り条件153を満たすフォーク箇所を取り除く(ステップS16D)。次に、動的足切り後のフォーク箇所から、並列実行性能のよいフォーク箇所の初期組合せを生成する(ステップS17D)。次に、この初期組合せを初期解として、反復改善法により最適な組合せを探索する(ステップS18D)。
最後に、並列化プログラム出力部130により、第1の実施の形態と同様の処理を行う(ステップS20、S21)。
本実施の形態では、第1の実施の形態におけるフォーク箇所組合せ決定部120の構成要素から分割部122および統合部124を省略したが、第2、第3あるいは第4の実施の形態におけるフォーク箇所組合せ決定部の構成要素から分割部122および統合部124を省略した実施の形態も考えられる。
《その他の実施の形態》
以上、本発明の実施の形態について説明したが、本発明は以上の実施の形態にのみ限定されず、その他各種の付加変更が可能である。例えば、前記各実施の形態において、組合せ改善部1234を省略した構成にすることも可能である。