(57)【要約】【課題】  並列実行性能のよりよい並列化プログラムを高速に生成する。【解決手段】  フォーク箇所決定部１１０は、逐次処理プログラム１０１のフォーク箇所を抽出する。フォーク箇所組合せ決定部１２０は、逐次処理プログラム１０１を入力データ１５２の下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎に、その分割区間において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求め、最後に各分割区間での最適な組合せを適当な基準で１つに統合する。並列化プログラム出力部１３０は、フォーク箇所組合せ決定部１２０により決定されたフォーク箇所の最適な組合せに基づいて逐次処理プログラム１０１からマルチスレッド型並列プロセッサ向けの並列化プログラム１０３を生成する。【選択図】  図１−１
2006018447.tif 000002
【特許請求の範囲】
【請求項１】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置において、
前記入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するフォーク箇所決定部と、
前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するフォーク箇所組合せ決定部と、
前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成する並列化プログラム出力部とを備え、
前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎にその分割区間において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求め、該求めた各分割区間での最適な組合せを１つに統合するものであることを特徴とするプログラム並列化装置。
【請求項２】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置において、
前記入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するフォーク箇所決定部と、
前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するフォーク箇所組合せ決定部と、
前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成する並列化プログラム出力部とを備え、
前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を取得する逐次実行トレース情報取得部と、前記取得された逐次実行トレース情報を記憶する記憶部と、前記取得された逐次実行トレース情報を複数の区間に分割する分割部と、各分割区間毎にその分割区間の逐次実行トレース情報において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求める組合せ決定部と、前記求められた各分割区間での最適な組合せを記憶する記憶部と、それらの複数の最適な組合せを１つに統合する統合部とを備えることを特徴とするプログラム並列化装置。
【請求項３】
前記組合せ決定部は、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合からフォーク箇所の初期組合せを決定する初期組合せ決定部と、該初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する組合せ改善部とを含むことを特徴とする請求項２記載のプログラム並列化装置。
【請求項４】
前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、前記各分割区間毎に各フォーク箇所毎の動的ブースト値および排他フォーク集合を求める動的フォーク情報取得部を備え、且つ、前記組合せ決定部は、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定する初期組合せ決定部と、該初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する組合せ改善部とを含むことを特徴とする請求項２記載のプログラム並列化装置。
【請求項５】
前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、そのうちの最小のものを当該フォーク箇所の最小実行サイクル数と定義し、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、前記各分割区間毎に各フォーク箇所毎の最小実行サイクル数、動的ブースト値および排他フォーク集合を求める動的フォーク情報取得部と、前記フォーク箇所決定部により決定されたフォーク箇所の集合から、前記各分割区間毎に前記最小実行サイクル数および前記動的ブースト値が予め定められた足切り条件を満たすフォーク箇所を取り除いた集合を決定する動的足切り部とを備え、且つ、前記組合せ決定部は、前記動的足切り部により前記各分割区間毎に求められたフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定する初期組合せ決定部と、該初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する組合せ改善部とを含むことを特徴とする請求項２記載のプログラム並列化装置。
【請求項６】
前記統合部は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計が一定値以上のフォーク箇所の集合を、統合された最適組合せとするものであることを特徴とする請求項４または５記載のプログラム並列化装置。
【請求項７】
前記統合部は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計から排他フォーク集合中の各フォーク箇所の全分割区間での動的ブースト値の合計を引いた値が一定値以上のフォーク箇所の集合を、統合された最適組合せとするものであることを特徴とする請求項４または５記載のプログラム並列化装置。
【請求項８】
前記統合部は、排他関係のないフォーク箇所の組合せであって、全分割区間での動的ブースト値の合計が最大になる組合せを、統合された最適組合せとするものであることを特徴とする請求項４または５記載のプログラム並列化装置。
【請求項９】
前記統合部は、何れかの分割区間での最適な組合せに含まれるフォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の全分割区間での動的ブースト値の合計を重みとして付与した重み付きグラフを生成する手段と、前記重み付きグラフの重み最大独立集合を求める手段と、求められた重み最大独立集合に含まれるノードに対応するフォーク箇所の集合を、統合された最適組合せとして出力する手段とを含むことを特徴とする請求項８記載のプログラム並列化装置。
【請求項１０】
ａ）フォーク箇所決定部が、入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するステップ、
ｂ）フォーク箇所組合せ決定部が、前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するステップ、
ｃ）並列プログラム出力部が、前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するステップ、
を含み、且つ、前記ステップｂは、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎にその分割区間において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求め、該求めた各分割区間での最適な組合せを１つに統合する処理を含むことを特徴とするプログラム並列化方法。
【請求項１１】
ａ）フォーク箇所決定部が、入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するステップ、
ｂ）フォーク箇所組合せ決定部が、前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するステップ、
ｃ）並列プログラム出力部が、前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するステップ、
を含み、且つ、前記ステップｂは、ｂ−１）逐次実行トレース情報取得部が、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を取得するステップ、ｂ−２）前記取得された逐次実行トレース情報を記憶部に記憶するステップ、ｂ−３）分割部が、前記取得された逐次実行トレース情報を複数の区間に分割するステップ、ｂ−４）組合せ決定部が、各分割区間毎にその分割区間の逐次実行トレース情報において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求めるステップ、ｂ−５）前記求められた各分割区間での最適な組合せを記憶部に記憶するステップ、ｂ−６）統合部が、各分割区間での最適な組合せを１つに統合するステップ、を含むことを特徴とするプログラム並列化方法。
【請求項１２】
前記ステップｂ−４は、ｂ−４−１）初期組合せ決定部が、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合からフォーク箇所の初期組合せを決定するステップ、ｂ−４−２）組合せ改善部が、前記初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索するステップ、を含むことを特徴とする請求項１１記載のプログラム並列化方法。
【請求項１３】
前記ステップｂは、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、動的フォーク情報取得部が、前記各分割区間毎に各フォーク箇所毎の動的ブースト値および排他フォーク集合を求めるステップを含み、且つ、前記ステップｂ−４は、ｂ−４−１）初期組合せ決定部が、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定するステップ、ｂ−４−２）組合せ改善部が、前記初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索するステップ、を含むことを特徴とする請求項１１記載のプログラム並列化方法。
【請求項１４】
前記ステップｂは、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、そのうちの最小のものを当該フォーク箇所の最小実行サイクル数と定義し、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、動的フォーク情報取得部が、前記各分割区間毎に各フォーク箇所毎の最小実行サイクル数、動的ブースト値および排他フォーク集合を求めるステップ、動的足切り部が、前記フォーク箇所決定部により決定されたフォーク箇所の集合から、前記各分割区間毎に前記最小実行サイクル数および前記動的ブースト値が予め定められた足切り条件を満たすフォーク箇所を取り除いた集合を決定するステップを含み、且つ、前記ステップｂ−４は、ｂ−４−１）初期組合せ決定部が、前記動的足切り部により前記各分割区間毎に求められたフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定するステップ、ｂ−４−２）組合せ改善部が、前記初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索するステップ、を含むことを特徴とする請求項１１記載のプログラム並列化方法。
【請求項１５】
前記ステップｂ−６は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計が一定値以上のフォーク箇所の集合を、統合された最適組合せとすることを特徴とする請求項１３または１４記載のプログラム並列化方法。
【請求項１６】
前記ステップｂ−６は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計から排他フォーク集合中の各フォーク箇所の全分割区間での動的ブースト値の合計を引いた値が一定値以上のフォーク箇所の集合を、統合された最適組合せとすることを特徴とする請求項１３または１４記載のプログラム並列化方法。
【請求項１７】
前記ステップｂ−６は、排他関係のないフォーク箇所の組合せであって、全分割区間での動的ブースト値の合計が最大になる組合せを、統合された最適組合せとすることを特徴とする請求項１３または１４記載のプログラム並列化方法。
【請求項１８】
前記ステップｂ−６は、ｂ−６−１）何れかの分割区間での最適な組合せに含まれるフォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の全分割区間での動的ブースト値の合計を重みとして付与した重み付きグラフを生成するステップ、ｂ−６−２）前記重み付きグラフの重み最大独立集合を求めるステップ、ｂ−６−３）求められた重み最大独立集合に含まれるノードに対応するフォーク箇所の集合を、統合された最適組合せとして出力するステップ、を含むことを特徴とする請求項１７記載のプログラム並列化方法。
【請求項１９】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置を構成するコンピュータを、
前記入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するフォーク箇所決定手段、
前記フォーク箇所決定手段により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するフォーク箇所組合せ決定手段、
前記フォーク箇所組合せ決定手段により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成する並列化プログラム出力手段、
として機能させ、且つ、前記フォーク箇所組合せ決定手段は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎にその分割区間において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求め、該求めた各分割区間での最適な組合せを１つに統合するものであることを特徴とするプログラム。
【請求項２０】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置を構成するコンピュータを、
前記入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するフォーク箇所決定手段、
前記フォーク箇所決定手段により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するフォーク箇所組合せ決定手段、
前記フォーク箇所組合せ決定手段により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成する並列化プログラム出力手段、
として機能させ、且つ、前記フォーク箇所組合せ決定手段は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を取得して記憶部に記憶する逐次実行トレース情報取得部と、前記取得された逐次実行トレース情報を複数の区間に分割する分割部と、各分割区間毎にその分割区間の逐次実行トレース情報において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求めて記憶部に記憶する組合せ決定部と、それらの複数の最適な組合せを１つに統合する統合部とを備えることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、逐次処理プログラムからマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するプログラム並列化装置及びその方法に関する。
【背景技術】
【０００２】
単一の逐次処理プログラムを並列プロセッサシステムで並列に処理する手法として、プログラムをスレッドと呼ぶ命令流に分割して複数のプロセッサで並列に実行するマルチスレッド実行方法がある（例えば、特許文献１〜４、非特許文献１参照）。マルチスレッド実行を行う並列プロセッサを、マルチスレッド型並列プロセッサと呼ぶ。以下、これらの従来のマルチスレッド実行方法及びマルチスレッド型並列プロセッサについて説明する。
【０００３】
一般にマルチスレッド実行方法及びマルチスレッド型並列プロセッサにおいて、他のプロセッサ上に新たなスレッドを生成することを、スレッドをフォーク（ｆｏｒｋ）すると言い、フォーク動作を行った側のスレッドを親スレッド、生成された新しいスレッドを子スレッド、スレッドをフォークするプログラム位置をフォーク元アドレスまたはフォーク元ポイント、子スレッドの先頭のプログラム位置をフォーク先アドレスまたはフォーク先ポイントまたは子スレッドの開始点と呼ぶ。特許文献１〜４および非特許文献１では、スレッドのフォークを指示するためにフォーク元ポイントにフォーク命令が挿入される。フォーク命令にはフォーク先アドレスが指定され、フォーク命令の実行によりそのフォーク先アドレスから始まる子スレッドが他プロセッサ上に生成され、子スレッドの実行が開始される。また、スレッドの処理を終了させるプログラム位置をターム（ｔｅｒｍ）点と呼び、各プロセッサはスレッドの処理を終了する。
【０００４】
図２２に、マルチスレッド型並列プロセッサにおけるマルチスレッド実行方法の処理の概要を示す。同図（ａ）は３つのスレッドＡ、Ｂ、Ｃに分割された単一の逐次処理プログラムを示す。このプログラムを単一のプロセッサで処理する場合、同図（ｂ）に示すように１つのプロセッサＰＥがスレッドＡ、Ｂ、Ｃを順番に処理していく。これに対して、特許文献１〜４および非特許文献１のマルチスレッド型並列プロセッサにおけるマルチスレッド実行方法では、同図（ｃ）に示すように、１つのプロセッサＰＥ１にスレッドＡを実行させ、プロセッサＰＥ１でスレッドＡを実行している最中に、スレッドＡに埋め込まれたフォーク命令によってスレッドＢを他のプロセッサＰＥ２に生成し、プロセッサＰＥ２においてスレッドＢを実行させる。また、プロセッサＰＥ２は、スレッドＢに埋め込まれたフォーク命令によってスレッドＣをプロセッサＰＥ３に生成する。プロセッサＰＥ１、ＰＥ２は、それぞれスレッドＢ、Ｃの開始点の直前のターム点においてスレッドの処理を終了し、プロセッサＰＥ３は、スレッドＣの最後の命令を実行すると、その次の命令（一般にはシステムコール命令）を実行する。このように、複数のプロセッサでスレッドを同時に並行して実行することにより、逐次処理に比べて性能の向上が図られる。
【０００５】
他のマルチスレッド実行方法として、図２２（ｄ）に示すように、スレッドＡを実行しているプロセッサＰＥ１からフォークを複数回行うことにより、プロセッサＰＥ２にスレッドＢを、またプロセッサＰＥ３にスレッドＣをそれぞれ生成するマルチスレッド実行方法も存在する。この図２２（ｄ）のモデルに対して、同図（ｃ）に示したように、スレッドはその生存中に高々１回に限って有効な子スレッドを生成することができるという制約を課したマルチスレッド実行方法をフォーク１回モデルと呼ぶ。フォーク１回モデルでは、スレッド管理の大幅な簡略化が可能となり、現実的なハードウェア規模でスレッド管理部のハードウェア化が実現できる。また、個々のプロセッサは子スレッドを生成する他プロセッサが１プロセッサに限定されるため、隣接するプロセッサを単方向にリング状に接続した並列プロセッサシステムでマルチスレッド実行が可能となる。
【０００６】
ここで、フォーク命令時、子スレッドを生成できる空きのプロセッサが存在しない場合の対処方法としては、親スレッドを実行しているプロセッサにおいて、子スレッドを生成できる空きのプロセッサが生じるまで、フォーク命令の実行をウエイトする典型的な方法以外に、特許文献４に示されるように、フォーク命令を無効化してフォーク命令以降の後続命令を引き続き実行した後、子スレッドの命令群を自ら実行する方法がある。
【０００７】
親スレッドが子スレッドを生成し、子スレッドに所定の処理を行わせるには、親スレッドのフォーク点におけるレジスタファイル中のレジスタのうち少なくとも子スレッドで必要なレジスタの値を親スレッドから子スレッドに引き渡す必要がある。このスレッド間のデータ引き渡しコストを削減するために、特許文献２及び非特許文献１では、スレッド生成時のレジスタ値継承機構をハードウェア的に備えている。これは、スレッド生成時に親スレッドのレジスタファイルの内容を子スレッドに全てコピーするものである。子スレッド生成後は、親スレッドと子スレッドのレジスタ値の変更は独立となり、レジスタを用いたスレッド間のデータの引き渡しは行われない。スレッド間のデータ引き渡しに関する他の従来技術としては、レジスタの値を命令によりレジスタ単位で個別に転送する機構を備えた並列プロセッサシステムも提案されている。
【０００８】
マルチスレッド実行方法では、実行の確定した先行スレッドを並列に実行することを基本とするが、実際のプログラムでは実行の確定するスレッドが充分に得られない場合も多い。また、動的に決定される依存やコンパイラ解析能力の限界等により並列化率が低く抑えられ、所望の性能が得られない可能性が生じる。このため、特許文献１では、制御投機を導入し、ハードウェア的にスレッドの投機実行をサポートしている。制御投機では、実行する可能性の高いスレッドを実行確定前に投機的に実行する。投機状態のスレッドは、実行の取り消しがハードウェア上可能である範囲内で仮実行を行う。子スレッドが仮実行を行っている状態を仮実行状態と言い、子スレッドが仮実行状態にあるとき親スレッドはスレッド仮生成状態にあると言う。仮実行状態の子スレッドでは共有メモリ及びキャッシュメモリへの書き込みは抑制され、別途設けた仮実行用バッファ（ｔｅｍｐｏｒａｒｙ  ｂｕｆｆｅｒ）に対して書き込みが行われる。投機が正しいことが確定すると、親スレッドから子スレッドに対して投機成功通知が出され、子スレッドは仮実行用バッファの内容を共有メモリ及びキャッシュメモリに反映し、仮実行用バッファを用いない通常の状態となる。また親スレッドは、スレッド仮生成状態からスレッド生成状態となる。他方、投機が失敗したことが確定すると、親スレッドでスレッド破棄命令（ａｂｏｒｔ）が実行され、子スレッド以下の実行がキャンセルされる。また、親スレッドは、スレッド仮生成状態からスレッド未生成状態となり、再び子スレッドの生成が可能になる。つまり、フォーク１回モデルでは、スレッド生成は高々１回に限定されるが、制御投機を行い、投機が失敗した場合には再びフォークが可能となる。この場合においても、有効な子スレッドは高々１つである。
【０００９】
スレッドはその生存中に高々１回に限って有効な子スレッドを生成するというフォーク１回モデルのマルチスレッド実行を実現するために、例えば非特許文献１等では、逐次処理プログラムから並列化プログラムを生成するコンパイルの段階で、全てのスレッドが有効なフォークを１回しか実行しない命令コードになるように制限している。即ち、フォーク１回制限を並列化プログラム上において静的に保証している。一方、特許文献３では、親スレッド中に存在する複数のフォーク命令のうちから有効な子スレッドを生成する１つのフォーク命令を親スレッドの実行中に選択することにより、フォーク１回制限をプログラム実行時に保証している。
【００１０】
次に、マルチスレッド実行を行う並列プロセッサ向けの並列プログラムを生成する従来技術について説明する。
【００１１】
図２３を参照すると、従来のプログラム並列化装置１０は、逐次処理プログラム１３を入力し、制御・データフロー解析部１１によって逐次処理プログラム１３の制御フローおよびデータフローを解析し、次いでその結果に基づき、フォーク挿入部１２において、基本ブロックあるいは複数の基本ブロックを並列化の単位、つまり各条件分岐命令の箇所をフォーク箇所の候補とし、制御フローおよびデータフローの解析結果を参照して、より並列実行性能が得られるフォーク箇所にフォーク命令を挿入して、複数のスレッドに分割された並列化プログラム１４を生成し出力する。
【００１２】
図２３では、逐次コンパイラが生成した逐次処理プログラム１３から並列化プログラム１４を生成するプログラム並列化装置１０を示したが、特許文献５に示されるように高級言語で記述されたプログラムからマルチスレッド型並列プロセッサ向けの目的プログラムを生成することも行われている。また、プログラム実行時にしか判明しないプログラム実行フローやメモリ依存関係などの影響により、静的な解析に基づいたフォーク命令の挿入方法では所望の並列実行性能を得られない場合がある。このため、特許文献５に見られるように、逐次実行を行ったときの条件分岐確率やデータ依存発生頻度などのプロファイル情報を参照して、フォーク箇所を選択することも行われている。ただし、この場合であっても、フォーク箇所の候補は条件分岐命令の箇所としている。
【特許文献１】特開１０−２７１０８号公報
【特許文献２】特開１０−７８８８０号公報
【特許文献３】特開２００３−０２９９８５号公報
【特許文献４】特開２００３−０２９９８４号公報
【特許文献５】特開２００１−２８２５４９号公報
【非特許文献１】「Ｏｎ  Ｃｈｉｐ  Ｍｕｌｔｉｐｒｏｃｅｓｓｏｒ指向  制御並列アーキテクチャＭＵＳＣＡＴの提案」（並列処理シンポジュウムＪＳＰＰ９７論文集、情報処理学会、ｐｐ．２２９−２３６、Ｍａｙ  １９９７）
【発明の開示】
【発明が解決しようとする課題】
【００１３】
従来の問題点は、よりよい並列実行性能のフォーク箇所を得ようとするにつれて、そのフォーク箇所の決定処理にますます時間がかかることである。その理由は、よりよい並列実行性能のフォーク箇所を得るために、候補となるフォーク箇所の数そのものを増やせば増やすほど、最適なフォーク箇所の組合せを決定する処理に多くの時間がかかるためである。
【００１４】
本発明はこのような事情に鑑みて提案されたものであり、その目的は、並列実行性能のよりよい並列化プログラムを高速に生成することのできるプログラム並列化装置及びその方法を提供することにある。
【課題を解決するための手段】
【００１５】
本発明の第１のプログラム並列化装置は、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置において、前記入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するフォーク箇所決定部と、前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するフォーク箇所組合せ決定部と、前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成する並列化プログラム出力部とを備え、前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎にその分割区間において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求め、該求めた各分割区間での最適な組合せを１つに統合するものであることを特徴とする。
【００１６】
本発明の第２のプログラム並列化装置は、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置において、前記入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するフォーク箇所決定部と、前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するフォーク箇所組合せ決定部と、前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成する並列化プログラム出力部とを備え、前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を取得する逐次実行トレース情報取得部と、前記取得された逐次実行トレース情報を記憶する記憶部と、前記取得された逐次実行トレース情報を複数の区間に分割する分割部と、各分割区間毎にその分割区間の逐次実行トレース情報において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求める組合せ決定部と、前記求められた各分割区間での最適な組合せを記憶する記憶部と、それらの複数の最適な組合せを１つに統合する統合部とを備えることを特徴とする。
【００１７】
本発明の第３のプログラム並列化装置は、第２のプログラム並列化装置において、前記組合せ決定部は、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合からフォーク箇所の初期組合せを決定する初期組合せ決定部と、該初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する組合せ改善部とを含むことを特徴とする。
【００１８】
本発明の第４のプログラム並列化装置は、第２のプログラム並列化装置において、前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、前記各分割区間毎に各フォーク箇所毎の動的ブースト値および排他フォーク集合を求める動的フォーク情報取得部を備え、且つ、前記組合せ決定部は、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定する初期組合せ決定部と、該初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する組合せ改善部とを含むことを特徴とする。
【００１９】
本発明の第５のプログラム並列化装置は、第２のプログラム並列化装置において、前記フォーク箇所組合せ決定部は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、そのうちの最小のものを当該フォーク箇所の最小実行サイクル数と定義し、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、前記各分割区間毎に各フォーク箇所毎の最小実行サイクル数、動的ブースト値および排他フォーク集合を求める動的フォーク情報取得部と、前記フォーク箇所決定部により決定されたフォーク箇所の集合から、前記各分割区間毎に前記最小実行サイクル数および前記動的ブースト値が予め定められた足切り条件を満たすフォーク箇所を取り除いた集合を決定する動的足切り部とを備え、且つ、前記組合せ決定部は、前記動的足切り部により前記各分割区間毎に求められたフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定する初期組合せ決定部と、該初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する組合せ改善部とを含むことを特徴とする。
【００２０】
本発明の第６のプログラム並列化装置は、第４または第５のプログラム並列化装置において、前記統合部は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計が一定値以上のフォーク箇所の集合を、統合された最適組合せとするものであることを特徴とする。
【００２１】
本発明の第７のプログラム並列化装置は、第４または第５のプログラム並列化装置において、前記統合部は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計から排他フォーク集合中の各フォーク箇所の全分割区間での動的ブースト値の合計を引いた値が一定値以上のフォーク箇所の集合を、統合された最適組合せとするものであることを特徴とする。
【００２２】
本発明の第８のプログラム並列化装置は、第４または第５のプログラム並列化装置において、前記統合部は、排他関係のないフォーク箇所の組合せであって、全分割区間での動的ブースト値の合計が最大になる組合せを、統合された最適組合せとするものであることを特徴とする。
【００２３】
本発明の第９のプログラム並列化装置は、第８のプログラム並列化装置において、前記統合部は、何れかの分割区間での最適な組合せに含まれるフォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の全分割区間での動的ブースト値の合計を重みとして付与した重み付きグラフを生成する手段と、前記重み付きグラフの重み最大独立集合を求める手段と、求められた重み最大独立集合に含まれるノードに対応するフォーク箇所の集合を、統合された最適組合せとして出力する手段とを含むことを特徴とする。
【００２４】
本発明の第１のプログラム並列化方法は、ａ）フォーク箇所決定部が、入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するステップ、ｂ）フォーク箇所組合せ決定部が、前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するステップ、ｃ）並列プログラム出力部が、前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するステップ、を含み、且つ、前記ステップｂは、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎にその分割区間において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求め、該求めた各分割区間での最適な組合せを１つに統合する処理を含むことを特徴とする。
【００２５】
本発明の第２のプログラム並列化方法は、ａ）フォーク箇所決定部が、入力した逐次処理プログラムを解析してフォーク箇所の集合を決定するステップ、ｂ）フォーク箇所組合せ決定部が、前記フォーク箇所決定部により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定するステップ、ｃ）並列プログラム出力部が、前記フォーク箇所組合せ決定部により決定されたフォーク箇所の最適な組合せに基づいてマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するステップ、を含み、且つ、前記ステップｂは、ｂ−１）逐次実行トレース情報取得部が、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を取得するステップ、ｂ−２）前記取得された逐次実行トレース情報を記憶部に記憶するステップ、ｂ−３）分割部が、前記取得された逐次実行トレース情報を複数の区間に分割するステップ、ｂ−４）組合せ決定部が、各分割区間毎にその分割区間の逐次実行トレース情報において出現するフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを求めるステップ、ｂ−５）前記求められた各分割区間での最適な組合せを記憶部に記憶するステップ、ｂ−６）統合部が、各分割区間での最適な組合せを１つに統合するステップ、を含むことを特徴とする。
【００２６】
本発明の第３のプログラム並列化方法は、第２のプログラム並列化方法において、前記ステップｂ−４は、ｂ−４−１）初期組合せ決定部が、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合からフォーク箇所の初期組合せを決定するステップ、ｂ−４−２）組合せ改善部が、前記初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索するステップ、を含むことを特徴とする。
【００２７】
本発明の第４のプログラム並列化方法は、第２のプログラム並列化方法において、前記ステップｂは、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、動的フォーク情報取得部が、前記各分割区間毎に各フォーク箇所毎の動的ブースト値および排他フォーク集合を求めるステップを含み、且つ、前記ステップｂ−４は、ｂ−４−１）初期組合せ決定部が、前記各分割区間毎にその分割区間において出現するフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定するステップ、ｂ−４−２）組合せ改善部が、前記初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索するステップ、を含むことを特徴とする。
【００２８】
本発明の第５のプログラム並列化方法は、第２のプログラム並列化方法において、前記ステップｂは、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、そのうちの最小のものを当該フォーク箇所の最小実行サイクル数と定義し、その合計値を当該フォーク箇所の動的ブースト値と定義し、或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を当該フォーク箇所の排他フォーク集合と定義するとき、動的フォーク情報取得部が、前記各分割区間毎に各フォーク箇所毎の最小実行サイクル数、動的ブースト値および排他フォーク集合を求めるステップ、動的足切り部が、前記フォーク箇所決定部により決定されたフォーク箇所の集合から、前記各分割区間毎に前記最小実行サイクル数および前記動的ブースト値が予め定められた足切り条件を満たすフォーク箇所を取り除いた集合を決定するステップを含み、且つ、前記ステップｂ−４は、ｂ−４−１）初期組合せ決定部が、前記動的足切り部により前記各分割区間毎に求められたフォーク箇所の集合から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる初期組合せを決定するステップ、ｂ−４−２）組合せ改善部が、前記初期組合せ決定部により前記各分割区間毎に決定された初期組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索するステップ、を含むことを特徴とする。
【００２９】
本発明の第６のプログラム並列化方法は、第４または第５のプログラム並列化方法において、前記ステップｂ−６は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計が一定値以上のフォーク箇所の集合を、統合された最適組合せとすることを特徴とする。
【００３０】
本発明の第７のプログラム並列化方法は、第４または第５のプログラム並列化方法において、前記ステップｂ−６は、何れかの分割区間での最適な組合せに含まれ且つ全分割区間での動的ブースト値の合計から排他フォーク集合中の各フォーク箇所の全分割区間での動的ブースト値の合計を引いた値が一定値以上のフォーク箇所の集合を、統合された最適組合せとすることを特徴とする。
【００３１】
本発明の第８のプログラム並列化方法は、第４または第５のプログラム並列化方法において、前記ステップｂ−６は、排他関係のないフォーク箇所の組合せであって、全分割区間での動的ブースト値の合計が最大になる組合せを、統合された最適組合せとすることを特徴とする。
【００３２】
本発明の第９のプログラム並列化方法は、第８のプログラム並列化方法において、前記ステップｂ−６は、ｂ−６−１）何れかの分割区間での最適な組合せに含まれるフォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の全分割区間での動的ブースト値の合計を重みとして付与した重み付きグラフを生成するステップ、ｂ−６−２）前記重み付きグラフの重み最大独立集合を求めるステップ、ｂ−６−３）求められた重み最大独立集合に含まれるノードに対応するフォーク箇所の集合を、統合された最適組合せとして出力するステップ、を含むことを特徴とする。
【発明の効果】
【００３３】
本発明によれば、並列実行性能のよりよい並列化プログラムを高速に生成することができる。
【００３４】
その理由は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎に、フォーク箇所決定部が決定したフォーク箇所の集合に含まれるフォーク箇所のうち当該分割区間において出現するフォーク箇所の集合からフォーク箇所の最適な組合せを求め、最後に各分割区間でのフォーク箇所の最適な組合せを１つに統合しているためである。
【発明を実施するための最良の形態】
【００３５】
次に、本発明の実施の形態について図面を参照して詳細に説明する。
【００３６】
《第１の実施の形態》
図１−１を参照すると、本発明の第１の実施の形態にかかるプログラム並列化装置１００は、図示しない逐次コンパイラによって生成された機械語命令形式の逐次処理プログラム１０１を入力し、マルチスレッド型並列プロセッサ向けの並列化プログラム１０３を生成し出力する装置であり、入力となる逐次処理プログラム１０１を記憶する磁気ディスク等の記憶装置１０２と、出力となる並列化プログラム１０３を記憶する磁気ディスク等の記憶装置１０４と、逐次処理プログラム１０１を並列化プログラム１０３に変換する過程で生成される各種のデータを記憶する磁気ディスク等の記憶装置１０５と、逐次処理プログラム１０１を並列化プログラム１０３に変換する過程で使用する予め定められた各種のデータを記憶する磁気ディスク等の記憶装置１０６と、これらの記憶装置１０２、１０４、１０５および１０６に接続された中央処理装置等の処理装置１０７とで構成されている。また処理装置１０７は、フォーク箇所決定部１１０と、フォーク箇所組合せ決定部１２０と、並列化プログラム出力部１３０とを備えている。
【００３７】
このようなプログラム並列化装置１００は、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスクなどのコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にフォーク箇所決定部１１０、フォーク箇所組合せ決定部１２０および並列化プログラム出力部１３０といった機能手段を実現する。
【００３８】
フォーク箇所決定部１１０は、記憶装置１０２の記憶部１０１Ｍから逐次処理プログラム１０１を入力して解析し、並列化により適した逐次処理プログラムおよびフォーク箇所の集合を決定し、処理結果を中間データ１４１として記憶装置１０５の記憶部１４１Ｍに書き出す。好ましくは、フォーク箇所決定部１１０は、逐次処理プログラム１０１の一部の命令列をその命令列と等価な他の命令列にプログラム変換した少なくとも１つの逐次処理プログラムを生成し、逐次処理プログラム１０１およびプログラム変換によって生成した逐次処理プログラム毎に、予め定められたフォーク箇所条件を満たすフォーク箇所の集合及びそのフォーク箇所集合の並列実行性能の指標となる値を求め、並列実行性能の指標となる値が最も優れているフォーク箇所の集合および逐次処理プログラムを選択する。さらに好ましくは、この選択したフォーク箇所の集合に含まれるフォーク箇所のうち、記憶装置１０６の記憶部１５１Ｍに予め記憶された静的足切り条件１５１を満たす静的ブースト値を持つものを集合中から取り除く。このフォーク箇所決定部１１０で決定されるフォーク箇所の集合には、互いに同時に実行できない排他関係にあるフォーク箇所が含まれる。
【００３９】
上記のプログラム変換の例として、逐次処理プログラムの命令の並べ替え、レジスタ割当の変更、或いはそれらの組合せがある。
【００４０】
上記のフォーク箇所条件として、「プログラム中のある区間をＢとすると、Ｂの出口で生存するレジスタに対して、Ｂ内で書き込みを行っていない場合、その区間の入口をフォーク元ポイント、出口をフォーク先ポイントとする」なる条件（以下、フォーク箇所条件１と称す）を採用することができる。また、フォーク箇所条件１より条件を緩和し、「プログラム中のある区間Ｂにおいて、Ｂの入口で生存（ａｌｉｖｅ）するレジスタをＡｈ、出口で生存するレジスタをＡｔとするとき、Ａｈ⊇Ａｔで、出口で生存するレジスタと、対応する入口のレジスタの値が一致するとき、入口をフォーク元ポイント、出口をフォーク先ポイントとする」なる条件（以下、フォーク箇所条件２と称す）を採用するようにしてもよい。
【００４１】
上記の並列実行性能の指標となる値としては、フォーク箇所の集合に含まれる各フォーク箇所の静的ブースト値の合計値、或いは、フォーク箇所の集合に含まれるフォーク箇所の総数を用いることができる。フォーク箇所の静的ブースト値は、フォーク箇所のフォーク元ポイントからフォーク先ポイントまでの全命令の重みの合計値を意味する。命令の重みは、実行サイクル数が多い命令ほど大きな値とされる。
【００４２】
フォーク箇所組合せ決定部１２０は、中間データ１４１を入力し、フォーク箇所決定部１１０により決定されたフォーク箇所の集合に含まれるフォーク箇所の最適な組合せを決定し、処理結果を中間データ１４２として記憶装置１０５の記憶部１４２Ｍに書き出す。好ましくは、フォーク箇所組合せ決定部１２０は、フォーク箇所決定部１１０で決定された並列化により適した逐次処理プログラムを記憶装置１０６の記憶部１５２Ｍに予め記憶された入力データ１５２の下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎に以下の処理ａ〜ｃを実行することにより、フォーク箇所決定部１１０が決定したフォーク箇所の集合に含まれるフォーク箇所のうち当該分割区間において出現するフォーク箇所の集合からフォーク箇所の最適な組合せを求め、最後に各分割区間でのフォーク箇所の最適な組合せを１つに統合する。
【００４３】
ａ）フォーク箇所決定部１１０により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。
【００４４】
動的ブースト値は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、その合計の実行サイクル数のことを意味する。
【００４５】
最小実行サイクル数は、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所がｎ回出現し、各回におけるフォーク元ポイントからフォーク先ポイントまでの実行サイクル数がＣ1、Ｃ2、…、ＣNであった場合、ｎ個中でのその最小の実行サイクル数を意味する。
【００４６】
或るフォーク箇所の排他フォーク集合とは、逐次処理プログラムを或る入力データの下で実行した場合に或るフォーク箇所と同時に実行できない他のフォーク箇所の集合を意味する。
【００４７】
ｂ）フォーク箇所決定部１１０により決定されたフォーク箇所の集合に含まれるフォーク箇所のうち、その動的ブースト値が記憶装置１０６の記憶部１５３Ｍに予め記憶された動的足切り条件１５３を満たすフォーク箇所を取り除く。
【００４８】
ｃ）上記ｂの動的足切り処理後のフォーク箇所の集合に含まれるフォーク箇所のうち、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる組合せを生成する。また好ましくは、この生成した組合せを初期解として、反復改善法によって、並列実行性能のよりよい組合せを探索する。
【００４９】
並列化プログラム出力部１３０は、中間データ１４１および中間データ１４２を入力し、フォーク箇所組合せ決定部１２０が決定したフォーク箇所の最適組合せに含まれる各フォーク箇所にフォーク命令を挿入することにより、フォーク箇所決定部１１０が決定した並列化により適した逐次処理プログラムから並列化プログラム１０３を生成し、後処理として、記憶装置１０４の記憶部１０３Ｍに書き出す。また好ましくは、並列化プログラム出力部１３０は、フォーク箇所組合せ決定部１２０により決定された最適な組合せ中のフォーク箇所のフォーク元ポイントおよびフォーク先ポイントをまたいだ命令の入れ替えは行わないという制限の下に、命令スケジューリングを行う。
【００５０】
次に本実施の形態にかかるプログラム並列化装置１００の概略動作を説明する。
【００５１】
図１−２を参照すると、本実施の形態にかかるプログラム並列化装置１００は、起動されると、処理装置１０７のフォーク箇所決定部１１０により、逐次処理プログラム１０１及びその一部の命令列をそれと等価な他の命令列に変換した少なくとも１つの逐次処理プログラムを解析し、それら複数の逐次処理プログラムのうち、より並列化に適した逐次処理プログラムを選択する（ステップＳ１１）。また、フォーク箇所決定部１１０により、前記選択した逐次処理プログラムからフォーク箇所を網羅的に抽出し（ステップＳ１２）、その抽出したフォーク箇所のうち、静的ブースト値が静的足切り条件１５１を満たすものを取り除く（ステップＳ１３）。
【００５２】
次に、処理装置１０７のフォーク箇所組合せ決定部１２０により、フォーク箇所決定部１１０で決定された並列化により適した逐次処理プログラムを入力データ１５２の下で実行したときの逐次実行トレース情報を生成し、それを複数の区間に分割する（ステップＳ１４）。そして、フォーク箇所組合せ決定部１２０により、逐次実行トレース情報の各分割区間毎にステップＳ１５〜Ｓ１８の処理を繰り返す。ステップＳ１５では、フォーク箇所決定部１１０により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。ステップＳ１６では、求められた動的ブースト値および最小実行サイクル数と動的足切り条件１５３とを比較し、動的足切り条件１５３を満たすフォーク箇所を取り除く。ステップＳ１７では、動的足切り後のフォーク箇所から、並列実行性能のよいフォーク箇所の初期組合せを生成し、この初期組合せを初期解としてステップＳ１８で反復改善法により最適な組合せを探索する。次に、フォーク箇所組合せ決定部１２０により、各分割区間での最適な組合せを適当な基準で統合して、１つの最適なフォーク箇所の組合せを生成する（ステップＳ１９）。
【００５３】
最後に、並列化プログラム出力部１３０により、必要に応じて後処理を行った後（ステップＳ２０）、フォーク箇所組合せ決定部１２０で決定された最適なフォーク箇所の組合せに基づいて、フォーク箇所決定部１１０が決定した並列化により適した逐次処理プログラムにフォーク命令を挿入して並列化プログラム１０３を生成する（ステップＳ２１）。
【００５４】
次に、本実施の形態の効果を説明する。
【００５５】
本実施の形態によれば、並列実行性能のよりよい並列化プログラムを生成することができる。
【００５６】
その理由は、入力となる逐次処理プログラムそのものだけでなく、それをプログラム変換した等価な逐次処理プログラムも考慮に入れ、入力となる逐次処理プログラムよりも並列実行性能の指標値の良い等価な逐次処理プログラムが見つかれば、その逐次処理プログラムから並列化プログラムを生成するようにしているためである。なお、入力の逐次処理プログラムと等価な逐次処理プログラムを命令の並べ替えによって生成する場合、変換後の逐次処理プログラムの逐次性能が入力の逐次処理プログラムより低下している可能性があるが、その影響は、後処理において実施する命令スケジューリングによって緩和することができる。
【００５７】
また本実施の形態によれば、並列実行性能のよりよい並列化プログラムを高速に生成することができる。
【００５８】
その第１の理由は、静的足切りおよび動的足切りの少なくとも一方により、並列実行性能への寄与が少ないフォーク箇所を処理の早い段階で切り捨てているため、動的フォーク情報の収集処理、最適なフォーク箇所の組合せ決定処理などの後続の処理の時間が短縮されるためである。
【００５９】
また第２の理由は、逐次処理プログラムを或る入力データの下で実行したときの逐次実行トレース情報を複数の区間に分割し、各分割区間毎に、フォーク箇所決定部が決定したフォーク箇所の集合に含まれるフォーク箇所のうち当該分割区間において出現するフォーク箇所の集合からフォーク箇所の最適な組合せを求め、最後に各分割区間でのフォーク箇所の最適な組合せを１つに統合しているためである。つまり、フォーク箇所の最適な組合せを決定するのに要する処理時間は候補となるフォーク箇所の数に応じて指数関数的に増加するが、各分割区間において出現するフォーク箇所の集合は、フォーク箇所決定部が決定したフォーク箇所の集合の部分集合になるため、全フォーク箇所の集合から一度に最適なフォーク箇所の組合せを求める場合に比べて、フォーク箇所の最適な組合せを求める処理に要する時間が大幅に短くなり、後の統合時間を加味しても全体的な時間が短縮されるからである。
【００６０】
また第３の理由は、フォーク箇所組合せ決定部において、フォーク箇所の集合に含まれるフォーク箇所のうち、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる組合せを生成しており、この生成される組合せは最適な組合せに近いため、その組合せを初期解として反復改善法によって並列実行性能のよりよい組合せをさらに探索する際の処理時間が大幅に短縮できるからである。
【００６１】
次に、本実施の形態にかかるプログラム並列化装置１００の各部の詳細を説明する。
【００６２】
まず、フォーク箇所決定部１１０について詳細に説明する。
【００６３】
図２を参照すると、フォーク箇所決定部１１０は、フォーク箇所網羅部１１１、静的足切り部１１２、例えば記憶装置１０５上のワーク領域１１３〜１１５で構成される。
【００６４】
フォーク箇所網羅部１１１は、逐次処理プログラム１０１およびその一部の命令列を他の命令列に変換した少なくとも１つの逐次処理プログラムのうち、並列実行性能のよりよい並列化プログラムを生成するのに適した逐次処理プログラムを決定し、この決定した逐次処理プログラムのフォーク箇所の集合を網羅的に求める部分である。このフォーク箇所網羅部１１１は、制御・データフロー解析部１１１１、プログラム変換部１１１２、フォーク箇所抽出部１１１３、並列実行性能の指標値算出部１１１４および選択部１１１５から構成される。
【００６５】
図３にフォーク箇所網羅部１１１の処理例を示す。図３を参照すると、フォーク箇所網羅部１１１は、まず、入力の逐次処理プログラム１０１をワーク領域１１３の記憶部１１３１Ｍに格納し、制御・データフロー解析部１１１１により逐次処理プログラム１０１を解析して、制御フローグラフ（ｃｏｎｔｒｏｌ  ｆｌｏｗ  ｇｒａｐｈ）およびデータ依存グラフ（ｄａｔａ  ｄｅｐｅｎｄｅｎｃｅ  ｇｒａｐｈ）を含む制御・データフロー解析結果１１３２を記憶部１１３２Ｍに格納する（ステップＳ１０１）。
【００６６】
制御フローグラフは、プログラムの分岐や合流の様子をグラフで表現したもので、分岐も合流もない部分（これは基本ブロック（Ｂａｓｉｃ  Ｂｌｏｃｋ）と呼ばれる）をノード（ｎｏｄｅ）とし、それらの間を分岐や合流を表すエッジ（ｅｄｇｅ）で結んだ有向グラフである。制御フローグラフに関する詳しい解説は、『コンパイラの構成と最適化』（２００４年３月２０日、朝倉書店発行。以下、参考文献１と称す）の第２６８頁〜第２７０に記載されている。また、データ依存グラフは、プログラム内のデータ依存関係（定義と使用の関係）をグラフで表現したものである。データ依存グラフに関する詳しい解説は、参考文献１の第３３６頁、第３６５頁に記載されている。
【００６７】
次にフォーク箇所網羅部１１１は、フォーク箇所抽出部１１１３により、制御・データフロー解析結果１１３２を参照して、入力の逐次処理プログラム１０１のフォーク箇所をすべて抽出し、フォーク箇所の集合１１３３として記憶部１１３３Ｍに格納する（ステップＳ１０２）。ここで、フォーク箇所は、フォーク元ポイント（フォーク元アドレス）とフォーク先ポイント（フォーク先アドレス）の組で構成され、本明細書ではｆと表記する。また、フォーク元ポイントとフォーク先ポイントを明示する場合は、フォーク元ポイントをｉ、フォーク先ポイントをｊとした場合、ｆ（ｉ，ｊ）と表記する。
【００６８】
フォーク箇所抽出部１１１３の処理例を図４に示す。この処理例は、フォーク箇所条件１に適合するフォーク箇所を抽出する場合のものである。
【００６９】
図４を参照すると、フォーク箇所抽出部１１１３は、対象とする逐次処理プログラム中の全命令において、その命令の地点で生存している（ａｌｉｖｅ）レジスタを、その逐次処理プログラムの制御・データフロー解析結果を参照して調査し、メモリ等に記録する（ステップＳ１１１）。次に、対象とする逐次処理プログラム中の全命令の組合せの中から、フォーク元ポイントとみなす命令とフォーク先ポイントとみなす命令の組を決定し（ステップＳ１１２）、フォーク先ポイントの命令からフォーク元ポイントの命令まで、制御フローをたどることができるかどうかを調査する（ステップＳ１１３）。もし、たどれなければ、その組はフォーク箇所でないので、ステップＳ１１７へ進む。もし、たどることができれば、フォーク先ポイントで生存しているレジスタの値が、たどる途中で替えられていたかどうかを調べ（ステップＳ１１５）、変えられていれば、その組はフォーク箇所でないので、ステップＳ１１７へ進む。もし、変えられていなければ、その組をフォーク箇所としてフォーク箇所集合に出力し（ステップＳ１１６）、ステップＳ１１７へ進む。ステップＳ１１７では、対象とする逐次処理プログラム中の全命令の組合せに関してフォーク箇所の可能性を調査し終えたかどうかを判定し、未調査の命令の組合せが残っていれば、ステップＳ１１２に戻って上述した処理と同様の処理を繰り返す。全組合せについて調査し終えていれば、フォーク箇所の抽出処理を終了する。
【００７０】
次にフォーク箇所網羅部１１１は、並列実行性能の指標値算出部１１１４により、フォーク箇所の集合１１３３の並列実行性能の指標値１１３４を算出し、記憶部１１３４Ｍに格納する（ステップＳ１０３）。本例では、並列実行性能の指標値として、フォーク箇所の静的ブースト値の合計値を用いる。また、静的足切り部１１２の便宜のために合計値だけでなく個々のフォーク箇所の静的ブースト値もあわせて格納する。
【００７１】
或るフォーク箇所の静的ブースト値は、そのフォーク箇所のフォーク元ポイントの命令からフォーク先ポイントの命令までの全命令の重みの総和であり、逐次処理プログラムとその制御・データフロー解析結果から機械的に計算できる。例えば、制御・データフロー解析結果に基づいて逐次処理プログラムの重み付きデータフローグラフ（エッジに重みを付与したデータフローグラフ）を作成し、各フォーク箇所毎に、そのフォーク箇所のフォーク元ポイントからフォーク先ポイントに至る前記グラフ上の重みを累積すれば、各フォーク箇所毎の静的ブースト値が得られる。本明細書では、或るフォーク箇所ｆの静的ブースト値をｓｔａｔｉｃ＿ｂｏｏｓｔ（ｆ）と表記する。命令の重みとしては、例えば、その命令の実行に要するサイクル数が使用される。フォーク箇所の静的ブースト値の具体例を図５（ａ）に示すプログラムを用いて以下に示す。
【００７２】
図５（ａ）に示すプログラムの１行目と３行目は、レジスタｒ０、ｒ２に値１０、１０００を入れるｍｏｖ命令、２行目は、レジスタｒ０の値と値１００とを加算し、結果をレジスタｒ１に置くａｄｄ命令、４行目は、レジスタｒ２の値と値１０とで定まるメモリアドレスに格納されている値をレジスタｒ３にロードするｌｄｒ命令である。このプログラムでの１つのフォーク箇所を、フォーク元ポイントが１行目、フォーク先ポイントが３行目であるｆ（１，３）＝ｆ1とすると、命令の重みがｍｏｖとａｄｄで１の場合、当該フォーク箇所の静的ブースト値ｓｔａｔｉｃ＿ｂｏｏｓｔ（ｆ1）は２となる。
【００７３】
このような静的ブースト値およびその合計値が、並列実行性能の１つの指標にすることができる理由を図５（ｂ）の概念図を参照して説明する。図５（ｂ）の左側に示す単一のスレッドに、命令ａをフォーク元ポイント、命令ｂをフォーク先ポイントとするフォーク箇所を設定し、同図の右側に示すように２つのスレッドに分割して並列実行した場合を考える。このとき、同図のΔだけ実行時間が短縮されるが、このΔは、当該フォーク箇所のフォーク元ポイントａからフォーク先ポイントｂまでの命令の重みを加算した静的ブースト値に相当する。
【００７４】
次にフォーク箇所網羅部１１１は、プログラム変換部１１１２により、入力の逐次処理プログラム１０１の一部の命令列をそれと等価な他の命令列に変換した逐次処理プログラム１１４１を生成し、ワーク領域１１４の記憶部１１４１Ｍに格納する（ステップＳ１０４）。そして、入力の逐次処理プログラム１０１について求めた場合と同様に、プログラム変換して生成した逐次処理プログラム１１４１の制御・データフロー解析結果１１４２を制御・データフロー解析部１１１１により、その逐次処理プログラムのフォーク箇所の集合１１４３をフォーク箇所抽出部１１１３により、そのフォーク箇所の集合の並列実行性能の指標値１１４４を並列実行性能の指標値算出部１１１４により、それぞれ求めて、記憶部１１４２Ｍ、１１４３Ｍ、１１４４Ｍに格納する（ステップＳ１０５〜Ｓ１０７）。
【００７５】
入力の逐次処理プログラム１０１と等価かつそれぞれ互いに異なる複数の逐次処理プログラムを生成し、それらの制御・データフロー解析結果、フォーク箇所集合、並列実行性能の指標値を求めるようにしてもよい。この場合、ステップＳ１０４〜Ｓ１０７が複数回繰り返される。
【００７６】
最後に、フォーク箇所網羅部１１１は、選択部１１１５により、逐次処理プログラム１０１および１以上の逐次処理プログラム１１４１の中から、並列実行性能の指標値が最もよい、つまり静的ブースト値の合計値が最も大きい逐次処理プログラムを選択し、ワーク領域１１５の記憶部１１５１に逐次処理プログラム１１５１として格納する（ステップＳ１０８）。同時に、その逐次処理プログラム１１５１の制御・データフロー解析結果１１５２、フォーク箇所の集合１１５３、並列実行性能の指標値１１５４をワーク領域１１５の記憶部１１５２Ｍ、１１５３Ｍ、１１５４Ｍに格納する。
【００７７】
静的足切り部１１２は、フォーク箇所の集合１１５３に含まれるフォーク箇所のうち、その静的ブースト値が静的足切り条件１５１を満たすものを並列化性能への寄与が少ないものとして取り除き、残りのフォーク箇所だけをフォーク箇所の集合１４１３として記憶装置１０５の記憶部１４１Ｍにおける記憶部１４１３Ｍに書き出す。また、逐次処理プログラム１１５１とその制御・データフロー解析結果１１５２を記憶部１４１Ｍの記憶部１４１１Ｍ、１４１２Ｍに書き出す。
【００７８】
フォーク箇所の集合１１５３に含まれるフォーク箇所の静的ブースト値は、並列実行性能の指標値１１５４の中に記録されているので、静的足切り部１１２は、記録されている静的ブースト値と静的足切り条件１５１とを比較することにより、各フォーク箇所毎に、採用するか、捨て去るかを判断する。
【００７９】
静的足切り条件１５１の例を以下に示す。
静的足切り条件１：静的ブースト値＜Ｍｓ
静的足切り条件２：静的ブースト値＞Ｎｓ
【００８０】
静的ブースト値が下限閾値Ｍｓより小さなフォーク箇所を取り除く静的足切り条件１の根拠は、静的ブースト値が小さ過ぎる場合、並列化に伴うオーバヘッドに比べて当該フォーク箇所の寄与する並列効果が小さく、結果として当該フォーク箇所が並列化の性能に寄与しないからである。Ｍｓの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
【００８１】
静的ブースト値が上限閾値Ｎｓより大きなフォーク箇所を取り除く静的足切り条件２の根拠は、静的ブースト値が大き過ぎる場合、真依存関係（ＲＡＷ：Ｒｅａｄ  Ａｆｔｅｒ  Ｗｒｉｔｅ）の違反が発生し易くなり、結果として当該フォーク箇所が並列化の性能に寄与しないからである。図６−１（ａ）に真依存関係の簡単なイメージを示す。真依存関係とは、或るサイクルで書き込んだデータを、後で読み出すことである。図６−１（ａ）では、白丸の箇所でメモリの１００番地にストアしたデータを黒丸の箇所で再び読み出している。ここではメモリのデータを例に挙げているが、レジスタのデータなどでも同じである。逐次実行の場合、この依存関係においては問題は発生しないが、並列実行では、状況によって問題が発生する。今、図６−１（ａ）の単一のスレッドに、図示するフォーク元ポイントとフォーク先ポイントのフォーク箇所を設定し、図６−１（ｂ）に示すように複数のスレッドに分割して並列実行することを考える。本来ならば、白丸の箇所でストアされたデータを黒丸の箇所で読み出すはずが、図６−１（ｂ）では、黒丸のロード命令が白丸のストア命令を時間的に追い越して実行されている。つまり、真依存関係の違反が発生している。このような真依存関係の違反は、フォーク元ポイントからフォーク先ポイントまでのスレッド長が長ければ長いほど、つまり静的ブースト値が大きいほど発生し易くなる。真依存関係の違反が発生すると、子スレッドの再実行が行われるマルチスレッド型並列プロセッサでは、並列実行性能が低下する。
【００８２】
静的ブースト値が上限閾値Ｎｓより大きなフォーク箇所を取り除く他の理由は、子スレッドをフォークするプロセッサを自プロセッサの一方の隣接プロセッサに限定したリング型フォークモデルのマルチスレッド型並列プロセッサにおいては、静的ブースト値が大き過ぎると、各プロセッサが長時間にわたりビジー状態になるため、フォークの連鎖が途絶え、処理効率が低下するためである。図６−２（ａ）にその様子を示す。プロセッサ＃０からその隣接プロセッサ＃１に、プロセッサ＃１からその隣接プロセッサ＃２に、プロセッサ＃２からその隣接プロセッサ＃３にそれぞれ子スレッドをフォークし、プロセッサ＃３のフォーク点でプロセッサ＃０がフリー状態になっているため、プロセッサ＃３からプロセッサ＃０への子スレッドのフォークも成功しているが、このプロセッサ＃０に新たに生成されたスレッドのフォーク点では、隣接プロセッサ＃１がビジー状態であるためフォークが不可能になっている。このような場合、図６−２（ｂ）に示すように、プロセッサ＃０においてフォークをスキップ（無効化）し、本来隣接プロセッサ＃１で行うべき子スレッドを自身で実行するマルチスレッド型並列プロセッサでは、隣接プロセッサ＃１がフリー状態になるまで処理を待ち合わせるマルチスレッド型並列プロセッサ方法に比べて処理の効率が高まるとは言え、並列実行の性能は低下する。
【００８３】
上限閾値Ｎｓの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
【００８４】
次に、プログラム変換部１１１２の詳細を説明する。
【００８５】
プログラム変換部１１１２は、命令並べ替えおよびレジスタ割当変更の少なくとも一方を実施することにより、入力の逐次処理プログラム１０１と等価な逐次処理プログラム１１４１を少なくとも１つ生成する。以下、命令並べ替えとレジスタ割当変更について個別に説明する。
【００８６】
○命令並べ替え
通常、スーパスカラマシンなど命令レベル並列実行可能なプロセッサ向けの目的プログラムを生成する逐次コンパイラは、パイプラインストールを回避するためや命令レベル並列性を高めるため等を目的として、データ依存関係のある命令が互いになるべく離れる、つまり変数が利用されている期間である生存（ａｌｉｖｅ）区間が拡がるように命令を配置する最適化を行っている。この最適化は一般に命令スケジューリングと呼ばれるが、このような最適化がスレッド並列性の抽出を阻害する要因となり得る。なぜなら、命令スケジューリングによって変数の生存区間が拡がると、抽出できるフォーク箇所の候補数が減って静的ブースト値の合計である並列実行性能の指標値も減る場合があるためである。そこで、命令スケジューリングとは逆に、データ依存関係のある命令が互いになるべく近づく、つまり変数の生存区間が狭まるように命令を並べ替えた逐次処理プログラム１１４１を生成し、若し、元の逐次処理プログラム１０１より並列実行性能の指標値が改善されたならば、命令並べ替えした逐次処理プログラム１１４１を採用することで、よりよい並列実行性能の並列化プログラムが得られるようにする。
【００８７】
命令並べ替え処理では、任意のレジスタに書き込みを行う命令がある場合、当該レジスタを最終的に読み出す命令を、その書き込み命令に近づけるように命令を再配置する。ただし、データの依存関係を崩してはならない。レジスタのリネーミングを行う（命令追加、削除も行う）場合、命令間の真依存関係（ＲＡＷ）を満たす必要がある。レジスタのリネーミングを行わない場合、命令間の真依存関係（ＲＡＷ）、逆依存関係（ＷＡＲ）、出力依存関係（ＷＡＷ）を満たす必要がある。再配置する順序は、例えばブロックの上端から出現した命令から順に移動させても良い。基本ブロック内での命令並べ替えに限定し且つレジスタのリネーミングを行わずに命令の再配置を行う処理の一例を図７に示す。図７の処理は１つの基本ブロックに対する処理であり、制御フローを解析して逐次処理プログラムから抽出される各基本ブロックに対して同様の処理が繰り返される。
【００８８】
図７を参照すると、プログラム変換部１１１２は、まず、基本ブロックＢＢ内の各命令をノードとし、ＲＡＷ関係をエッジとするＤＡＧ（Ｄｉｒｅｃｔｅｄ  Ａｃｙｃｌｉｃ  Ｇｒａｐｈ：有向非循環グラフ）のグラフＧｒと、各命令をノードとし、ＲＡＷだけでなく全てのデータ依存関係（ＲＡＷ、ＷＡＲ、ＷＡＷ）をエッジとするＤＡＧのグラフＧａとを、図示しないメモリ上に作成する（ステップＳ２０１）。
【００８９】
次にプログラム変換部１１１２は、データ依存関係のあるノード集合のうち、基本ブロックの上端で生存中の変数からパスのあるノード集合を順次に抽出して、基本ブロック再配置用に確保した再配置ブロックの上端に近い空きエリアから順に配置していく（ステップＳ２０２〜Ｓ２０５）。具体的には、Ｇｒに、基本ブロックＢＢ上端で生存中の変数からＧｒでリーフノードへのパスがあるノード集合が存在するかどうかを判定し（ステップＳ２０２）、そのようなノード集合が存在すれば、そのうちコスト最小のノード集合ＮｒをＧｒから抜き出し（ステップＳ２０３）、Ｇａ中で当該Ｎｒへパスのあるノード集合ＮａをＧａから抜き出してＮｒとマージし（ステップＳ２０４）、再配置ブロックの上端に近い空きエリアからマージ後のＮｒを配置する（ステップＳ２０５）。ここで、コストとしては、例えば命令の実行サイクル数が使用される。
【００９０】
次にプログラム変換部１１１２は、データ依存関係のある残りのノード集合のうち、入力数（Ｉｎｄｅｇｒｅｅ）０のノード（レジスタに定数を設定する命令など、初期ＷＲＩＴＥのノード）から当該基本ブロックの下端で生存する変数につながるパスのあるノード集合を順次に抽出して、再配置ブロックの下端に近い空きエリアから順に配置していく（ステップＳ２０６〜Ｓ２０９）。具体的には、Ｇｒに、入力数０のノードから基本ブロックＢＢ下端で生存する変数につながるパスがあるノード集合が存在するかどうかを判定し（ステップＳ２０６）、そのようなノード集合が存在すれば、そのうちコスト最小のノード集合ＮｒをＧｒから抜き出し（ステップＳ２０７）、Ｇａ中で当該Ｎｒへパスのあるノード集合ＮａをＧａから抜き出してＮｒとマージし（ステップＳ２０８）、再配置ブロックの下端に近い空きエリアからマージ後のＮｒを配置する（ステップＳ２０９）。
【００９１】
最後にプログラム変換部１１１２は、データ依存関係のある残りのノード集合を順次に抽出して、再配置ブロックの上端に近い空きエリアから順に配置していく（ステップＳ２１０〜Ｓ２１３）。具体的には、Ｇｒにノード集合が残っているかどうかを判定し（ステップＳ２１０）、ノード集合が残っていれば、そのうちの任意のノード集合ＮｒをＧｒから抜き出し（ステップＳ２１１）、Ｇａ中で当該Ｎｒへパスのあるノード集合ＮａをＧａから抜き出してＮｒとマージし（ステップＳ２１２）、再配置ブロックの上端に近い空きエリアからマージ後のＮｒを配置する（ステップＳ２１３）。
【００９２】
次にプログラム変換部１１１２による命令並べ替え処理の具体例を説明する。
【００９３】
命令並べ替え前のプログラム例を図８−１に、このプログラムの制御の流れ（制御フロー）を図８−２に、それぞれ示す。このプログラムにおいて、基本ブロックＢＢ１から基本ブロックＢＢ２へ伝搬されるレジスタ（つまり基本ブロックＢＢ２の上端で生存するレジスタ）はレジスタｒ０、ｒ４である。また、基本ブロックＢＢ２から以降へ伝搬されるレジスタ（つまり基本ブロックＢＢ２の下端で生存するレジスタ）は、レジスタｒ２、ｒ３である。このプログラムのＲＡＷのみに注目したＤＡＧは図８−３に示すようになり、全てのデータ依存関係（ＲＡＷ、ＷＡＲ、ＷＡＷ）に注目したＤＡＧは図８−４に示すようになる。図中、実線の矢印がＲＡＷ、破線の矢印がＷＡＲまたはＷＡＷを示している。
【００９４】
今、基本ブロックＢＢ２内の命令の並べ替えを行うことを考える。ＲＡＷのＤＡＧで、基本ブロックＢＢ２の上端で生存する変数につながるパスを持つノード集合は、図８−３の（ａ）、（ｃ）であるが、この２つのうち、コストの小さい方は（ｃ）であるため、まず（ｃ）のノード集合の命令を基本ブロックの上端から配置していく。（ｃ）を配置し終わったら、続いて（ａ）のノード集合の命令を配置していく。しかし、（ａ）のノード集合を図８−４から参照すると、当該ノード集合につながるノード集合（図８−４（ａ）中の楕円で囲まれたノード集合、図８−３では（ｂ）がそれにあたる）が存在する。このため、この接続されたノード集合も加えて命令を配置する。ここまでの処理を終えた命令列が図８−５である。なお、図８−５には、基本ブロックＢＢ２以外の命令列は示していない。
【００９５】
次に、基本ブロックＢＢ２の下端で生存する変数につながるパスを持つノード集合に注目する。図８−３内では（ａ）と（ｄ）がそれにあたるが、既に（ａ）は配置済なので、残る（ｄ）の配置を行う。図８−４の（ａ）では、当該ノード集合につながる他のノード集合が存在するが、それらの命令は既に配置済なので、これは気にしなくてよい。
【００９６】
最後に、基本ブロックＢＢの上端および下端に生存する変数に依存しないノード集合に着目する（つまり、残りのノード集合）。残ったノード集合は図８−３の（ｅ）である。これを基本ブロックのできるだけ上の方から配置する。
【００９７】
上記の手順で並べ替えた結果が図８−６である。
【００９８】
図８−７は命令並べ替え前の命令列におけるレジスタの生存区間と書き込みの様子を示し、図８−８は命令並べ替え後の同様の様子を示す。図中、ｒ０などのレジスタの下に延びる縦の線がそのレジスタの生存区間を表している。また、縦線上の黒丸は当該レジスタへの書き込みが発生していることを示す。バツ印はその箇所の命令をもって、当該レジスタの生存区間が終了したことを表す。
【００９９】
フォーク箇所条件として、前述したフォーク箇所条件１および２のうち、より厳しいフォーク箇所条件１を使用するものとして、命令並べ替え前のフォーク箇所を求めると、ｆ（Ｐ０５，Ｐ０６）、ｆ（Ｐ０９，Ｐ１０）の２箇所である。これに対して命令並べ替え後のフォーク箇所は、ｆ（Ｐ０１，Ｐ０３）、ｆ（Ｐ０２，Ｐ０３）、ｆ（Ｐ０７，Ｐ０８）、ｆ（Ｐ１１，Ｐ１２）の４箇所になる。
【０１００】
○レジスタ割当変更
一般的に、変数がレジスタに割り付けられていれば、メモリに入っている場合よりもアクセスが速く、且つ取り出しや格納（ｌｏａｄ、ｓｔｏｒｅ）の命令が不要になるため、逐次処理プログラムを生成する逐次コンパイラは、基本的にそのようなレジスタ割当を実施する。しかし、レジスタの数には限度があるため、新たな変数を割り付けるレジスタが不足した場合、既にレジスタに割り付けられている変数のどれかをメモリに退避することによりレジスタを確保し、メモリに退避した変数に対し、後刻にレジスタを再度割り当てる場合がある。このとき、前回と同じレジスタが割り当てられる保証がないため、若し、逐次処理プログラム１０１において、別のレジスタが割り当てられていると、退避した時点と復帰した時点とでレジスタが一致しないために、退避した時点をフォーク元ポイント、復帰した時点をフォーク先ポイントとするようなフォーク箇所を抽出できない。そこで、プログラム変換部１１１２は、このような場合にレジスタ割当を退避と復帰時で一致させることにより、つまり変数の割り当てられるレジスタをできるだけ変えないようにレジスタ割当を変更した逐次処理プログラム１１４１を生成し、若し、元の逐次処理プログラム１０１より並列実行性能の指標値が改善されたならば、レジスタ割当変更した逐次処理プログラム１１４１を採用することで、よりよい並列実行性能の並列化プログラムが得られるようにする。
【０１０１】
レジスタ割当変更の処理例について、具体的な命令列を例に以下説明する。なお、説明を簡単にするために、プロセッサの使用できるレジスタは、レジスタｒ０、ｒ１の高々２つとする。
【０１０２】
図９−１はレジスタ割当変更前のプログラムの一例を示し、左側が言語Ｃのような高級言語による記述、右側がその高級言語を低級言語（擬似的なアセンブラ）に落とし込んだ記述を示し、入力の逐次処理プログラム１０１に相当する。特に表記がなければ、左側のプログラムのことをソースプログラムと呼び、右側のプログラムをターゲットプログラムと呼ぶことにする。
【０１０３】
図９−２は、ソースプログラムで用いられている変数（ａ〜ｄ）が、ターゲットプログラムでのレジスタに割り当てられてから必要なくなるまでの期間を表したものである。縦線の上のＰ０１などは、ターゲットプログラムの命令の横に表記してある識別子と一致している。横線の黒丸部分は該当する命令に含まれる期間、白丸は含まれないことを表す。例えば、変数ａの生存区間１（横線に割り振られている番号を参照）は、Ｐ０３の命令（ｓｔ  ｒ０，４０）まではレジスタに割り当てられているが、Ｐ０４の命令（ｌｄ  ｒ０，４４）ではすでに変数としては必要としていない、ということを表している。
【０１０４】
図９−３は、図９−２をもとに作成されたレジスタ干渉グラフである。レジスタ干渉グラフとは、ノードが任意のレジスタに任意の値もしくは変数が割り当てられている区間（つまり任意のレジスタの生存区間）で、生存区間の重なり合う２つの生存区間をエッジで結んだグラフである。ノードの番号は、図９−２の期間の横線の番号に対応している。ノードで、白いものと灰色のものとがあるが、これは割り付けられているレジスタの種類に対応する。白はターゲットプログラムでのレジスタｒ０、灰色はターゲットプログラムでのレジスタｒ１を表す。例えば、変数ａの生存区間１は、レジスタｒ０（白）に割り当てられているが、同じく変数ａの生存区間４はレジスタｒ１（灰色）に割り当てられているのがわかる。
【０１０５】
今、ターゲットプログラムの命令Ｐ０１から命令Ｐ０９までの命令列の中で、レジスタ割当の変更を考える。
【０１０６】
まず、図９−２を参照すると、生存区間１と生存区間４は同一変数（ａ）のものだということがわかる。そこで、まず図９−３のノード１とノード４を一緒にする。その結果が図９−４である。このとき、まだ各ノードへの色づけ（つまりレジスタ割当）は行っていない。そして、このグラフに対してｋ−彩色問題を解く。ｋ−彩色問題とは、グラフ上で、隣接するどのノードも同じ色にならないようにして、すべてのノードをｋ色で塗ることは可能か、という問題であり、本例においては、プロセッサで使用できるレジスタ数が２つなので、ｋは２になる。ｋ−彩色問題を解いた結果、判定がＹＥＳ（つまり、２色で彩色可能）ならば、実際にレジスタの割当を行い直す。一例として、彩色後のグラフを図９−５に示す。
【０１０７】
図９−５に従ってレジスタの割当を変更したターゲットプログラムを図９−６に示す。変更されている点は、Ｐ０７以降の変数ａと変数ｄの割り当てられるレジスタである。フォーク箇所条件として前述したフォーク箇所条件２を使った場合、レジスタ割当変更前の図９−１のターゲットプログラムでは、ｆ（Ｐ０３，Ｐ０４）、ｆ（Ｐ０６，Ｐ０７）の２つであるのに対し、レジスタ割当変更後の図９−６のターゲットプログラムでは、さらにｆ（Ｐ０２，Ｐ０７）、ｆ（Ｐ０２，Ｐ０８）、ｆ（Ｐ０３，Ｐ０７）、ｆ（Ｐ０３，Ｐ０８）、ｆ（Ｐ０４，Ｐ０７）、ｆ（Ｐ０４，Ｐ０８）が加わり、合計８個になる。
【０１０８】
次にフォーク箇所組合せ決定部１２０の詳細を説明する。
【０１０９】
図１０を参照すると、フォーク箇所組合せ決定部１２０は、逐次実行トレース情報取得部１２１、分割部１２２、繰り返し部１２３、統合部１２４、例えば記憶装置１０５上のワーク領域１２５で構成される。
【０１１０】
逐次実行トレース情報取得部１２１は、記憶部１４１の中間データ１４１に含まれる逐次処理プログラム（図２の１１５１）を、プロセッサあるいはシミュレータを使って、記憶部１５２Ｍに予め記憶された入力データ１５２の下に実行することにより、逐次実行トレース情報１２５１を生成し、ワーク領域１２５の記憶部１２５１Ｍに保存する。逐次実行トレース情報１２５１には、１マシンサイクル毎に、そのマシンサイクルで実行された逐次処理プログラム１１５１の命令文を特定するアドレスなどの識別情報が記録されている。また、逐次実行時の総サイクル数ＳＮも記録されている。
【０１１１】
分割部１２２は、記憶部１２５１Ｍに保存された逐次実行トレース情報を、予め定められた逐次実行サイクル数Ｎで分割し、得られた個々の逐次実行トレース部分情報１２５２を記憶部１２５２Ｍに保存する。逐次実行トレース情報１２５１の総実行サイクル数ＳＮがＮの整数倍でないとき、最後の１つの逐次実行トレース部分情報はサイズが小さくなる。若し、Ｎより十分に小さくなる場合には、１つ前の逐次実行トレース部分情報に合体させるようにしてもよい。逐次実行サイクル数Ｎの値にもよるが、１つの逐次実行トレース部分情報１２５２には、フォーク箇所決定部１１０により決定されたフォーク箇所の集合（図２の１４１３）に含まれるフォーク箇所の一部のみが現れる。
【０１１２】
繰り返し部１２３は、動的フォーク情報取得部１２３１、動的足切り部１２３２、初期組合せ決定部１２３３および組合せ改善部１２３４を備えており、分割部１２２が生成した個々の逐次実行トレース部分情報１２５２毎に、動的フォーク情報の取得、動的足切り、フォーク箇所の初期組合せの生成およびその改善を行う。以下、動的フォーク情報取得部１２３１、動的足切り部１２３２、初期組合せ決定部１２３３および組合せ改善部１２３４について説明する。
【０１１３】
動的フォーク情報取得部１２３１は、各逐次実行トレース部分情報１２５２毎に、フォーク箇所決定部１１０により決定されたフォーク箇所集合１４１３に含まれる各フォーク箇所毎の動的ブースト値、最小実行サイクル数および排他フォーク集合を求め、動的フォーク情報１２５３として記憶部１２５３Ｍに格納する。動的フォーク情報取得部１２３１の処理例を図１１に示す。
【０１１４】
図１１を参照すると、動的フォーク情報取得部１２３１は、まず、フォーク箇所集合１４１３に含まれる各フォーク箇所毎に、そのフォーク箇所の動的ブースト値、最小実行サイクル数および排他フォーク集合をそれぞれ保存するための構造体を記憶部１２５３Ｍに確保し、それらの値を初期値に設定する（ステップＳ３０１）。例えば、動的ブースト値は最小値に、最小実行サイクル数は最大値に、排他フォーク集合は空にそれぞれ初期設定する。ここで、排他集合を保存する構造体として、各ビットがフォーク箇所と１対１に対応し排他関係にあれば１が立つビット列を使用すれば、メモリ使用量を削減することができる。
【０１１５】
次に動的フォーク情報取得部１２３１は、フォーク箇所集合１４１３中の１つのフォーク箇所に注目し（ステップＳ３０２）、そのフォーク箇所のフォーク先ポイントが現れる箇所を逐次実行トレース部分情報１２５２の先頭から順に検索する（ステップＳ３０３）。該当する１つのフォーク先ポイントが見つかると（ステップＳ３０４でＮｏ）、見つかったフォーク先ポイントとペアになるフォーク先ポイントを逐次実行トレース部分情報１２５２から検索し（ステップＳ３０５）、逐次実行トレース部分情報１２５２上で前記フォーク元ポイントと前記フォーク先ポイントとの間の実行サイクル数をカウントする（ステップＳ３０６）。そして、構造体に保存されている注目中フォーク箇所の最小実行サイクル数と比較し（ステップＳ３０７）、今回の実行サイクル数の方が少なければ、最小実行サイクル数を今回の実行サイクル数に置き換える（ステップＳ３０８）。次に、構造体に保存されている注目中フォーク箇所の動的ブースト値に今回の実行サイクル数を加算する（ステップＳ３０９）。次に、フォーク箇所集合１４１３中の注目中フォーク箇所以外の他のフォーク箇所であって、注目中フォーク箇所の前記フォーク元ポイントとフォーク先ポイントの間にフォーク元ポイントおよびフォーク先ポイントの少なくとも一方が存在するフォーク箇所を調べ、それらを注目中のフォーク箇所の排他フォーク集合に入れる（ステップＳ３１０）。なお、ステップＳ３０３で検索したフォーク元ポイントとペアになるフォーク先ポイントが処理対象とする逐次実行トレース部分情報１２５２に存在しない場合もあり、そのときはステップＳ３０５の検索に失敗するが、その場合には、他の逐次実行トレース部分情報１２５２を検索するようにしてもよいし、或いはステップＳ３０６〜Ｓ３１０をスキップしてもよい。
【０１１６】
注目中のフォーク箇所に関する逐次実行トレース部分情報１２５２上の１つのフォーク元ポイントとフォーク先ポイントのペアについて上述した処理を終えると、ステップＳ３０３に戻り、当該注目中のフォーク箇所の別のフォーク元ポイントを逐次実行トレース部分情報１２５２から検索し、あれば前述の処理と同様の処理を繰り返す（ステップＳ３０５〜Ｓ３１０）。
【０１１７】
逐次実行トレース部分情報１２５２上に現れる注目中フォーク箇所のすべてについて上述した処理を終えると（ステップＳ３０４でＹｅｓ）、フォーク箇所集合１４１３中の次の１つのフォーク箇所に注目を移し（ステップＳ３１１）、前述の処理と同様の処理を繰り返す。フォーク箇所集合１４１３中の全てのフォーク箇所について前述した処理を終えると（ステップＳ３１２）、当該逐次実行トレース部分情報１２５２からの動的ブースト値、最小実行サイクル数および排他フォーク集合の取得処理を終える。なお、当該逐次実行トレース部分情報１２５２に現れないフォーク箇所の動的ブースト値、最小実行サイクル数および排他フォーク集合は、初期値のままになる。
【０１１８】
次に動的足切り部１２３２について説明する。
【０１１９】
動的足切り部１２３２は、フォーク箇所決定部１１０により決定されたフォーク箇所集合１４１３に含まれるフォーク箇所のうち、動的フォーク情報１２５３中の動的ブースト値および最小実行サイクル数が動的足切り条件１５３を満たすものを、並列化性能への寄与が少ないものとして取り除き、残りのフォーク箇所を動的足切り後のフォーク箇所集合１２５４として記憶部１２５４Ｍに格納する。動的足切り部１２３２の処理例を図１２に示す。
【０１２０】
図１２を参照すると、動的足切り部１２３２は、まず、フォーク箇所集合１４１３中の１つのフォーク箇所に注目し（ステップＳ３２１）、動的フォーク情報１２５３中の注目中フォーク箇所の動的ブースト値および最小実行サイクル数と動的足切り条件１５３とを比較する（ステップＳ３２２）。注目中のフォーク箇所の動的ブースト値および最小実行サイクル数の少なくとも一方が動的足切り条件１５３を満たす場合（ステップＳ３２３でＹｅｓ）、当該フォーク箇所は動的足切り後のフォーク箇所集合１２５４に記録せず、動的ブースト値および最小実行サイクル数の双方が動的足切り条件１５３を満たしていれば、当該フォーク箇所を動的足切り後のフォーク箇所集合１２５４に記録する（ステップ３２４）。
【０１２１】
動的足切り部１２３２は、フォーク箇所集合１４１３中の１つのフォーク箇所に注目して上述した処理を終えると、フォーク箇所集合１４１３中の次の１つのフォーク箇所に注目を移し（ステップＳ３２５）、前述の処理と同様の処理を繰り返す（ステップＳ３２２〜Ｓ３２４）。以上と同様の処理をフォーク箇所集合１４１３中の残りの全てのフォーク箇所について繰り返し終えると（ステップＳ３２６でＹｅｓ）、１つの動的フォーク情報１２５３に基づく動的足切り処理を終える。
【０１２２】
動的足切り条件１５３の例を以下に示す。
動的足切り条件１：（動的ブースト値／逐次実行サイクル）＜Ｍｄ
動的足切り条件２：最小サイクル数＞Ｎｄ
【０１２３】
動的足切り条件１における逐次実行サイクルは、動的ブースト値を取得した逐次実行トレース部分情報１２５２の総実行サイクル数、つまり分割に使用した逐次実行サイクル数Ｎを意味する。従って、動的ブースト値／逐次実行サイクルは、総実行サイクル数に対する当該フォーク箇所によって短縮される実行サイクル数の割合を意味する。この割合が下限閾値Ｍｄより小さなフォーク箇所を取り除く理由は、静的足切り条件１と同じである。Ｍｄの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
【０１２４】
動的足切り条件２を満たすフォーク箇所を取り除く理由は、静的足切り条件２の場合と同じである。Ｎｄの値を幾らに設定するかは、ターゲットとなるマルチスレッド型並列プロセッサのアーキテクチャに依存し、事前の実験などによって決定される。
【０１２５】
次に初期組合せ決定部１２３３について説明する。
【０１２６】
初期組合せ決定部１２３３は、動的足切り後のフォーク箇所集合１２５４と、動的フォーク情報１２５３中の排他フォーク集合および動的ブースト値とを入力し、キャンセルの発生しないフォーク箇所の組合せであって、動的ブースト値の合計が最大になる組合せを初期組合せ１２５５として生成し、記憶部１２５５Ｍに格納する。初期組合せ決定部１２３３の処理例を図１３に示す。
【０１２７】
図１３を参照すると、初期組合せ決定部１２３３は、まず、フォーク箇所集合１２５４中の各フォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の動的ブースト値を重みとして付与した重み付きグラフを生成する（ステップＳ４０１）。フォーク箇所どうしが排他関係にあるかどうかは、動的フォーク情報１２５３の各フォーク箇所毎の排他集合を参照して判断する。また、各フォーク箇所の動的ブースト値も動的フォーク情報１２５３から参照する。
【０１２８】
例えば図１４（ａ）の左側に示すような５つのフォーク箇所ｆ1［１５］、ｆ2［７］、ｆ3［１０］、ｆ4［５］、ｆ5［８］から構成されるフォーク箇所集合を考えてみる。［］内の数値は動的ブースト値を示し、図１４（ａ）において破線で結ばれたフォーク箇所どうしは排他関係にあることを示す。このようなフォーク箇所集合の場合、重み付きグラフは図１４（ｂ）の左側に示すようなグラフになる。
【０１２９】
次に初期組合せ決定部１２３３は、重み付きグラフの重み付き最大独立集合（Ｍａｘｉｍｕｍ  Ｗｅｉｇｈｔ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｓｅｔ）を求める（ステップＳ４０２）。重み付き最大独立集合とは、隣り合わない（つまり独立）頂点の集合であって、重みの和が最大となる集合のことである。重み付き最大独立集合を求める解法の例については後述するが、図１４（ｂ）の重み付き最大独立集合の解は、右側のグラフにおける黒丸の２つの頂点を含む集合になる。
【０１３０】
次に初期組合せ決定部１２３３は、求めた重み付き最大独立集合に含まれるノードに対応するフォーク箇所の集合を初期組合せ１２５５として記憶部１２５５Ｍに格納する（ステップＳ４０３）。図１４（ｂ）の場合、図１４（ａ）の右側に示すように、フォーク箇所ｆ1［１５］とフォーク箇所ｆ5［８］とを含む集合が初期組合せ１２５５となる。
【０１３１】
次に重み付き最大独立集合の解法例について説明する。
【０１３２】
今、図１５−１に示すような重み付きグラフを考える。グラフ中の各ノードがフォーク箇所を表し、ノードの横の数字がそのノードの重み（つまり動的ブースト値）を表す。また、ノードを接続するエッジが排他関係を表している。
【０１３３】
重み付き最大独立集合の近似アルゴリズムの一例を以下に示す。
【０１３４】
１．選択されていない、もしくは削除されていないノードの中で最も重みの大きいノードを選ぶ。
２．上記の１で選んだノードと接続しているノードをグラフから削除する。
３．選択できるノードがなくなるまで、上記の１と２を繰り返す。
【０１３５】
以上のアルゴリズムによる重み付き最大独立集合の解法例を、図１５−１のグラフを用いて以下に示す。
【０１３６】
まず最も重みの大きいフォーク箇所ｆ７を選択する。そして、フォーク箇所ｆ７に隣接するノードを削除する。その様子を図１５−２に示す。黒いノードが選択されたノード、灰色のノードは削除されたノードを表す。
【０１３７】
同様にして、選択および削除されていないノードの中で重み最大のノードであるフォーク箇所ｆ３を次に選択する。選択後の様子を図１５−３に示す。
【０１３８】
最後に残ったフォーク箇所ｆ１を選択し、処理を終了する。終了時点の様子を図１５−４に示す。結果として、選択されたフォーク箇所は、ｆ１、ｆ３、ｆ７の３つになる。
【０１３９】
次に組合せ改善部１２３４について説明する。
【０１４０】
組合せ改善部１２３４は、初期組合せ決定部１２３３が決定した初期組合せ１２５５、動的足切り後のフォーク箇所集合１２５４、中間データ１４１中の逐次処理プログラム１１５１およびその制御・データフロー解析結果１１５２を入力し、初期組合せ１２５５を初期解として、並列実行性能のよりよいフォーク箇所の組合せである最適組合せ１２５６を探索し、記憶部１２５６Ｍに書き出す。つまり、初期組合せ１２５５に対して僅かな変更を加えて得られる試行組合せを探索し、並列実行性能のよりよい試行組合せが得られれば、改めてこの試行組合せを初期解として探索を続ける、いわゆる反復改善法によって最適解を探索する。組合せ改善部１２３４の処理例を図１６に示す。
【０１４１】
組合せ改善部１２３４は、まず、動的足切り後のフォーク箇所集合１２５４に含まれるフォーク箇所を動的ブースト値の昇順にソートする（ステップＳ４１１）。次に、初期組合せ１２５５による並列実行をシミュレートし、初期組合せ１２５５による並列実行性能（例えば実行サイクル数）を取得する（ステップＳ４１２）。初期組合せ１２５５による並列実行は、逐次実行トレース部分情報１２５２を使って行うことができる。つまり、逐次実行トレース部分情報１２５２を初期組合せ１２５５に含まれるフォーク箇所で並列化したときの動作を、中間データ１４１に記録されている逐次処理プログラム１１５１の制御・データフロー解析結果、ターゲットとなるマルチスレッド型並列プロセッサのプロセッサ数などを参照して、シミュレートし、総実行サイクル数を求める。勿論、他の方法、例えば、初期組合せ１２５５に含まれるフォーク箇所に基づいて逐次処理プログラム１１５１から生成される並列化プログラムの動作を、ターゲットとなるマルチスレッド型並列プロセッサあるいはシミュレータで或る入力データの下に実行して総実行サイクルを求めるようにしてもよい。
【０１４２】
次に、組合せ改善部１２３４は、初期組合せ１２５５を現時点の最適な組合せである最適組合せに設定し（ステップＳ４１３）、以下のようにして反復改善法によって最適解を探索する。
【０１４３】
まず、最適組合せに含まれず且つ動的ブースト値の最も大きいフォーク箇所を前記ソート後のフォーク箇所集合１２５４から選択し、この選択したフォーク箇所を最適組合せに追加したものを試行組合せとする（ステップＳ４１４）。また、前記追加したフォーク箇所と排他関係にあるフォーク箇所が試行組合せに存在するかどうかを調べ、存在すればそれらを試行組合せから除去する（ステップＳ４１５）。そして、試行組合せによる並列実行をシミュレートし、試行組合せによる並列実行性能を取得する（ステップＳ４１６）。
【０１４４】
次に、試行組合せによる並列実行性能と最適組合せによる並列実行性能とを比較し、試行組合せの方が並列実行性能が良いかどうか、つまり並列実行性能が改善したかどうかを判定する（ステップＳ４１７）。若し、改善していれば、試行組合せを新たな最適組合せに設定し（ステップＳ４１８）、ステップＳ４１９の処理へ進む。他方、改善していなければ、最適組合せを現状のままにしてステップＳ４１９の処理へ進む。
【０１４５】
ステップＳ４１９において、組合せ改善部１４６は、現在の試行組合せに含まれるフォーク箇所と排他関係にないフォーク箇所であって且つ動的ブースト値が最も大きいフォーク箇所を前記ソート後のフォーク箇所集合１２５４から１つ選択し、この選択したフォーク箇所を現在の最適組合せに追加したものを、新たな試行組合せに設定する。そして、この試行組合せによる並列実行をシミュレートし、試行組合せによる並列実行性能を取得する（ステップＳ４２０）。
【０１４６】
次に、試行組合せによる並列実行性能と最適組合せによる並列実行性能とを比較し、試行組合せの方が並列実行性能が良いかどうか、つまり並列実行性能が改善したかどうかを判定する（ステップＳ４２１）。若し、改善していれば、試行組合せを新たな最適組合せに設定し（ステップＳ４２２）、ステップＳ４２３の処理へ進む。他方、改善していなければ、最適組合せを現状のままにしてステップＳ４２３の処理へ進む。
【０１４７】
ステップＳ４２３において、組合せ改善部１４６は、直前の２つの試行組合せの少なくとも一方で並列実行性能の改善があったかどうかを判定する。何れか一方でも並列実行性能の改善があった場合には、改善後の最適組合せから、よりよい組合せをさらに探索すべく、ステップＳ４１４の処理に戻って探索を続ける。
【０１４８】
他方、直前の２つの試行組合せの何れも並列実行性能が改善されていなかった場合、組合せ改善部１４６は、まだ選択していないフォーク箇所がフォーク箇所集合１２５４に残っているかどうかを判定し（ステップＳ４２４）、残っていれば、現在の最適組合せに含まれず且つ動的ブースト値が次に大きいフォーク箇所を前記ソート後のフォーク箇所集合１２５４から選択し、この選択したフォーク箇所を最適組合せに追加したものを試行組合せとし（ステップＳ４２５）、ステップＳ４１５に戻って上述した処理と同様の処理を繰り返す。一方、フォーク箇所集合１２５４に未選択のフォーク箇所が残っていなければ、もはや改善の余地がないとみなして、現在の最適組合せを最適組合せ１２５６として記憶部１２５６Ｍに書き出す（ステップＳ４２６）。
【０１４９】
次に、統合部１２４について説明する。
【０１５０】
統合部１２４は、繰り返し部１２３の組合せ改善部１２３４によって求められた各分割区間毎での最適組合せ１２５６を適当な基準を用いて１つに統合し、統合された最適組合せ１４２１として記憶部１４２に出力する。統合部１２４の処理例を図１７−１〜図１７−３に示す。
【０１５１】
図１７−１に示す方法では、まず、最適組合せ１２５６に含まれるフォーク箇所毎に、その動的ブースト値の合計を計算する（ステップＳ５０１）。例えば、最適組合せ１２５６が、Ａ０、Ａ１、Ａ２の３つとし、或るフォーク箇所ｆ1がＡ０とＡ１だけに含まれ、Ａ０の生成に使われた動的フォーク情報中でのフォーク箇所ｆ1の動的ブースト値が２０、Ａ１の生成に使われた動的フォーク情報中でのフォーク箇所ｆ1の動的ブースト値が３０とすると、フォーク箇所ｆ1の動的ブースト値の合計値は５０になる。
【０１５２】
次に、動的ブースト値の合計値が一定値以上のフォーク箇所の集合を、統合された最適組合せとする（ステップＳ５０２）。一定値としては、全フォーク箇所の動的ブースト値の合計値の平均などが考えられる。
【０１５３】
図１７−２に示す方法は、図１７−１に示した方法に、排他フォーク集合を考慮に入れて統合するようにしたものである。具体的には、図１７−１に示す方法と同様に、最適組合せ１２５６に含まれるフォーク箇所毎に、その動的ブースト値の合計を計算する（ステップＳ５１１）。次に、最適組合せに含まれるフォーク箇所毎に、その排他フォーク集合に含まれる各フォーク箇所の動的ブースト値の合計値を算出し、そのフォーク箇所の動的ブースト値の合計値から減算する（ステップＳ５１２）。例えば、前述した例において、フォーク箇所ｆ1と排他関係にあるフォーク箇所としてｆ2、ｆ3が例えばＡ２などに存在し、フォーク箇所ｆ2、ｆ3についてステップＳ５１１で算出された動的ブースト値の合計値をそれぞれ１０、１５とすると、その合計値２５がフォーク箇所ｆ1の動的ブースト値の合計値５０から減算される。
【０１５４】
次に、動的ブースト値の合計値が一定値以上のフォーク箇所の集合を、統合された最適組合せとする（ステップＳ５１３）。ここでの一定値としては、例えば０などの値が考えられる。
【０１５５】
図１７−３は、より高精度な方法で統合する例を示す。まず、図１７−１に示す方法と同様に、最適組合せ１２５６に含まれるフォーク箇所毎に、その動的ブースト値の合計を計算する（ステップＳ５２１）。次に、最適組合せに含まれるフォーク箇所毎に、その排他フォーク集合を求める。例えば、前述した例において、フォーク箇所ｆ1と排他関係にあるフォーク箇所が、全ての最適組合せを通じて、ｆ2とｆ3の２つであった場合、フォーク箇所ｆ1の排他フォーク集合は、ｆ2とｆ3を含む集合となる。
【０１５６】
次に、全ての最適組合せ１２５６中のフォーク箇所から、排他関係のないフォーク箇所の組合せであって、動的ブースト値の合計値が最大になる組合せを生成し、これを統合された最適組合せ１４２１とする（ステップＳ５２３〜Ｓ５２５）。具体的には、重み付き最大独立集合問題に置き換えて扱う。すなわち、まず、最適組合せ１２５６に含まれる各フォーク箇所をノードとし、排他関係にあるフォーク箇所どうしをエッジで結んだグラフであって、各ノードにそのノードに対応するフォーク箇所の動的ブースト値の合計値を重みとして付与した重み付きグラフを生成する（ステップＳ５２３）。次に、重み付きグラフの重み付き最大独立集合を求める（ステップＳ５２４）。そして、求めた重み付き最大独立集合に含まれるノードに対応するフォーク箇所の集合を、統合された最適組合せとする（ステップＳ５２５）。
【０１５７】
次に並列化プログラム出力部１３０の詳細を説明する。
【０１５８】
図１８を参照すると、並列化プログラム出力部１３０は、後処理部１３１、フォーク命令挿入部１３２、例えば記憶装置１０５上のワーク領域１３２で構成される。
【０１５９】
後処理部１３１は、中間データ１４１に含まれる逐次処理プログラム１１５１、その制御・データフロー解析結果１１５２、中間データ１４２に含まれる統合された最適組合せ１４２１を入力し、フォーク箇所決定部１１０におけるプログラム変換部１１１２において実施された命令並べ替えによる各スレッドの逐次性能に対する悪影響を緩和するための後処理を実施し、後処理を施した逐次処理プログラム１３３１をワーク領域１３３の記憶部１３３１Ｍに書き出す。
【０１６０】
具体的には、後処理部１３１は、統合された最適組合せ１４２１に含まれるフォーク箇所のフォーク元ポイントおよびフォーク先ポイントをまたいだ命令の入れ替えはしないという制限の下に、データ依存関係のある命令が互いになるべく離れる、つまり変数の生存区間が拡がるように命令の並べ替えを行う。これは、データ依存関係を壊さない範囲で、同じレジスタへのライトからリードまでの期間をできるだけ長くする既存のコンパイラにおける命令スケジューリング機能に、フォーク元ポイントとフォーク先ポイントをまたいだ命令の入れ替えは行わないという制限を持たせたものに相当する。
【０１６１】
プログラム変換部１１１２において、データ依存関係のある命令が互いになるべく近づく、つまり変数の生存区間が狭まるような命令の並べ替えが実施されていると、逐次処理性能が低下する可能性があるため、後処理部１３１で上述した処理を行うことにより、影響を緩和することができる。
【０１６２】
フォーク命令挿入部１３２は、後処理後の逐次処理プログラム１３３１と、中間データ１４２に含まれる統合された最適組合せ１４２１を入力し、最適組合せ１４２１に含まれる各フォーク箇所にフォーク命令を挿入することにより、逐次処理プログラム１３３１から並列化プログラム１０３を生成し、記憶部１０３Ｍに書き出す。
【０１６３】
《第２の実施の形態》
図１９−１を参照すると、本実施の形態にかかるプログラム並列化装置１００Ａは、第１の実施の形態にかかるプログラム並列化装置１００と比較して、フォーク箇所決定部１１０および並列化プログラム出力部１３０の代わりにフォーク箇所決定部１１０Ａおよび並列化プログラム出力部１３０Ａを備えている点で相違する。
【０１６４】
フォーク箇所決定部１１０Ａは、図２に示したフォーク箇所決定部１１０の構成要素からプログラム変換部１１１２およびワーク領域１１４などのプログラム変換に関連する部分を省略し、並列化プログラム出力部１３０Ａは、図１８に示した並列化プログラム出力部１３０の構成要素から後処理部１３１およびワーク領域１３３などの後処理に関連する部分を省略したものであり、入力の逐次処理プログラム１０１を並列化の対象とする。
【０１６５】
図１９−２を参照すると、本実施の形態にかかるプログラム並列化装置１００Ａは、起動されると、処理装置１０７のフォーク箇所決定部１１０Ａにより、逐次処理プログラム１０１を解析し、制御フローおよびデータフロー解析結果に基づいて逐次処理プログラム１０１からフォーク箇所を網羅的に抽出し（ステップＳ１２）、その抽出したフォーク箇所のうち、静的ブースト値が静的足切り条件１５１を満たすものを取り除く（ステップＳ１３）。次に、フォーク箇所組合せ決定部１２０において、第１の実施の形態と同様の処理を行う（ステップＳ１５〜Ｓ１９）。最後に、並列化プログラム出力部１３０Ａにおいて、フォーク箇所組合せ決定部１２０で決定された最適なフォーク箇所の組合せに基づいて入力の逐次処理プログラム１０１にフォーク命令を挿入し、並列化プログラム１０３を生成する（ステップＳ２１）。
【０１６６】
《第３の実施の形態》
図２０−１を参照すると、本実施の形態にかかるプログラム並列化装置１００Ｂは、第１の実施の形態にかかるプログラム並列化装置１００と比較して、フォーク箇所組合せ決定部１２０の代わりにフォーク箇所組合せ決定部１２０Ｂを備えている点で相違する。
【０１６７】
フォーク箇所組合せ決定部１２０Ｂは、図１０に示したフォーク箇所組合せ決定部１２０の繰り返し部１２３の初期組合せ決定部１３３３の代わりに簡略された初期組合せ決定部を備えている。
【０１６８】
図２０−２を参照すると、本実施の形態にかかるプログラム並列化装置１００Ｂは、起動されると、処理装置１０７のフォーク箇所決定部１１０により第１の実施の形態と同様の処理を行う（ステップＳ１１〜Ｓ１３）。
【０１６９】
次に、処理装置１０７のフォーク箇所組合せ決定部１２０Ｂにより、フォーク箇所決定部１１０で決定された並列化により適した逐次処理プログラムを入力データ１５２の下で実行したときの逐次実行トレース情報を生成し、それを複数の区間に分割する（ステップＳ１４）。そして、フォーク箇所組合せ決定部１２０Ｂにより、逐次実行トレース情報の各分割区間毎にステップＳ１５、Ｓ１６、Ｓ１７Ｂの処理を繰り返す。ステップＳ１５では、フォーク箇所決定部１１０により決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。ステップＳ１６では、求められた動的ブースト値および最小実行サイクル数と動的足切り条件１５３とを比較し、動的足切り条件１５３を満たすフォーク箇所を取り除く。ステップＳ１７Ｂでは、動的足切り後のフォーク箇所から、動的ブースト値のより大きな上位幾つかのフォーク箇所の組合せを初期組合せとして生成し、この初期組合せを初期解として反復改善法により最適な組合せを探索する。次に、フォーク箇所組合せ決定部１２０Ｂにより、各分割区間での最適な組合せを適当な基準で統合して、１つの最適なフォーク箇所の組合せを生成する（ステップＳ１９）。
【０１７０】
最後に、並列化プログラム出力部１３０により、第１の実施の形態と同様の処理を行う（ステップＳ２０、Ｓ２１）。
【０１７１】
《第４の実施の形態》
図２１−１を参照すると、本実施の形態にかかるプログラム並列化装置１００Ｃは、第１の実施の形態にかかるプログラム並列化装置１００と比較して、フォーク箇所決定部１１０およびフォーク箇所組合せ決定部１２０の代わりにフォーク箇所決定部１１０Ｃおよびフォーク箇所組合せ決定部１２０Ｃを備えている点で相違する。
【０１７２】
フォーク箇所決定部１１０Ｃは、図２に示したフォーク箇所決定部１１０の構成要素から静的足切り部１１２を省略した構成を持つ。
【０１７３】
フォーク箇所組合せ決定部１２０Ｃは、図１０に示したフォーク箇所組合せ決定部１２０の構成要素から動的足切り部１２３２を省略した構成を持つ。
【０１７４】
図２１−２を参照すると、本実施の形態にかかるプログラム並列化装置１００Ｃは、起動されると、処理装置１０７のフォーク箇所決定部１１０Ｃにより、逐次処理プログラム１０１及びその一部の命令列をそれと等価な他の命令列に変換した少なくとも１つの逐次処理プログラムを解析し、それら複数の逐次処理プログラムのうち、より並列化に適した逐次処理プログラムを選択し（ステップＳ１１）、また、前記選択した逐次処理プログラムからフォーク箇所を網羅的に抽出する（ステップＳ１２）。
【０１７５】
次に、処理装置１０７のフォーク箇所組合せ決定部１２０Ｃにより、フォーク箇所決定部１１０Ｃで決定された並列化により適した逐次処理プログラムを入力データ１５２の下で実行したときの逐次実行トレース情報を生成し、それを複数の区間に分割する（ステップＳ１４）。そして、フォーク箇所組合せ決定部１２０Ｃにより、逐次実行トレース情報の各分割区間毎にステップＳ１５、Ｓ１７Ｃ、Ｓ１８の処理を繰り返す。ステップＳ１５では、フォーク箇所決定部１１０Ｃにより決定されたフォーク箇所の集合に含まれるフォーク箇所毎に、当該分割区間の逐次実行トレース情報から、動的フォーク情報として、動的ブースト値、最小実行サイクル数および排他フォーク集合を求める。ステップＳ１７Ｃでは、フォーク箇所決定部１１０Ｃにより決定されたフォーク箇所の集合に含まれるフォーク箇所のうち、当該分割区間の逐次実行トレース情報に現れるトレース箇所から、並列実行性能のよいフォーク箇所の初期組合せを生成する。ステップＳ１８では、この初期組合せを初期解として、反復改善法により最適な組合せを探索する。次に、フォーク箇所組合せ決定部１２０Ｃにより、各分割区間での最適な組合せを適当な基準で統合して、１つの最適なフォーク箇所の組合せを生成する（ステップＳ１９）。
【０１７６】
最後に、並列化プログラム出力部１３０により、第１の実施の形態と同様の処理を行う（ステップＳ２０、Ｓ２１）。
【０１７７】
本実施の形態では、第１の実施の形態から静的足切りおよび動的足切り双方の構成部分を省略したが、何れか一方だけを省略した実施の形態も考えられる。
【０１７８】
《その他の実施の形態》
以上、本発明の実施の形態について説明したが、本発明は以上の実施の形態にのみ限定されず、その他各種の付加変更が可能である。例えば、前記各実施の形態において、組合せ改善部１２３４を省略した構成にすることも可能である。
【図面の簡単な説明】
【０１７９】
【図１−１】本発明の第１の実施の形態のプログラム並列化装置のブロック図である。
【図１−２】本発明の第１の実施の形態のプログラム並列化装置の処理の流れを示すフローチャートである。
【図２】本発明の第１の実施の形態のプログラム並列化装置におけるフォーク箇所決定部のブロック図である。
【図３】本発明の第１の実施の形態のプログラム並列化装置におけるフォーク箇所網羅部の処理例を示すフローチャートである。
【図４】本発明の第１の実施の形態のプログラム並列化装置におけるフォーク箇所抽出部の処理例を示すフローチャートである。
【図５】フォーク箇所の静的ブースト値の説明図である。
【図６−１】静的ブースト値が上限閾値Ｎｓより大きなフォーク箇所を取り除く静的足切り条件２を説明するための図である。
【図６−２】静的ブースト値が上限閾値Ｎｓより大きなフォーク箇所を取り除く静的足切り条件２を説明するための別の図である。。
【図７】本発明の第１の実施の形態のプログラム並列化装置におけるプログラム変換部が行う命令並べ替え処理の一例を示すフローチャートである。
【図８−１】命令並べ替え前のプログラム例を示す図である。
【図８−２】命令並べ替え前のプログラムの制御の流れを示す図である。
【図８−３】命令並べ替え前のプログラムのＲＡＷのみに注目した有向非循環グラフを示す図である。
【図８−４】命令並べ替え前のプログラムの全てのデータ依存関係（ＲＡＷ、ＷＡＲ、ＷＡＷ）に注目した有向非循環グラフを示す図である。
【図８−５】命令並べ替え途中のプログラムを示す図である。
【図８−６】命令並べ替え後のプログラムを示す図である。
【図８−７】命令並べ替え前の命令列におけるレジスタの生存区間と書き込みの様子を示す図である。
【図８−８】命令並べ替え後の命令列におけるレジスタの生存区間と書き込みの様子を示す図である。
【図９−１】レジスタ割当変更前のプログラムの一例を示す図である。
【図９−２】ソースプログラムで用いられている変数（ａ〜ｄ）が、ターゲットプログラムでのレジスタに割り当てられてから必要なくなるまでの期間を表した図である。
【図９−３】レジスタ干渉グラフの一例を示す図である。
【図９−４】複数のノードをマージしたレジスタ干渉グラフを示す図である。
【図９−５】レジスタ干渉グラフに対してｋ−彩色問題を解いた結果に基づき彩色したグラフを示す図である。
【図９−６】レジスタの割当を変更したターゲットプログラムを示す図である。
【図１０】本発明の第１の実施の形態のプログラム並列化装置におけるフォーク箇所組合せ決定部のブロック図である。
【図１１】本発明の第１の実施の形態のプログラム並列化装置における動的フォーク情報取得部の処理例を示すフローチャートである。
【図１２】本発明の第１の実施の形態のプログラム並列化装置における動的足切り部の処理例を示すフローチャートである。
【図１３】本発明の第１の実施の形態のプログラム並列化装置における初期組合せ決定部の処理例を示すフローチャートである。
【図１４】フォーク箇所集合から最適なフォーク箇所の組合せを求める問題が、重み付き最大独立集合問題に置き換えられる様子を示す図である。
【図１５−１】重み付きグラフの例を示す図である。
【図１５−２】重み付きグラフの重み付き最大独立集合を求める様子を示す図である。
【図１５−３】重み付きグラフの重み付き最大独立集合を求める様子を示す図である。
【図１５−４】重み付きグラフの重み付き最大独立集合を求める様子を示す図である。
【図１６】本発明の第１の実施の形態のプログラム並列化装置における組合せ改善部の処理例を示すフローチャートである。
【図１７−１】本発明の第１の実施の形態のプログラム並列化装置における統合部の処理例を示すフローチャートである。
【図１７−２】本発明の第１の実施の形態のプログラム並列化装置における統合部の別の処理例を示すフローチャートである。
【図１７−３】本発明の第１の実施の形態のプログラム並列化装置における統合部のさらに別の処理例を示すフローチャートである。
【図１８】本発明の第１の実施の形態のプログラム並列化装置における並列化プログラム出力部のブロック図である。
【図１９−１】本発明の第２の実施の形態のプログラム並列化装置のブロック図である。
【図１９−２】本発明の第２の実施の形態のプログラム並列化装置の処理の流れを示すフローチャートである。
【図２０−１】本発明の第２の実施の形態のプログラム並列化装置のブロック図である。
【図２０−２】本発明の第２の実施の形態のプログラム並列化装置の処理の流れを示すフローチャートである。
【図２１−１】本発明の第３の実施の形態のプログラム並列化装置のブロック図である。
【図２１−２】本発明の第３の実施の形態のプログラム並列化装置の処理の流れを示すフローチャートである。
【図２２】マルチスレッド実行方法の概要を説明する図である。
【図２３】従来のプログラム並列化装置の構成例を示すブロック図である。
【符号の説明】
【０１８０】
１００…プログラム並列化装置
１０１…逐次処理プログラム
１０２、１０４〜１０６…記憶装置
１０３…並列化プログラム
１１０…フォーク箇所決定部
１２０…フォーク箇所組合せ決定部
１３０…並列化プログラム出力部
【図１−１】
2006018447.tif 000003
【図１−２】
2006018447.tif 000004
【図２】
2006018447.tif 000005
【図３】
2006018447.tif 000006
【図４】
2006018447.tif 000007
【図５】
2006018447.tif 000008
【図６−１】
2006018447.tif 000009
【図６−２】
2006018447.tif 000010
【図７】
2006018447.tif 000011
【図８−１】
2006018447.tif 000012
【図８−２】
2006018447.tif 000013
【図８−３】
2006018447.tif 000014
【図８−４】
2006018447.tif 000015
【図８−５】
2006018447.tif 000016
【図８−６】
2006018447.tif 000017
【図８−７】
2006018447.tif 000018
【図８−８】
2006018447.tif 000019
【図９−１】
2006018447.tif 000020
【図９−２】
2006018447.tif 000021
【図９−３】
2006018447.tif 000022
【図９−４】
2006018447.tif 000023
【図９−５】
2006018447.tif 000024
【図９−６】
2006018447.tif 000025
【図１０】
2006018447.tif 000026
【図１１】
2006018447.tif 000027
【図１２】
2006018447.tif 000028
【図１３】
2006018447.tif 000029
【図１４】
2006018447.tif 000030
【図１５−１】
2006018447.tif 000031
【図１５−２】
2006018447.tif 000032
【図１５−３】
2006018447.tif 000033
【図１５−４】
2006018447.tif 000034
【図１６】
2006018447.tif 000035
【図１７−１】
2006018447.tif 000036
【図１７−２】
2006018447.tif 000037
【図１７−３】
2006018447.tif 000038
【図１８】
2006018447.tif 000039
【図１９−１】
2006018447.tif 000040
【図１９−２】
2006018447.tif 000041
【図２０−１】
2006018447.tif 000042
【図２０−２】
2006018447.tif 000043
【図２１−１】
2006018447.tif 000044
【図２１−２】
2006018447.tif 000045
【図２２】
2006018447.tif 000046
【図２３】
2006018447.tif 000047