(57)【要約】  並列実行時間のより短い並列化プログラムを生成するプログラム並列化装置を提供する。プログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。この装置において、スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。占有状況解析部は、すでにスケジュールされた命令に占められていない時刻を解析する。依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。スケジュール候補命令選択部は、次にスケジュールする命令を選択する。命令配置部は、命令に対し実行するプロセッサと時刻を割り当てる。
2009101976.tif 000002
【特許請求の範囲】
【請求項１】
逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化装置において、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、
各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、
すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、
命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、
次にスケジュールする命令を選択するスケジュール候補命令選択部と、
命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、
を有することを特徴とするプログラム並列化装置。
【請求項２】
逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化装置において、
各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択部と、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、
各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、
すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、
命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、
次にスケジュールする命令を選択するスケジュール候補命令選択部と、
命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、
スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定部と、
前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定部と、
を有することを特徴とするプログラム並列化装置。
【請求項３】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置において、
入力した前記逐次処理プログラムの制御フローを解析する制御フロー解析部と、
前記制御フロー解析部による制御フローの解析結果を参照して、スケジュール対象となる領域を決定するスケジュール領域形成部と、
前記スケジュール領域形成部によるスケジュール領域の決定を参照して、レジスタのデータフローを解析するレジスタデータフロー解析部と、
あるアドレスに読み書きを行う命令と、前記アドレスから読み書きを行う命令の間の依存を解析する命令間メモリデータフロー解析部と、
各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択部と、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、
各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、
すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、
命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、
次にスケジュールする命令を選択するスケジュール候補命令選択部と、
命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、
スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定部と、
前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定部と、
前記最良のスケジュール決定結果を参照して、レジスタ割り当てを行うレジスタ割り当て部と、
前記レジスタ割り当て結果を参照して、並列化プログラムを生成し出力するプログラム出力部と、
を有することを特徴とするプログラム並列化装置。
【請求項４】
前記スケジュール候補命令選択部が、スケジュール候補の命令を先頭とする依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析することを特徴とする請求項１から３のいずれか１項に記載のプログラム並列化装置。
【請求項５】
前記命令実行開始・終了時刻制限選択部が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とすることを特徴とする請求項２または３に記載のプログラム並列化装置。
【請求項６】
逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化方法において、
各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップと、
ある命令について、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
ある命令について、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、
命令間の依存による遅延を解析するステップと、
次にスケジュールする命令を選択するステップと、
命令に対し実行するプロセッサと時刻を割り当てるステップと、
を含むことを特徴とするプログラム並列化方法。
【請求項７】
逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化方法において、
各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶステップと、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、
命令間の依存による遅延を解析するステップと、
次にスケジュールする命令を選択するステップと、
命令に対し実行するプロセッサと時刻を割り当てるステップと、
スケジュール結果に対し、並列実行時間を測定あるいは推定するステップと、
前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定するステップと、
を含むことを特徴とするプログラム並列化方法。
【請求項８】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化方法において、
入力した前記逐次処理プログラムの制御フローを解析するステップと、
前記制御フロー解析部による制御フローの解析結果を参照して、スケジュール対象となる領域を決定するステップと、
前記スケジュール領域形成部によるスケジュール領域の決定を参照して、レジスタのデータフローを解析するステップと、
あるアドレスに読み書きを行う命令と、前記アドレスから読み書きを行う命令の間の依存を解析するステップと、
各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップと、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、
命令間の依存による遅延を解析するステップと、
次にスケジュールする命令を選択するステップと、
命令に対し実行するプロセッサと時刻を割り当てるステップと、
スケジュール結果に対し、並列実行時間を測定あるいは推定するステップと、
前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定するステップと、
前記最良のスケジュール決定結果を参照して、レジスタ割り当てを行うステップと、
前記レジスタ割り当て結果を参照して、並列化プログラムを生成し出力するステップと、
を含むことを特徴とするプログラム並列化方法。
【請求項９】
ａ）命令実行開始・終了時刻制限選択部が、各スレッドの命令の実行開始・終了時刻の制限の集合から、未選択のものを選び、ＳＨとするステップと、
ｂ）スレッド開始時刻制限解析部とスレッド終了時刻制限解析部と占有状況解析部と依存遅延解析部とスケジュール候補命令選択部と命令配置部とが、前記制限ＳＨに従って命令スケジュールを行い、スケジュール結果をＳＣとするステップと、
ｃ）並列実行時間測定部が、前記スケジュール結果ＳＣの並列実行時間を計測あるいは推定するステップと、
ｄ）最良スケジュール決定部が、記憶していた最短並列実行時間より短ければ前記スケジュール結果ＳＣを最短スケジュールとして記憶するステップと、
ｅ）前記最良スケジュール決定部が、全ての制限を選択したか判定するステップと、
ｆ）前記最良スケジュール決定部が、最短スケジュールを最終的なスケジュールとして出力するステップと、
を含むことを特徴とする請求項６から８のいずれか１項に記載のプログラム並列化方法。
【請求項１０】
前記ステップｂ）は、
ｂ−１）前記命令配置部が、各命令ＩについてのＨＴ（Ｉ）を計算し、また、その値を与える命令を記憶するステップと、
ｂ−２）前記命令配置部が、依存している命令がない命令を集合ＲＳに登録するステップと、
ｂ−３）前記命令配置部が、前記集合ＲＳの全命令を未選択とするステップと、
ｂ−４）前記スケジュール候補命令選択部が、前記集合ＲＳに属する命令のうち、未選択のものを命令ＲＩとするステップと、
ｂ−５）前記スケジュール候補命令選択部が、前記命令ＲＩが依存している命令のうち、すでにスケジュールされたもののうち、最もスレッド番号が大きいもののスレッド番号をＬＦとし、前記スレッド番号ＬＦより大きくかつ現在命令が割り当てられていない最も番号の小さいスレッド番号をＲＭとし、スレッド番号ＴＮを前記ＬＦに設定するステップと、
ｂ−６）前記スレッド開始時刻制限解析部が、前記スレッド番号ＴＮのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をＥＲ１とするステップと、
ｂ−７）前記占有状況解析部が、前記スレッド番号ＴＮのスレッドについて、すでにスケジュールされた命令が占められていない時刻を解析し、その時刻の集合をＥＲ２とするステップと、
ｂ−８）前記依存遅延解析部が、前記命令ＲＩが依存している命令のうち、すでにスケジュールされたもののうち、前記スレッド番号ＴＮのスレッドにデータを届けるのが最も遅いものについて、その到着時刻をＥＲ３とするステップと、
ｂ−９）前記スレッド終了時刻制限解析部が、前記スレッド番号ＴＮのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をＥＲ４とするステップと、
ｂ−１０）前記スケジュール候補命令選択部が、前記集合ＥＲ２の要素のうち、前記時刻ＥＲ１以上かつ前記時刻ＥＲ４以下かつ前記時刻ＥＲ３以上のもののうち、最小のものは存在するか判定するステップと、
ｂ−１１）前記スケジュール候補命令選択部が、スレッド番号ＴＮを１進めるステップと、
ｂ−１２）前記スケジュール候補命令選択部が、存在する場合はその時刻をＥＲ５とするステップと、
ｂ−１３）前記スケジュール候補命令選択部が、前記スレッド番号ＴＮ、前記時刻ＥＲ５に前記命令ＲＩを仮に割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、前記命令ＲＩを先頭とする最長依存命令列の末尾の命令ＴＩの実行時刻を推定するステップと、
ｂ−１４）前記スケジュール候補命令選択部が、前記スレッド番号ＴＮに渡る、前記命令ＴＩの実行が最も早い時刻となる前記命令ＲＩのスレッド番号と時刻と、推定された前記命令ＴＩの予測時刻を前記命令ＲＩに記憶するステップと、
ｂ−１５）前記スケジュール候補命令選択部が、前記スレッド番号ＴＮがＲＭに達したか判定するステップと、
ｂ−１６）前記スケジュール候補命令選択部が、前記スレッド番号ＴＮを１進めるステップと、
ｂ−１７）前記スケジュール候補命令選択部が、前記集合ＲＳの全ての命令を選択したか判定するステップと、
ｂ−１８）前記命令配置部が、前記ステップｂ−１４で記憶した前記命令ＴＩの予測時刻が最も大きい命令をスケジュール対象ＣＤとし、前記ステップｂ−１４で記憶したスレッド番号と、前記ステップｂ−１４で記憶した時刻に割り当てるステップと、
ｂ−１９）前記命令ＣＤを集合ＲＳから除去し、前記命令ＣＤに依存している命令について調べ、その命令について、前記命令ＣＤに対する依存は解決したとし、依存している命令がなくなった場合はその命令を前記集合ＲＳに登録するステップと、
ｂ−２０）前記命令配置部が、全ての命令をスケジュールしたか判定するステップと、
ｂ−２１）前記命令配置部が、スケジュール結果を出力するステップと、
を含むことを特徴とする請求項９記載のプログラム並列化方法。
【請求項１１】
前記ステップｂ−９）は、
ｂ−９−１）前記スケジュール候補命令選択部が、前記命令ＲＩを先頭とする、依存グラフにおける命令列について、最長のものＴＳとし、前記命令ＴＳを、ＴＬ［０］をＲＩとして、ＴＬ［０］、ＴＬ［１］、ＴＬ［２］、…と表すステップと、
ｂ−９−２）前記スケジュール候補命令選択部が、変数Ｖ２を１とするステップと、
ｂ−９−３）前記スケジュール候補命令選択部が、前記命令ＴＬ［Ｖ２］が依存している命令のうち、すでにスケジュール、あるいは仮に割り当てられているもののうち、最もスレッド番号が大きいもののスレッド番号をＬＦ２とし、前記スレッド番号ＬＦ２より大きくかつ、現在命令がスケジュールされていない最も番号の小さいスレッド番号をＲＭ２とし、変数ＣＵに前記ＬＦ２を代入するステップと、
ｂ−９−４）前記スレッド開始時刻制限解析部が、前記スレッド番号ＣＵのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をＥＲ１１とするステップと、
ｂ−９−５）前記占有状況解析部が、前記スレッド番号ＣＵのスレッドについて、すでにスケジュール、あるいは仮割当てされた命令に占められていない時刻を解析し、その時刻の集合をＥＲ１２とするステップと、
ｂ−９−６）前記依存遅延解析部が、前記命令ＴＬ［Ｖ２］が依存している命令のうち、すでにスケジュール、あるいは仮割当てされているものについて、前記命令ＴＬ［Ｖ２］へのデータの送信を調べ、それらの命令のデータの、前記スレッド番号ＣＵのスレッドへの到着時刻を調べ、その最大値をＥＲ１３とするステップと、
ｂ−９−７）前記スレッド終了時刻制限解析部が、前記スレッド番号ＣＵのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をＥＲ１４とするステップと、
ｂ−９−８）前記スケジュール候補命令選択部が、前記集合ＥＲ１２の要素のうち、前記時刻ＥＲ１１以上かつ前記時刻ＥＲ１４以下かつ前記時刻ＥＲ１３以上のもののうち、最小のものは存在するか判定するステップと、
ｂ−９−９）前記スケジュール候補命令選択部が、前記スレッド番号ＣＵを１進めるステップと、
ｂ−９−１０）前記スケジュール候補命令選択部が、存在する場合はその時刻をＥＲ１５とするステップと、
ｂ−９−１１）前記スケジュール候補命令選択部が、前記命令ＴＬ［Ｖ２］に対する、前記時刻ＥＲ１５のスレッド番号ＣＵに渡る最小値を記憶し、最小値が更新された場合、前記スレッド番号ＣＵも記憶するステップと、
ｂ−９−１２）前記スケジュール候補命令選択部が、前記スレッド番号ＣＵが前記ＲＭ２に達したか判定するステップと、
ｂ−９−１３）前記スケジュール候補命令選択部が、前記スレッド番号ＣＵを１増やすステップと、
ｂ−９−１４）前記スケジュール候補命令選択部が、前記ステップｂ−９−１１で記憶したスレッド番号、時刻に前記命令ＴＬ［Ｖ２］を仮に割り当てるステップと、
ｂ−９−１５）前記スケジュール候補命令選択部が、前記命令ＴＳのすべての命令を仮に割り当てたか判定するステップと、
ｂ−９−１６）前記スケジュール候補命令選択部が、前記変数Ｖ２を１増やすステップと、
ｂ−９−１７）前記スケジュール候補命令選択部が、仮の割当てをすべて消去して、前記命令ＴＬ［Ｖ２］が仮に割り当てられたスレッド番号と時刻を出力するステップと、
を含むことを特徴とする請求項１０記載のプログラム並列化方法。
【請求項１２】
次にスケジュールする命令を選択するステップにおいて、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析することを特徴とする請求項６から１１のいずれか１項に記載のプログラム並列化方法。
【請求項１３】
各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップにおいて、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とすることを特徴とする請求項６から１１のいずれか１項に記載のプログラム並列化方法。
【請求項１４】
逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、
各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、
各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、
プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、
命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、
次にスケジュールする命令を選択するスケジュール候補命令選択手段と、
命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、
として機能させることを特徴とするプログラム並列化プログラム。
【請求項１５】
逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、
各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、
各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、
プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、
命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、
次にスケジュールする命令を選択するスケジュール候補命令選択手段と、
命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、
スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定手段と、
制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定手段と、
として機能させることを特徴とするプログラム並列化プログラム。
【請求項１６】
逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置を構成するコンピュータを、
入力した前記逐次処理プログラムの制御フローを解析する制御フロー解析手段と、
前記制御フロー解析手段による制御フローの解析結果を参照して、スケジュール対象となる領域を決定するスケジュール領域形成手段と、
前記スケジュール領域形成手段によるスケジュール領域の決定を参照して、レジスタのデータフローを解析するレジスタデータフロー解析手段と、
あるアドレスに読み書きを行う命令と、前記アドレスから読み書きを行う命令の間の依存を解析する命令間メモリデータフロー解析手段と、
各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、
各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、
各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、
プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、
命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、
次にスケジュールする命令を選択するスケジュール候補命令選択手段と、
命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、
スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定手段と、
制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定手段と、
前記最良のスケジュール決定結果を参照して、レジスタ割り当てを行うレジスタ割り当て手段と、
前記レジスタ割り当て結果を参照して、並列化プログラムを生成し出力するプログラム出力手段と、
として機能させることを特徴とするプログラム並列化プログラム。
【請求項１７】
前記スケジュール候補命令選択手段が、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析することを特徴とする請求項１４から１６のいずれか１項に記載のプログラム並列化プログラム。
【請求項１８】
前記命令実行開始・終了時刻制限選択手段が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とすることを特徴とする請求項１４から１６のいずれか１項に記載のプログラム並列化プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、逐次処理プログラムからマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するプログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラムに関する。
【背景技術】
【０００２】
単一の逐次処理プログラムを並列プロセッサシステムで並列に処理する手法として、プログラムをスレッドと呼ぶ命令流に分割して複数のプロセッサで並列に実行するマルチスレッド実行方法がある（例えば、特許文献１〜５、非特許文献１〜２参照）。マルチスレッド実行を行う並列プロセッサを、「マルチスレッド型並列プロセッサ」と呼ぶ。以下、これらの関連技術のマルチスレッド実行方法及びマルチスレッド型並列プロセッサについて説明する。【０００３】
一般にマルチスレッド実行方法及びマルチスレッド型並列プロセッサにおいて、他のプロセッサ上に新たなスレッドを生成することを、「スレッドをフォーク（ｆｏｒｋ）する」と言う。この場合、フォーク動作を行った側のスレッドを「親スレッド」、生成された新しいスレッドを「子スレッド」と呼ぶ。そして、スレッドをフォークするプログラム位置を「フォーク元アドレス」または「フォーク元ポイント」、子スレッドの先頭のプログラム位置を「フォーク先アドレス」または「フォーク先ポイント」または「子スレッドの開始点」と呼ぶ。【０００４】
特許文献１〜４および非特許文献１〜２では、スレッドのフォークを指示するためにフォーク元ポイントにフォーク命令が挿入される。フォーク命令にはフォーク先アドレスが指定され、フォーク命令の実行によりそのフォーク先アドレスから始まる子スレッドが他プロセッサ上に生成され、子スレッドの実行が開始される。また、スレッドの処理を終了させるプログラム位置を「ターム（ｔｅｒｍ）点」と呼び、各プロセッサはそのターム点でスレッドの処理を終了する。【０００５】
図３０に、マルチスレッド型並列プロセッサにおけるマルチスレッド実行方法の処理の概要を示す。【０００６】
図３０（ａ）は、３つのスレッドＡ、Ｂ、Ｃに分割された単一の逐次処理プログラムを示す。このプログラムを単一のプロセッサで処理する場合、図３０（ｂ）に示すように１つのプロセッサＰＥがスレッドＡ、Ｂ、Ｃを順番に処理していく。【０００７】
これに対して、特許文献１〜４および非特許文献１〜２のマルチスレッド型並列プロセッサにおけるマルチスレッド実行方法では、図３０（ｃ）に示すように、１つのプロセッサＰＥ１にスレッドＡを実行させ、プロセッサＰＥ１でスレッドＡを実行している最中に、スレッドＡに埋め込まれたフォーク命令によってスレッドＢを他のプロセッサＰＥ２に生成し、プロセッサＰＥ２においてスレッドＢを実行させる。次に、プロセッサＰＥ２は、スレッドＢに埋め込まれたフォーク命令によってスレッドＣをさらに他のプロセッサＰＥ３に生成する。次に、プロセッサＰＥ１、ＰＥ２は、それぞれスレッドＢ、Ｃの開始点の直前のターム点においてスレッドの処理を終了する。その後、プロセッサＰＥ３は、スレッドＣの最後の命令を実行すると、その次の命令（一般にはシステムコール命令）を実行する。このように、複数のプロセッサでスレッドを同時に並行して実行することにより、逐次処理に比べて性能の向上が図られる。【０００８】
例えば、プロセッサを３つ備える場合、プロセッサ１でスレッド１を実行し、プロセッサ２でスレッド２を実行し、プロセッサ３でスレッド３を実行し、プロセッサ１でスレッド４を実行し、プロセッサ２でスレッド５を実行し、プロセッサ３でスレッド６を実行する。このようにして、プロセッサは繰り返し利用される。【０００９】
この例を図３１に示す。図３１において、丸印は命令を表す。Ｆ１〜Ｆ５はフォーク命令である。プロセッサは３個備えるとする。１番目のスレッドである命令Ｆ１、Ｉ１〜Ｉ３はプロセッサ１で実行される。フォーク命令Ｆ１の指示を受けて、２番目のスレッドである命令Ｆ２、Ｉ４〜Ｉ６はプロセッサ２で実行される。フォーク命令Ｆ２の指示を受けて、３番目のスレッドである命令Ｆ３、Ｉ７〜Ｉ９はプロセッサ３で実行される。ここで、フォーク命令Ｆ３の指示を受けて、４番目のスレッドである命令Ｆ４、Ｉ１０〜Ｉ１２はプロセッサ１で実行される。さらに、フォーク命令Ｆ４の指示を受けて、５番目のスレッドである命令Ｆ５、Ｉ１３〜Ｉ１５はプロセッサ２で実行される。このため、プログラムから見ると、プロセッサは無限個あるように見える。また、この無限個あるように見えるプロセッサのＮ番目のものは、Ｎ番目のスレッドにより利用される。このため、以降の説明では、この無限個あるように見えるプロセッサの番号を表現する際に、スレッド番号を代わりに用いる。【００１０】
他のマルチスレッド実行方法として、図３０（ｄ）に示すように、スレッドＡを実行しているプロセッサＰＥ１からフォークを複数回行うことにより、プロセッサＰＥ２にスレッドＢを、またプロセッサＰＥ３にスレッドＣをそれぞれ生成するマルチスレッド実行方法も存在する。この図３０（ｄ）のモデルに対して、図３０（ｃ）に示したように、スレッドはその生存中に高々１回に限って有効な子スレッドを生成することができるという制約を課したマルチスレッド実行方法を「フォーク１回モデル」と呼ぶ。フォーク１回モデルでは、スレッド管理の大幅な簡略化が可能となり、現実的なハードウェア規模でスレッド管理部のハードウェア化が実現できる。また、個々のプロセッサは子スレッドを生成する他プロセッサが１プロセッサに限定されるため、隣接するプロセッサを単方向にリング状に接続した並列プロセッサシステムでマルチスレッド実行が可能となる。【００１１】
ここで、フォーク命令時、子スレッドを生成できる空きのプロセッサが存在しない場合の対処方法としては、親スレッドを実行しているプロセッサにおいて、子スレッドを生成できる空きのプロセッサが生じるまで、フォーク命令の実行をウエイトする典型的な方法がある。これ以外には、特許文献４に示されるように、フォーク命令を無効化してフォーク命令以降の後続命令を引き続き実行した後、子スレッドの命令群を自ら実行する方法がある。【００１２】
親スレッドが子スレッドを生成し、子スレッドに所定の処理を行わせるには、親スレッドのフォーク点におけるレジスタファイル中のレジスタのうち少なくとも子スレッドで必要なレジスタの値を親スレッドから子スレッドに引き渡す必要がある。【００１３】
このスレッド間のデータ引き渡しコストを削減するために、特許文献２及び非特許文献１では、スレッド生成時のレジスタ値継承機構をハードウェア的に備えている。これは、スレッド生成時に親スレッドのレジスタファイルの内容を子スレッドに全てコピーするものである。子スレッド生成後は、親スレッドと子スレッドのレジスタ値の変更は独立となり、レジスタを用いたスレッド間のデータの引き渡しは行われない。【００１４】
非特許文献２では、スレッド生成時のレジスタ値継承機構をハードウェア的に備えている。これは、子スレッド生成時と子スレッド生成後に、必要なレジスタ値をスレッド間で転送する。見方を変えると、この方法では、ある命令から別の命令へレジスタ値を転送することができるが、その転送は、スレッド番号が変化しないか、増加する方向にのみ行われる。【００１５】
スレッド間のデータ引き渡しに関する他の関連技術としては、レジスタの値を命令によりレジスタ単位で個別に転送する機構を備えた並列プロセッサシステムも提案されている。【００１６】
マルチスレッド実行方法では、実行の確定した先行スレッドを並列に実行することを基本とするが、実際のプログラムでは実行の確定するスレッドが充分に得られない場合も多い。また、動的に決定される依存やコンパイラ解析能力の限界等により並列化率が低く抑えられ、所望の性能が得られない可能性が生じる。【００１７】
このため、特許文献１では、制御投機を導入し、ハードウェア的にスレッドの投機実行をサポートしている。制御投機では、実行する可能性の高いスレッドを実行確定前に投機的に実行する。投機状態のスレッドは、実行の取り消しがハードウェア上可能である範囲内で仮実行を行う。子スレッドが仮実行を行っている状態を「仮実行状態」と言い、子スレッドが仮実行状態にあるとき、親スレッドは「スレッド仮生成状態」にあると言う。仮実行状態の子スレッドでは共有メモリ及びキャッシュメモリへの書き込みは抑制され、別途設けた仮実行用バッファ（ｔｅｍｐｏｒａｒｙ  ｂｕｆｆｅｒ）に対して書き込みが行われる。【００１８】
投機が正しいことが確定すると、親スレッドから子スレッドに対して投機成功通知が出され、子スレッドは仮実行用バッファの内容を共有メモリ及びキャッシュメモリに反映し、仮実行用バッファを用いない通常の状態となる。また、親スレッドは、スレッド仮生成状態からスレッド生成状態となる。他方、投機が失敗したことが確定すると、親スレッドでスレッド破棄命令（ａｂｏｒｔ）が実行され、子スレッド以下の実行がキャンセルされる。また、親スレッドは、スレッド仮生成状態からスレッド未生成状態となり、再び子スレッドの生成が可能になる。つまり、フォーク１回モデルでは、スレッド生成は高々１回に限定されるが、投機的にフォークを行い、投機が失敗した場合には再びフォークが可能となる。この場合においても、有効な子スレッドは高々１つである。【００１９】
スレッドは、その生存中に高々１回に限って有効な子スレッドを生成するというフォーク１回モデルのマルチスレッド実行を実現する。このために、例えば非特許文献１等では、逐次処理プログラムから並列化プログラムを生成するコンパイルの段階で、全てのスレッドが有効なフォークを１回しか実行しない命令コードになるように制限している。即ち、フォーク１回制限を並列化プログラム上において静的に保証している。一方、特許文献３では、親スレッド中に存在する複数のフォーク命令のうちから有効な子スレッドを生成する１つのフォーク命令を親スレッドの実行中に選択する。こうすることにより、フォーク１回制限をプログラム実行時に保証している。【００２０】
次に、マルチスレッド実行を行う並列プロセッサ向けの並列プログラムを生成する関連技術について説明する。【００２１】
図３２を参照すると、関連技術のプログラム並列化装置（例えば、特許文献６）は、ソースファイル５０１を入力し、構文解析部５００でソースファイル５０１の構造を解析する。そして、この装置は、実行時間取得関数挿入部５０４で、ループのイタレーションの実行時間を計測する関数を挿入する。また、この装置は、並列化部５０６でループのイタレーションの並列化を行う。さらに、この装置は、コード生成部５０７でループのイタレーションの実行時間を計測する関数を挿入された実行時間取得用オブジェクトコード５１０を出力する。そして、このオブジェクトコード５０９が実行されることにより、実行時間情報ファイル５０８が生成される。この装置では、再び構文解析部５００による解析を経た後、実行時間入力部５０５でループのイタレーションの実行時間を入力し、コード生成部５０７で並列実行を行うオブジェクトコード５０９を生成し出力する。こうすることによって、この装置によれば、ループの各イタレーションの実行時間を計測しておき、ループのイタレーションを複数のプロセッサに分配して並列化する際に、各プロセッサの負荷を均等になるようにイタレーションを割り当てる。こうすることで、この装置では、並列実行時間を短くすることができる。【００２２】
また、図３３を参照すると、他の関連技術のプログラム並列化装置（例えば、特許文献７）はソースプログラム６０２を入力し、プログラムの並列処理単位であるセクションをセクション整列手段６３１で実行時間の長い順に並べ替えを行う。この装置は、並べ替えを行った順番を優先順として、セクションをスレッドで実行する処理を行うオブジェクトコードを、スレッド対応付手段６４１で生成する。そして、この装置は、スレッドがひとつのセクションの実行を開始したら、そのセクションが実行を開始している旨の表示処理を行うオブジェクトコードを、割当済表示手段６４２で生成する。さらに、この装置は、スレッドがあるセクションの実行を完了したら、まだ実行が開始されていないセクションを実行させる処理を行うオブジェクトコードを、次セクション実行手段６４３で生成する。このようにして、この装置によれば、並列実行可能な処理をプールしておき、プロセッサが順次それを取り出して処理することにより、各プロセッサの負荷を均等にする。こうすることで、この装置でも、並列実行時間を短くすることができる。
【特許文献１】特開平１０−２７１０８号公報
【特許文献２】特開平１０−７８８８０号公報
【特許文献３】特開２００３−０２９９８５号公報
【特許文献４】特開２００３−０２９９８４号公報
【特許文献５】特開２００１−２８２５４９号公報
【特許文献６】特開２００４−１５２２０４号公報
【特許文献７】特開２００４−０９４５８１号公報
【非特許文献１】鳥居淳、外５名、「On Chip Multiprocessor指向  制御並列アーキテクチャMUSCATの提案」、並列処理シンポジュウムＪＳＰＰ９７論文集、情報処理学会、ｐｐ．２２９−２３６、Ｍａｙ  １９９７
【非特許文献２】Taku Ohsawa, Masamichi Takagi, ShojiKawahara, Satoshi Matsushita: Pinot: Speculative Multi-threading Processor ArchitectureExploiting Parallelism Over a Wide Range of Granularities. In Proceedings of 38thMICRO, pages 81―92, 2005.
【非特許文献３】Thomas L. Adam, K. M. Chandy, J. R. Dickson, "A comparison of list schedules for parallel processing systems", Communications of the ACM, Volume 17, Issue 12, pp.685-690, December 1974.
【非特許文献４】H. Kasahara, S. Narita, "Practical Multiprocessor Scheduling Algorithms for Efficient Parallel Processing", IEEE Trans. on Computers, Vol. C-33, No. 11, pp.1023-1029, Nov. 1984.
【非特許文献５】Yu-Kwong Kwok and Ishfaq Ahmad, "Static Scheduling Algorithms for Allocating Directed Task Graphs to Multiprocessors", ACM Computing Surveys, Vol. 31, No. 4, December 1999.
【発明の開示】
【発明が解決しようとする課題】
【００２３】
しかし、前述した関連技術では、並列実行時間のより短い並列化プログラムを得られない場合があるといった問題点があった。この問題点を以下に説明する。【００２４】
前述した関連技術のプログラム並列化装置（例えば、非特許文献３〜５）は、データ依存とコントロール依存と命令順序の依存を示したグラフに基づいて、命令を、〈スレッド番号、サイクル番号〉で示される２次元空間のスロットに割り当てていく。このとき、各命令に優先度を付与し、優先度の高い順に、実行時刻の最も若く、空いている〈スレッド番号，実行時刻〉のスロットに命令を割り当てる、ということを各命令について繰り返す。この際、あるスレッドが担当する命令数に偏りができ、プロセッサにおいて命令を実行しないサイクルが生じ、並列実行時間が長くなってしまうことがあった。その一例を図６に示す。【００２５】
この例では、図６（ａ）に示すように、スレッド１に多くの命令を割り当てたため、プロセッサ２において命令が実行されないサイクルが生じる。これにより、図６（ｂ）に示すように、命令数を均等にして割り当てた場合に比べて並列実行時間が長くなってしまっている。【００２６】
また、前述した他の関連技術のプログラム並列化装置（例えば、特許文献６〜７）では、スレッドが担当する命令数に偏りがなくても、実行開始時刻の間隔が整っていないため、プロセッサで命令が実行されないサイクルが生じる。このために、実行時間が長くなることがあった。その一例を図７に示す。【００２７】
この例では、図７（ａ）に示すように、プロセッサ２に割り当てられた命令列の開始時刻が遅れているため、プロセッサ１において命令が実行されないサイクルが生じる。これにより、図７（ｂ）に示すように、命令の実行開始時刻の間隔を整えて割り当てた場合に比べて、並列実行時間が長くなってしまっている。【００２８】
以上のように、関連技術のプログラム並列化装置は、あるプロセッサが担当する命令数に偏りができる、あるいは、命令の実行開始時刻の間隔が整っていないため、並列実行時間が長くなってしまうことがあった。【００２９】
本発明は、このような事情に鑑みて提案されたものであり、その目的は、スレッドごとの命令数が偏らないように、かつ、スレッドごとの命令の実行開始時刻の間隔が整うように命令をスケジュールすることによって、並列実行時間のより短い並列化プログラムを生成することのできるプログラム並列化装置及びその方法を提供することにある。
【課題を解決するための手段】
【００３０】
上記目的を達成するため、本発明に係るプログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化装置において、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、次にスケジュールする命令を選択するスケジュール候補命令選択部と、命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、を有することを特徴とする。【００３１】
本発明に係るプログラム並列化方法は、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化方法において、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップと、ある命令について、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、ある命令について、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、命令間の依存による遅延を解析するステップと、次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てるステップと、を含むことを特徴とする。【００３２】
本発明に係るプログラム並列化プログラムは、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、次にスケジュールする命令を選択するスケジュール候補命令選択手段と、命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、として機能させることを特徴とする。
【発明の効果】
【００３３】
本発明によれば、各スレッドにおける命令を実行しない空き時間が減るように、かつ、スレッドごとの命令数が偏らないように、かつ、スレッドごとの命令の実行開始時刻の間隔が整うように命令をスケジュールすることによって、並列実行時間のより短い並列化プログラムを生成することができる。
【図面の簡単な説明】
【００３４】
【図１】本発明の第１の実施例に係るプログラム並列化装置のブロック図である。
【図２】第１の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。
【図３】図２に続き、第１の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。
【図４】第１の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。
【図５】図４に続き、第１の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。
【図６】（ａ）及び（ｂ）は、関連技術の課題を示した図である。
【図７】（ａ）及び（ｂ）は、他の関連技術の課題を示した図である。
【図８】（ａ）及び（ｂ）は、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるようなスレッドの命令の実行開始・終了時刻の制限の例を示す図である。
【図９】（ａ）及び（ｂ）は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測する様子を示した図である。
【図１０】ある命令を先頭とする最長依存命令列について説明するための、命令の依存グラフの例を示す図である。
【図１１】すべてのスレッドで開始時刻がスレッド番号とともに一定の増分３で増えるような命令実行開始時刻の制限の例を示す図である。
【図１２】（ａ）及び（ｂ）は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令を配置できるスレッド番号と時刻を選択する様子を示す図である。
【図１３】（ａ）及び（ｂ）は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令列の実行時間を予測する様子を示す図である。
【図１４】（ａ）及び（ｂ）は、第１の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理の具体例を説明する際に用いるプログラムの、依存グラフを示す図である。
【図１５】第１の実施例において、各スレッドの命令の実行開始・終了時間の制限と、フォーク命令の具体例を示す図である。
【図１６】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図１７】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図１８】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図１９】第１の実施例において、命令スケジュールの途中結果の具体例を示す図である。
【図２０】第１の実施例において、命令スケジュールの途中状態の具体例を示す図である。
【図２１】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図２２】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図２３】第１の実施例において、命令スケジュールの結果の具体例を示す図である。
【図２４】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図２５】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図２６】第１の実施例において、命令列の仮の割当ての具体例を示す図である。
【図２７】本発明の第２の実施例に係るのプログラム並列化装置のブロック図である。
【図２８】第２の実施例に係るのプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。
【図２９】本発明の第３の実施例に係るプログラム並列化装置のブロック図である。
【図３０】（ａ）〜（ｄ）は、マルチスレッド実行方法の概要を説明する図である。
【図３１】マルチスレッド実行方法において、スレッドによるプロセッサの使用の順番を説明する図である。
【図３２】関連技術のプログラム並列化装置の構成例を示すブロック図である。
【図３３】他の関連技術のプログラム並列化装置の構成例を示すブロック図である。
【符号の説明】
【００３５】
１００、１００Ａ、１００Ｂ  プログラム並列化装置
１０１  逐次処理プログラム
１０１Ｍ  記憶部
１０２  記憶装置
１０３  並列化プログラム
１０３Ｍ  記憶部
１０４  記憶装置
１０７、１０７Ａ、１０７Ｂ  処理装置
１０８、１０８Ａ  スレッド開始・終了時刻制限スケジュール部
１１０  制御フロー解析部
１４０  スケジュール領域形成部
１５０  レジスタデータフロー解析部
１７０  命令間メモリデータフロー解析部
１８０  命令の実行開始・終了時刻制限選択部
１９０  スケジュール候補命令選択部
２００  命令配置部
２１０  フォーク命令挿入部
２２０  スレッド開始時刻制限解析部
２３０  スレッド終了時刻制限解析部
２４０  占有状況解析部
２５０  依存遅延解析部
２６０  最良スケジュール決定部
２７０  並列実行時間測定部
２８０  レジスタ割り当て部
２９０  プログラム出力部
３０１  記憶装置
３０２  記憶装置
３０３  記憶装置
３０４  記憶装置
３０５  記憶装置
３０６  記憶装置
３１０  プロファイルデータ
３１０Ｍ  記憶部
３２０  逐次処理中間プログラム
３２０Ｍ  記憶部
３３０  命令間の依存情報
３３０Ｍ  記憶部
３４０  命令の実行開始・終了時刻の制限
３４０Ｍ  記憶部
３５０  並列化中間プログラム
３５０Ｍ  記憶部
３６０  命令の実行開始・終了時刻の制限集合
３６０Ｍ  記憶部
【発明を実施するための最良の形態】
【００３６】
次に、本発明に係るプログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラムの実施の形態について、図面を参照して詳細に説明する。【００３７】
本発明の実施の形態では、各スレッドについて、命令実行開始・終了時刻に制限を加えた上で、「スケジュール」を行う。「スケジュール（命令スケジュール）」とは、各命令の実行スレッド番号と実行時刻とを決定することである。さらに、並列実行時間を短くできるスケジュールを行う。さらに、スレッドごとの命令の実行開始・終了時刻の制限を満たすような、プロセッサを割当て可能なスレッド番号と時刻を解析する。さらに、「最長依存命令列」に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測する。「最長依存命令列」とは、命令の依存グラフ（後述参照）上での依存に沿った命令列のうち、その実行終了時刻が最も遅い命令列である。さらに、スレッドごとの命令の実行開始・終了時刻の制限を考慮した上で、最長依存命令列の実行時刻を予測する。【００３８】
以下、本発明の各実施の形態について説明する。【００３９】
［第１の実施の形態］
第１の実施の形態に係るプログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。このプログラム並列化装置は、命令実行開始・終了時刻制限選択部、スレッド開始時刻制限解析部、スレッド終了時刻制限解析部、占有状況解析部、依存遅延解析部、スケジュール候補命令選択部、及び命令配置部を有する。【００４０】
命令実行開始・終了時刻制限選択部は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【００４１】
スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００４２】
スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００４３】
占有状況解析部は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【００４４】
依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。【００４５】
スケジュール候補命令選択部は、次にスケジュールする命令を選択する。【００４６】
命令配置部は、命令に対し実行するプロセッサと時刻を割り当てる。【００４７】
［第２の実施の形態］
第２の実施の形態に係るプログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。このプログラム並列化装置は、命令実行開始・終了時刻制限選択部、スレッド開始時刻制限解析部、スレッド終了時刻制限解析部、占有状況解析部、依存遅延解析部、スケジュール候補命令選択部、並列実行時間測定部、及び最良スケジュール決定部を有する。【００４８】
命令実行開始・終了時刻制限選択部は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【００４９】
スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００５０】
スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００５１】
占有状況解析部は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【００５２】
依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。【００５３】
スケジュール候補命令選択部は、次にスケジュールする命令を選択する。命令配置部は、命令に対し実行するプロセッサと時刻を割り当てる。【００５４】
並列実行時間測定部は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。【００５５】
最良スケジュール決定部は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。【００５６】
［第３の実施の形態］
第３の実施の形態に係るプログラム並列化装置は、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力する。このプログラム並列化装置は、制御フロー解析部、スケジュール領域形成部、レジスタデータフロー解析部、命令間メモリデータフロー解析部、命令実行開始・終了時刻制限選択部、スレッド開始時刻制限解析部、スレッド終了時刻制限解析部、占有状況解析部、依存遅延解析部、命令配置部、並列実行時間測定部、最良スケジュール決定部、レジスタ割り当て部、及びプログラム出力部を有する。【００５７】
制御フロー解析部は、入力した逐次処理プログラムの制御フローを解析する。【００５８】
スケジュール領域形成部は、制御フロー解析部による制御フローの解析結果を参照して、スケジュール対象となる領域を決定する。【００５９】
レジスタデータフロー解析部は、スケジュール領域形成部によるスケジュール領域の決定を参照して、レジスタのデータフローを解析する。【００６０】
命令間メモリデータフロー解析部は、あるアドレスに読み書きを行う命令と、アドレスから読み書きを行う命令の間の依存を解析する。【００６１】
命令実行開始・終了時刻制限選択部は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【００６２】
スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００６３】
スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００６４】
占有状況解析部は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【００６５】
依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。【００６６】
命令配置部は、次にスケジュールする命令を選択するスケジュール候補命令選択部と、命令に対し実行するプロセッサと時刻とを割り当てる。【００６７】
並列実行時間測定部は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。【００６８】
最良スケジュール決定部は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。【００６９】
レジスタ割り当て部は、最良のスケジュール決定結果を参照して、レジスタ割り当てを行う。【００７０】
プログラム出力部は、レジスタ割り当て結果を参照して、並列化プログラムを生成し出力する。【００７１】
［第４の実施の形態］
第４の実施の形態は、スケジュール候補命令選択部が、スケジュール候補の命令を先頭とする依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析する。【００７２】
［第５の実施の形態］
第５の実施の形態は、命令実行開始・終了時刻制限選択部が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とする。【００７３】
［第６の実施の形態］
第６の実施の形態は、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力する。このプログラム並列化方法は、次の各ステップを有する。【００７４】
Ａ１）各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【００７５】
Ａ２）ある命令について、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００７６】
Ａ３）ある命令について、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００７７】
Ａ４）プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【００７８】
Ａ５）次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てる。【００７９】
［第７の実施の形態］
第７の実施の形態に係るプログラム並列化方法は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。このプログラム並列化方法は、次の各ステップを有する。【００８０】
Ｂ１）各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【００８１】
Ｂ２）各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００８２】
Ｂ３）各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００８３】
Ｂ４）プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【００８４】
Ｂ５）次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てる。【００８５】
Ｂ６）スケジュール結果に対し、並列実行時間を測定あるいは推定するステップと、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。【００８６】
［第８の実施の形態］
第８の実施の形態に係るプログラム並列化方法は、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力する。このプログラム並列化方法は、次の各ステップを有する。【００８７】
Ｃ１）入力した逐次処理プログラムの制御フローを解析する。【００８８】
Ｃ２）制御フローの解析結果を参照して、スケジュール対象となる領域を決定する。【００８９】
Ｃ３）スケジュール領域の決定を参照して、レジスタのデータフローを解析する。【００９０】
Ｃ４）あるアドレスに読み書きを行う命令と、アドレスから読み書きを行う命令の間の依存を解析する。【００９１】
Ｃ５）各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【００９２】
Ｃ６）各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００９３】
Ｃ７）各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【００９４】
Ｃ８）プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【００９５】
Ｃ９）次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てる。【００９６】
Ｃ１０）スケジュール結果に対し、並列実行時間を測定あるいは推定する。【００９７】
Ｃ１１）制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。【００９８】
Ｃ１２）最良のスケジュール決定結果を参照して、レジスタ割り当てを行う。【００９９】
Ｃ１３）レジスタ割り当て結果を参照して、並列化プログラムを生成し出力する。【０１００】
［第９の実施の形態］
第９の実施の形態に係るプログラム並列化方法は、次の各ステップを含む。【０１０１】
ａ）命令実行開始・終了時刻制限選択部が、各スレッドの命令の実行開始・終了時刻の制限の集合から、未選択のものを選び、ＳＨとする。【０１０２】
ｂ）スレッド開始時刻制限解析部と占有状況解析部とスレッド終了時刻制限解析部とスケジュール候補命令選択部と命令配置部が制限ＳＨに従って命令スケジュールを行い、スケジュール結果をＳＣとする。【０１０３】
ｃ）並列実行時間測定部が、スケジュール結果ＳＣの並列実行時間を計測あるいは推定する。【０１０４】
ｄ）最良スケジュール決定部が、記憶していた最短並列実行時間より短ければスケジュール結果SCを最短スケジュールとして記憶する。【０１０５】
ｅ）最良スケジュール決定部が、全ての制限を選択したか判定する。【０１０６】
ｆ）最良スケジュール決定部が、最短スケジュールを最終的なスケジュールとして出力する。【０１０７】
［第１０の実施の形態］
第１０の実施の形態では、ステップｂ）は、次の各ステップを含む。【０１０８】
ｂ−１）命令配置部が、各命令ＩについてのＨＴ（Ｉ）を計算し、また、その値を与える命令を記憶する。【０１０９】
ｂ−２）命令配置部が、依存している命令がない命令を集合ＲＳに登録する。【０１１０】
ｂ−３）命令配置部が、集合ＲＳの全命令を未選択とする。【０１１１】
ｂ−４）スケジュール候補命令選択部が、集合ＲＳに属する命令のうち、未選択のものを命令ＲＩとする。【０１１２】
ｂ−５）スケジュール候補命令選択部が、命令ＲＩが依存している命令のうち、すでにスケジュールされたもののうち、最もスレッド番号が大きいもののスレッド番号をＬＦとし、スレッド番号ＬＦより大きくかつ現在命令が割り当てられていない最も番号の小さいスレッド番号をＲＭとし、スレッド番号ＴＮをＬＦに設定する。【０１１３】
ｂ−６）スレッド開始時刻制限解析部が、番号ＴＮのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をＥＲ１とする。【０１１４】
ｂ−７）占有状況解析部が、番号ＴＮのスレッドについて、すでにスケジュールされた命令が占められていない時刻を解析し、その時刻の集合をＥＲ２とする。【０１１５】
ｂ−８）依存遅延解析部が、命令ＲＩが依存している命令のうち、すでにスケジュールされたもののうち、番号ＴＮのスレッドにデータを届けるのが最も遅いものについて、その到着時刻をＥＲ３とする。【０１１６】
ｂ−９）スレッド終了時刻制限解析部が、番号ＴＮのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をＥＲ４とする。【０１１７】
ｂ−１０）スケジュール候補命令選択部が、集合ＥＲ２の要素のうち、 時刻ＥＲ１以上かつ時刻ＥＲ４以下かつ時刻ＥＲ３以上のもののうち、最小のものは存在するか判定する。【０１１８】
ｂ−１１）スケジュール候補命令選択部が、スレッド番号ＴＮを１進める。【０１１９】
ｂ−１２）スケジュール候補命令選択部が、存在する場合はその時刻をＥＲ５とする。【０１２０】
ｂ−１３）スケジュール候補命令選択部が、スレッド番号ＴＮ、時刻ＥＲ５に命令ＲＩを仮に割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、命令ＲＩを先頭とする最長依存命令列の末尾の命令ＴＩの実行時刻を推定する。【０１２１】
ｂ−１４）スケジュール候補命令選択部が、スレッド番号ＴＮに渡る、命令ＴＩの実行が最も早い時刻となる命令ＲＩのスレッド番号と時刻と、推定された命令ＴＩの予測時刻を命令ＲＩに記憶する。【０１２２】
ｂ−１５）スケジュール候補命令選択部が、スレッド番号ＴＮがＲＭに達したか判定する。【０１２３】
ｂ−１６）スケジュール候補命令選択部が、スレッド番号ＴＮを１進める。【０１２４】
ｂ−１７）スケジュール候補命令選択部が、集合ＲＳの全ての命令を選択したか判定する。【０１２５】
ｂ−１８）命令配置部が、ステップｂ−１４で記憶した命令ＴＩの予測時刻が最も大きい命令をスケジュール対象ＣＤとし、ステップｂ−１４で記憶したスレッド番号と、ステップｂ−１４で記憶した時刻に割り当てる。【０１２６】
ｂ−１９）命令ＣＤを集合ＲＳから除去し、命令ＣＤに依存している命令について調べ、その命令について、命令ＣＤに対する依存は解決したとし、依存している命令がなくなった場合はその命令を集合ＲＳに登録する。【０１２７】
ｂ−２０）命令配置部が、全ての命令をスケジュールしたか判定する。【０１２８】
ｂ−２１）命令配置部が、スケジュール結果を出力する。【０１２９】
［第１１の実施の形態］
第１１の実施の形態では、ステップｂ−９）は、次の各ステップを含む。【０１３０】
ｂ−９−１）スケジュール候補命令選択部が、命令ＲＩを先頭とする、依存グラフにおける命令列について、最長のものＴＳとし、ＴＳを、ＴＬ［０］をＲＩとして、ＴＬ［０］、ＴＬ［１］、ＴＬ［２］、…と表す。【０１３１】
ｂ−９−２）スケジュール候補命令選択部が、変数Ｖ２を１とする。【０１３２】
ｂ−９−３）スケジュール候補命令選択部が、命令ＴＬ［Ｖ２］が依存している命令のうち、すでにスケジュール、あるいは仮に割り当てられているもののうち、最もスレッド番号が大きいもののスレッド番号をＬＦ２とし、スレッド番号ＬＦ２より大きくかつ、現在命令がスケジュールされていない最も番号の小さいスレッド番号をＲＭ２とし、変数ＣＵにＬＦ２を代入する。【０１３３】
ｂ−９−４）スレッド開始時刻制限解析部が、番号ＣＵのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をＥＲ１１とする。【０１３４】
ｂ−９−５）占有状況解析部が、番号ＣＵのスレッドについて、すでにスケジュール、あるいは仮割当てされた命令に占められていない時刻を解析し、その時刻の集合をＥＲ１２とする。【０１３５】
ｂ−９−６）依存遅延解析部が、命令ＴＬ［Ｖ２］が依存している命令のうち、すでにスケジュール、あるいは仮割当てされているものについて、ＴＬ［Ｖ２］へのデータの送信を調べ、それらの命令のデータの、番号ＣＵのスレッドへの到着時刻を調べ、その最大値をＥＲ１３とする。【０１３６】
ｂ−９−７）スレッド終了時刻制限解析部が、番号ＣＵのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をＥＲ１４とする。【０１３７】
ｂ−９−８）スケジュール候補命令選択部が、集合ＥＲ１２の要素のうち、 時刻ＥＲ１１以上かつ時刻ＥＲ１４以下かつ時刻ＥＲ１３以上のもののうち、最小のものは存在するか判定する。【０１３８】
ｂ−９−９）スケジュール候補命令選択部が、スレッド番号ＣＵを１進める。【０１３９】
ｂ−９−１０）スケジュール候補命令選択部が、存在する場合はその時刻をＥＲ１５とする。【０１４０】
ｂ−９−１１）スケジュール候補命令選択部が、命令ＴＬ［Ｖ２］に対する、時刻ＥＲ１５のスレッド番号ＣＵに渡る最小値を記憶し、最小値が更新された場合、ＣＵも記憶する。【０１４１】
ｂ−９−１２）スケジュール候補命令選択部が、ＣＵがＲＭ２に達したか判定する。【０１４２】
ｂ−９−１３）スケジュール候補命令選択部が、スレッド番号ＣＵを１増やす。【０１４３】
ｂ−９−１４）スケジュール候補命令選択部が、ステップｂ−９−１１で記憶したスレッド番号、時刻にＴＬ［Ｖ２］を仮に割り当てる。【０１４４】
ｂ−９−１５）スケジュール候補命令選択部が、ＴＳのすべての命令を仮に割り当てたか判定する。【０１４５】
ｂ−９−１６）スケジュール候補命令選択部が、変数Ｖ２を１増やす。【０１４６】
ｂ−９−１７）スケジュール候補命令選択部が、仮の割当てをすべて消去して、ＴＬ［Ｖ２］が仮に割り当てられたスレッド番号と時刻を出力する。【０１４７】
［第１２の実施の形態］
第１２の実施の形態は、次にスケジュールする命令を選択するステップにおいて、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析する。【０１４８】
［第１３の実施の形態］
第１３の実施の形態は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップにおいて、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とする。【０１４９】
［第１４の実施の形態］
第１４の実施の形態に係るプログラム並列化プログラムは、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、命令実行開始・終了時刻制限選択手段、スレッド開始時刻制限解析手段、スレッド終了時刻制限解析手段、占有状況解析手段、スケジュール候補命令選択手段、及び命令配置手段として機能させる。【０１５０】
命令実行開始・終了時刻制限選択手段は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【０１５１】
スレッド開始時刻制限解析手段は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【０１５２】
スレッド終了時刻制限解析手段は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【０１５３】
占有状況解析手段は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【０１５４】
スケジュール候補命令選択手段は、次にスケジュールする命令を選択する。【０１５５】
命令配置手段は、命令に対し実行するプロセッサと時刻を割り当てる。【０１５６】
［第１５の実施の形態］
第１５の実施の形態に係るプログラム並列化プログラムは、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、命令実行開始・終了時刻制限選択手段、スレッド開始時刻制限解析手段、スレッド終了時刻制限解析手段、占有状況解析手段、依存遅延解析手段、スケジュール候補命令選択手段、命令配置手段、並列実行時間測定手段、及び最良スケジュール決定手段として機能させる。【０１５７】
命令実行開始・終了時刻制限選択手段は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【０１５８】
スレッド開始時刻制限解析手段は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【０１５９】
スレッド終了時刻制限解析手段は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【０１６０】
占有状況解析手段は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【０１６１】
依存遅延解析手段は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。【０１６２】
スケジュール候補命令選択手段は、次にスケジュールする命令を選択する。【０１６３】
命令配置手段は、命令に対し実行するプロセッサと時刻を割り当てる。【０１６４】
並列実行時間測定手段は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。【０１６５】
最良スケジュール決定手段は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。【０１６６】
［第１６の実施の形態］
第１６の実施の形態に係るプログラム並列化プログラムは、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置を構成するコンピュータを、制御フロー解析手段、スケジュール領域形成手段、命令間メモリデータフロー解析手段、命令実行開始・終了時刻制限選択手段、スレッド開始時刻制限解析手段、スレッド終了時刻制限解析手段、占有状況解析手段、依存遅延解析手段、スケジュール候補命令選択手段、命令配置手段、並列実行時間測定手段、最良スケジュール決定手段、レジスタ割り当て手段、及びプログラム出力手段として機能させる。【０１６７】
制御フロー解析手段は、入力した逐次処理プログラムの制御フローを解析する。【０１６８】
スケジュール領域形成手段は、制御フロー解析手段による制御フローの解析結果を参照して、スケジュール対象となる領域を決定する。【０１６９】
レジスタデータフロー解析手段は、スケジュール領域形成手段によるスケジュール領域の決定を参照して、レジスタのデータフローを解析する。【０１７０】
命令間メモリデータフロー解析手段は、あるアドレスに読み書きを行う命令と、アドレスから読み書きを行う命令の間の依存を解析する。【０１７１】
命令実行開始・終了時刻制限選択手段は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。【０１７２】
スレッド開始時刻制限解析手段は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【０１７３】
スレッド終了時刻制限解析手段は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。【０１７４】
占有状況解析手段は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。【０１７５】
依存遅延解析手段は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。【０１７６】
スケジュール候補命令選択手段は、次にスケジュールする命令を選択する。【０１７７】
命令配置手段は、命令に対し実行するプロセッサと時刻とを割り当てる。【０１７８】
並列実行時間測定手段は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。【０１７９】
最良スケジュール決定手段は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。【０１８０】
レジスタ割り当て手段は、最良スケジュール決定手段の結果を参照して、レジスタ割り当てを行う。【０１８１】
プログラム出力手段は、レジスタ割り当て手段の結果を参照して、並列化プログラムを生成し出力する。【０１８２】
［第１７の実施の形態］
第１７の実施の形態は、スケジュール候補命令選択手段が、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析する。【０１８３】
［第１８の実施の形態］
第１８の実施の形態は、命令実行開始・終了時刻制限選択手段が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とする。【０１８４】
上記各実施の形態によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。【０１８５】
第１の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。このことを前述した図６の例を用いて説明する。【０１８６】
図６（ａ）では、スレッド１に多くの命令を割り当てたため、プロセッサ２において命令が実行されないサイクルが生じている。本実施の形態によれば、図６（ｂ）のように命令数を均等にして割り当てることができ、プロセッサ２における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。【０１８７】
第２の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドの実行開始時刻の間隔を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。このことを前述した図７の例を用いて説明する。【０１８８】
図７（ａ）では、スレッド２に割り当てられた命令列の開始時刻が遅れているため、プロセッサ１において命令が実行されないサイクルが生じている。本実施の形態によれば、図７（ｂ）のように命令の実行開始時刻の間隔を整えて割り当てることができ、プロセッサ１における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。【０１８９】
各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃え、かつ、各スレッドの実行開始時刻の間隔を揃えるには、各スレッドの命令の開始・終了時刻に制限を加えた上でさらに、並列実行時間を短くできるスケジュールを行う必要がある。命令スケジュールにおいて並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行完了の時刻を予測し、その時刻が最も遅いような先頭の命令を先にスケジュールする必要がある。最長依存命令列とは、依存グラフ上での依存に沿った命令列で、その実行終了時刻が最も遅い命令列である。なぜなら、最も遅く実行が完了する命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、この命令列の実行完了時刻の予測精度をあげる必要がある。このためには、先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握と、命令列の実行時刻の正確な予測が必要である。【０１９０】
本実施の形態によれば、各スレッドの命令の開始・終了時刻に制限を加えた上でさらに、これらを可能にする。結果として、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えて、かつ、各スレッドの実行開始時刻の間隔を揃えることができる。【０１９１】
ある命令を先頭とする依存グラフ上の命令列について、その先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握ができる理由は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令を割当て可能なスレッド番号と時刻を選択できるためである。【０１９２】
図１２を参照して具体例を説明する。図１２（ａ）に示す命令の依存グラフを持つ命令列をスケジュールする。実行開始間隔が２、命令数が８になるような制限でスケジュールする。フォーク命令の遅延は、1サイクルとする。命令Ａ７と命令Ａ６をスケジュールした時点を考える。命令Ｂ６と命令Ｃ５を次にスケジュールする命令の候補とする。命令Ｂ６を先頭とする最長依存命令列は、Ｂ６〜Ｂ４、Ａ３〜Ａ１である。命令Ｂ６について最も早いスケジュール位置を調べる。スレッド番号１の時刻０〜２はすでにスケジュールされている命令で埋まっていることを把握する。さらに、スレッド番号２の時刻０〜１は開始時刻制限のために使用できないということを把握する。こうすることで、スケジュールできる最も早い位置はスレッド番号２、時刻２であると正確に把握できる。【０１９３】
また、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる理由は、次のとおりである。【０１９４】
第１の理由は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるためである。図９を参照して具体例を説明する。図９（ａ）に示す依存グラフを持つ命令列をスケジュールする。実行開始間隔が２、命令数が６になるような制限でスケジュールする。フォーク命令の遅延は、２サイクルとする。また、レジスタ値を隣接プロセッサに送信する際の遅延は、２サイクルとする。図のように、命令ｃ２がスケジュールされており、スレッド番号１、時刻３〜４が空いているとする。ここで、命令ｄ３をスケジュールすることを考える。命令ｄ３をスレッド番号１、時刻３に割り当てると仮定して、命令ｄ３を先頭とする最長依存命令列ｄ３、ｄ２、ｃ１の末尾の命令ｃ１の実行時刻を予測する。命令ｄ２はスレッド番号１、時刻４に割り当てられると予測する。命令ｃ１は命令ｃ２に依存していて、命令ｃ２はスレッド番号３、時刻７に割り当てられている。想定している並列プロセッサシステムでは、ある命令から別の命令へのデータの通信は、スレッド番号が変化しないか、増加する方向にしか行えない。このため、命令ｃ１が割り当てられるスレッド番号は３以上となる。このことを考慮して、命令ｃ１はスレッド番号３、時刻８に割り当てられると予測する。このように、命令ｄ３、命令ｄ２、命令ｃ１のそれぞれについて割り当てられるスレッド番号と時刻を予想することにより、命令ｃ１の実行される時刻をより正確に予測できる。【０１９５】
第２の理由は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令列の実行時間を予測できるためである。図１３を参照して具体例を説明する。図１３（ａ）に示す依存グラフを持つ命令列をスケジュールする。実行開始間隔が２、命令数が８になるような制限でスケジュールする。フォーク命令の遅延は、２サイクルとする。また、レジスタ値を隣接プロセッサで通信する際の遅延は、２サイクルとする。スレッド番号１の時刻０〜６、スレッド番号２の時刻２〜６、スレッド番号３の時刻４〜６は、すでにスケジュールされている命令で埋まっているとする。ここで、命令Ａ３をスケジュールすることを考える。ここで、命令Ａ３をスレッド番号１、時刻７に割り当てると仮定して、Ａ３を先頭とする依存グラフ上での命令列の末尾の命令Ａ１の実行時刻を予測する。スレッド番号１、時刻８は実行開始・終了時刻の制限により利用できない、ということを把握し、Ａ２はレジスタ値通信の遅延時間を考慮してスレッド番号２、時刻９に実行されると予測し、さらに、スレッド番号２、時刻１０は実行開始・終了時刻の制限により利用できない、ということを把握し、Ａ１はレジスタ値通信の遅延時間を考慮してスレッド番号３、時刻１１に実行されると予測する。このように、Ａ３をスレッド番号１、時刻７に割り当てる場合のＡ１の実行時刻を正確に予測できる。【０１９６】
以下、本発明の具体的な実施例について説明する。
【実施例１】
【０１９７】
図１を参照すると、本発明の第１の実施例にかかるプログラム並列化装置１００は、記憶装置３０２の記憶部３２０Ｍから、図示しないプログラム解析装置によって生成された、逐次処理中間プログラム３２０を入力し、記憶装置３０３の記憶部３３０Ｍから、図示しない依存解析装置によって生成された、命令間の依存情報３３０を入力し、記憶装置３０４の記憶部３４０Ｍから、命令の実行開始・終了時刻の制限３４０を入力し、各命令の実行時刻と実行プロセッサを決定した並列化中間プログラム３５０を生成し、記憶装置３０５の記憶部３５０Ｍに記録する装置である。【０１９８】
図１に示すプログラム並列化装置１００は、入力となる逐次処理中間プログラム３２０を記憶する磁気ディスクなどの記憶装置３０２と、入力となる命令間の依存情報３３０を記憶する磁気ディスク等の記憶装置３０３と、入力となる命令の実行開始・終了時刻の制限３４０を記憶する磁気ディスク等の記憶装置３０４と、出力となる並列化中間プログラム３５０を記憶する磁気ディスクなどの記憶装置３０５と、これらの記憶装置３０２、３０３、３０４及び３０５に接続された中央処理装置等の処理装置１０７とを備える。また、処理装置１０７は、スレッド開始・終了時刻制限スケジュール部１０８を備える。【０１９９】
このようなプログラム並列化装置１００は、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスク等のコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にスレッド開始・終了時刻制限スケジュール部１０８といった機能手段を実現する。【０２００】
スレッド開始・終了時刻制限スケジュール部１０８は、逐次処理中間プログラム３２０と、命令間の依存情報３３０と、命令の実行開始・終了時刻の制限３４０を入力し、スケジュールを決定する。スケジュールとは、すなわち、各命令の実行スレッド番号と実行時刻を決定することである。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。そして、並列化の結果である並列化中間プログラム３５０を記録する。【０２０１】
スレッド開始・終了時刻制限スケジュール部１０８は、あるスレッドについて、命令実行開始時刻の制限に基づいて、命令を配置できるスレッド番号と時刻のスレッドを解析するスレッド開始時刻制限解析部２２０と、あるスレッドについて、命令実行終了時刻の制限に基づいて、命令を配置できるスレッド番号と時刻のスレッドを解析するスレッド終了時刻制限解析部２３０と、すでにスケジュールされた命令によって占有されているスレッド番号と時刻のスロットを解析する占有状況解析部２４０と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部２５０と、スレッド開始時刻制限解析部２２０と、スレッド開始時刻制限解析部２３０と、占有状況解析部２４０と、依存遅延解析部２５０の情報を元に、次にスケジュールを行う命令を選択するスケジュール候補命令選択部１９０と、スケジュール候補命令選択部１９０の決定に基づいて、命令をスロットに割り当てる、すなわち、命令の実行時刻と実行スレッドを決定する命令配置部２００と、スケジュール結果を実現するように命令の実行順序を決定し、フォーク命令を挿入するフォーク挿入部２１０と、を備える。【０２０２】
次に、本実施例にかかるプログラム並列化装置１００の動作について説明する。特に、図２及び図３を参照して、スレッド開始・終了時刻制限スケジュール部１０８で処理される各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理を説明する。【０２０３】
スレッド開始・終了時刻制限スケジュール部１０８は、記憶装置３０２の記憶部３２０Ｍから逐次処理中間プログラム３２０を入力する。逐次処理中間プログラム３２０はグラフの形で表現される。逐次処理中間プログラム３２０を構成する関数は、関数を表すノードとして表現され、関数を構成する命令は、命令を表すノードとして表現される。また、ループは再帰関数に変換して、再帰関数として表現してもよい。また、逐次処理中間プログラム３２０においては、命令の実行時刻と実行スレッド番号とを決定する命令スケジュールの対象となる、スケジュール領域が決定されている。スケジュール領域は、例えば、基本ブロックとしてもよいし、複数の基本ブロックとしてもよい。【０２０４】
次に、記憶装置３０３の記憶部３３０Ｍから命令間の依存情報３３０を入力する。依存情報３３０は、レジスタ、メモリの読み書きに伴うデータフローの解析、制御フローの解析により得られる、命令間の依存であり、命令を表すノードを結ぶ有向辺で表す。【０２０５】
次に、記憶装置３０４の記憶部３４０Ｍから命令の実行開始・終了時刻の制限３４０を入力する。この制限３４０は、例えば、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるようなものでもよい。【０２０６】
図８を参照して、具体例を説明する。図８において、マス目は、スレッド番号と、時刻のスロットを表し、色分けされたマス目は、そこに命令が配置されていることを表す。間隔を１サイクル、命令数を４とするような制限は、図８（ａ）のような命令の配置の制限である。また、間隔を２サイクル、命令数を８とするような制限は、図８（ｂ）のような命令の配置の制限である。また、全てのスレッドに対して開始時刻がスレッド番号とともに一定の増分で増えるが、各スレッドの命令数に制限を加えないような制限を用いてもよい。また、各スレッドの命令数にだけ制限をおいて、各スレッドに対して開始時刻に制限を加えないような制限を用いてもよい。【０２０７】
次に、各命令について、その命令を先頭とする最長依存命令列を調べる。最長依存命令列とは、依存グラフ上での命令列で、その実行終了時刻が最も遅い命令列である。【０２０８】
図１０を参照して具体例を説明する。図１０において、丸印は命令を表し、矢印は命令間の依存を表す。ここで、命令Ａ４について、命令Ａ４を先頭とする依存グラフ上での命令列は、Ａ４、Ａ３、Ａ２、Ａ１と、Ａ４、Ｃ２、Ａ１と二つある。このうち、前者の方が命令数が多く実行時間が長いため、実行終了時刻が最も遅いと推定する。【０２０９】
ある命令を先頭とする最長依存命令列を調べるために、各命令Ｉについて、ＨＴ（Ｉ）と呼ぶ値を、以下のように計算する（ステップＳ２０１）。【０２１０】
すなわち、命令Ｉに依存している命令の集合をＤＳＥＴとする。次にＤＳＥＴの各要素ＤＩについて、ＨＴ（ＤＩ）にＩからＤＩへの通信時間を加えたものを比べ、最大のものＭＡＸＤＳＥＴを求める。最後にＨＴ（Ｉ）をＭＡＸＤＳＥＴに命令Ｉの実行時間を加えたものとする。計算の順番は以下のとおりである。【０２１１】
すなわち、命令ＩＡに依存している命令の集合が空集合であるような命令ＩＡについて計算する。続いて、命令ＩＢに依存している全命令についてすでに計算が済んでいるような命令ＩＢについて計算していく。また、命令ＩＣについて、ＭＡＸＤＳＥＴを与えるような、命令ＩＣに依存する命令ＩＤを、命令ＩＣに記憶しておく。ＩＣからＩＤをたどることで、実行終了時刻が最も遅いと推定される命令列をたどることができる。【０２１２】
図１０を参照して具体例を説明する。図１０に示す命令の依存グラフにおいて、丸印は命令を表し、矢印は命令間の依存を表す。命令の遅延時間は１サイクル、データの通信時間は０サイクルとする。ＨＴ（Ｉ）の計算はＡ１から始まり、ＨＴ（Ａ１）が１と計算される。次にＨＴ（Ａ２）が２と計算される。そして、ＨＴ（Ａ３）が３と計算され、ＨＴ（Ｃ２）が２と計算される。さらに、ＨＴ（Ａ４）は、ＨＴ（Ａ３）にＡ３からＡ４への通信時間０を加えたものと、ＨＴ（Ｃ２）にＡ３からＡ４への通信時間０を加えたものを比較し、多いほうを選択し、４と計算される。【０２１３】
次に、依存している命令がない命令を命令の集合ＲＳに登録する（ステップＳ２０２）。【０２１４】
次に、集合ＲＳの全命令に対して処理を行うため、処理を行っていない命令を未選択とマークし、処理を行った命令と区別する。そのために、まず集合ＲＳの全命令を未選択とマークする（ステップＳ２０３）。【０２１５】
次に、集合ＲＳに属する命令のうち、未選択のものを命令ＲＩとする（ステップＳ２０４）。【０２１６】
次に、命令ＲＩが依存している命令のうち、すでにスケジュールされたもののうち、最もスレッド番号が大きいもののスレッド番号をＬＦとする。そのような命令がない場合にはＬＦは１とする。スレッド番号ＬＦより大きくかつ現在命令がスケジュールされていない最も番号の小さいスレッド番号をＲＭとする。スレッド番号ＴＮをＬＦに設定する（ステップＳ２０５）。スレッド番号ＴＮは、命令ＲＩを割り当てようとするスレッド番号である。スレッド番号ＬＦは、その最小値である。スレッド番号ＲＭは、その最大値である。想定している並列プロセッサシステムでは、ある命令から別の命令へのデータの通信は、スレッド番号が変化しないか、増加する方向にしか行えない。このため、ある命令は、依存している命令のうち、最もスレッド番号が大きいものと同じ番号を持つスレッドか、それ以上の番号を持つスレッドでしか実行できない。このため、ＬＦ以上のスレッド番号のみ考慮する。【０２１７】
次に、命令ＲＩについて、番号ＴＮのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析し、その時刻の集合をＥＲ１とする（ステップＳ２０６）。各スレッドの命令実行開始時刻の制限により、命令を割り当て可能な時刻が制限される。例えば、すべてのスレッドで開始時刻がスレッド番号とともに一定の増分２で増えるような命令実行開始時刻の制限を用いた場合、Ｎ番のスレッドについては、２×（Ｎ−１）未満の時刻は使用できない。【０２１８】
図１１を参照して具体例を説明する。この例では、すべてのスレッドで開始時刻がスレッド番号とともに一定の増分３で増えるような命令実行開始時刻の制限を用いる。番号１のスレッドではサイクル０から命令を割り当てることができる。番号２のスレッドでは、サイクル０〜２に命令を割り当てることはできない。番号３のスレッドには、サイクル０〜５に命令を割り当てることはできない。番号４のスレッドには、サイクル０〜８に命令を割り当てることはできない。【０２１９】
次に、命令ＲＩについて、番号ＴＮのスレッドについて、すでにスケジュールされた命令に占められていない時刻を解析し、その時刻の集合をＥＲ２とする（ステップＳ２０７）。どのスレッド番号のどの時刻がすでにスケジュールされた命令に占められているかの解析には、例えば、スレッド番号と時刻の二次元の表に、すでにスケジュールされた命令が割り当てられた位置を記録しておき、これを参照するという方法を用いてもよい。【０２２０】
次に、命令ＲＩが依存している命令で、かつすでにスケジュールされた命令の、データのＲＩへの送信を調べる。送信がない場合はＥＲ３を０とする。送信がある場合は、それらの命令のデータの、番号ＴＮのスレッドへの到着時刻を調べる。到着時刻の最大値を求め、それをＥＲ３とする（ステップＳ２０８）。命令ＩＡから命令ＩＢにレジスタ値の依存がある場合、命令ＩＡは命令ＩＢにレジスタデータを送信する。また、送信するデータは、例えば、レジスタデータ、メモリデータを含んでもよい。【０２２１】
次に、命令ＲＩについて、番号ＴＮのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をＥＲ４とする（ステップＳ２０９）。【０２２２】
次に、集合ＥＲ２の要素のうち、 時刻ＥＲ１以上かつ時刻ＥＲ４以下かつ時刻ＥＲ３以上のもののうち、最小のものは存在するか判定する（ステップＳ２１０）。【０２２３】
最小のものが存在しない場合は、スレッド番号ＴＮを1進め、制御をステップＳ２０６に戻す（ステップＳ２１１）。【０２２４】
最小のものが存在する場合は、その時刻をＥＲ５とする（ステップＳ２１２）。【０２２５】
次に、スレッド番号ＴＮ、時刻ＥＲ５に命令ＲＩを割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、命令ＲＩを先頭とする最長依存命令列の末尾の命令ＴＩについて、その実行時刻を推定する（ステップＳ２１３）。このステップについては後ほどさらに詳しく説明する。【０２２６】
次に、命令ＲＩを配置するスレッド番号を変えた際に、命令ＲＩを先頭とする最長依存命令列の末尾の命令ＴＩの実行時刻の予測値が変化する可能性があるため、スレッド番号を変化させて命令ＴＩの実行時刻を予測する。そのうち最小となるような、命令ＲＩを割り当てるスレッド番号と時刻と、命令ＴＩの予測時刻を命令ＲＩに記憶する（ステップＳ２１４）。【０２２７】
命令ＲＩを割り当てようとするスレッド番号ＴＮは、ＬＦからＲＭまで変化させる。そのため、スレッド番号ＴＮがＲＭに達したか判定する（ステップＳ２１５）。【０２２８】
次に、スレッド番号ＴＮがスレッド番号ＲＭに達していない場合は、ＴＮを1進め、制御をステップＳ２０６に戻す（ステップＳ２１６）。【０２２９】
次に、スレッド番号ＴＮがスレッド番号ＲＭに達している場合は、集合ＲＳの全ての命令を選択したか判定し、全ての命令を選択していなければ、制御をステップＳ２０４に戻す（ステップＳ２１７）。【０２３０】
全ての命令を選択していれば、Ｓ２１４で記憶した命令ＴＩの予測時刻が最も大きい命令をスケジュール対象ＣＤとし、記憶したスレッド番号と、記憶した時刻にスケジュールする（ステップＳ２１８）。命令スケジュールにおいて、並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の実行完了の予測時刻が最も遅いものを選び、その先頭の命令を先にスケジュールする必要がある。なぜなら、最も遅い命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、命令ＴＩの予測時刻が最も大きい命令を優先してスケジュールする。最も大きい命令が複数ある場合は、例えば、ＨＴ（Ｉ）の値が大きいものを優先しても良い。【０２３１】
次に、命令ＣＤを集合ＲＳから除去する。また、命令ＣＤに依存している命令について調べ、その命令について、命令ＣＤに対する依存が解決したとする。依存している命令がなくなった場合はその命令を集合ＲＳに登録する（ステップＳ２１９）。【０２３２】
次に、全ての命令をスケジュールしたか判定し、全ての命令をスケジュールしていなければ、制御をステップＳ２０３に戻す（ステップＳ２２０）。【０２３３】
最後に、全ての命令をスケジュールしていたら、スケジュール結果を出力し（ステップＳ２２１）、処理を終了する。【０２３４】
次に、図４及び図５を参照して、スレッド開始・終了時刻制限スケジュール部１０８で処理される各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理のうち、ステップＳ２１３に対応する処理について詳細に説明する。【０２３５】
まず、命令ＲＩを先頭とする、依存グラフにおける命令列について、最長のものＴＳとし、ＴＳを、ＴＬ［０]をＲＩとして、ＴＬ［０］、ＴＬ[１]、ＴＬ[２]、…と表す（ステップＳ４０１）。最長の命令列の決定は、例えば、以下のようにしてもよい。すなわち、ＨＴ（ＲＩ）の計算の際に、ＲＩに依存していてＨＴ（ＲＩ）の値を決定した命令ＲＪを記憶していた。命令ＲＩから命令ＲＪに辿り、さらに命令ＲＪに記憶された命令ＲＫを辿り、ということを繰り返すことにより、最長の命令列を決める。【０２３６】
次に、変数Ｖ２を１とする（ステップＳ４０２）。変数Ｖ２は、命令列ＴＳを辿るための変数である。【０２３７】
次に、ＴＬ［Ｖ２］が依存している命令のうち、すでにスケジュール、あるいは仮に割当てられているもののうち、最もスレッド番号が大きいもののスレッド番号をＬＦ２とする。そのような命令がない場合にはＬＦ２は１とする。スレッド番号ＬＦ２より大きくかつ、現在命令がスケジュールされていない最も番号の小さいスレッド番号をＲＭ２とする。変数ＣＵにＬＦ２を代入する（ステップＳ４０３）。変数ＣＵは、ＴＬ［Ｖ２］を仮に割当てようとするスレッド番号を表す。スケジュールされているもの、あるいは仮に割当てられているものについては、そのスレッド番号と時刻がわかっているので、依存による遅延を考慮する。【０２３８】
次に、番号ＣＵのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をＥＲ１１とする（ステップＳ４０４）。【０２３９】
次に、番号ＣＵのスレッドについて、すでにスケジュールされた命令に占められていない時刻を解析し、その時刻の集合をＥＲ１２とする（ステップＳ４０５）。【０２４０】
次に、ＴＬ[Ｖ２]が依存している命令のうち、すでにスケジュール、あるいは仮に割り当てられているものについて、命令ＴＬ［Ｖ２］へのデータの送信を調べる。送信がない場合はＥＲ１３を０とする。送信がある場合は、それらの命令のデータの、番号ＣＵのスレッドへの到着時刻を調べる。到着時刻の最大値を求め、それをＥＲ１３とする（ステップＳ４０６）。【０２４１】
次に、番号ＣＵのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をＥＲ１４とする（ステップＳ４０７）。【０２４２】
次に、集合ＥＲ１２の要素のうち、 時刻ＥＲ１１以上かつ時刻ＥＲ１４以下かつ時刻ＥＲ1３以上のもののうち、最小のものは存在するか判定する（ステップＳ４０８）。最小のものが存在しない場合は、スレッド番号ＣＵを１進め、制御をＳ４０４に戻す（ステップＳ４０９）。最小のものが存在する場合は、その時刻をＥＲ１５とする（ステップＳ４１０）。【０２４３】
次に、命令ＴＬ［Ｖ２］について、スレッド番号を変化させて、時刻ＥＲ１５の最小値を調べる。そのため、命令ＴＬ［Ｖ２］に対する、時刻ＥＲ１５のスレッド番号ＣＵに渡る最小値を記憶し、最小値が更新された場合、ＣＵも記憶する（ステップＳ４１１）。【０２４４】
次に、命令ＴＬ［Ｖ２］を配置しようとするスレッド番号ＣＵは、ＬＦ２からＲＭ２まで変化させる。そのため、スレッド番号ＣＵがＲＭ２に達したか判定し（ステップＳ４１２）、ＲＭ２に達していなければ、スレッド番号ＣＵを1増やし（ステップＳ４１３）、制御をステップＳ４０４に戻す。ＲＭ２に達していれば、ステップＳ４１１で記憶したスレッド番号、時刻にＴＬ［Ｖ２］を仮に割り当てる（ステップＳ４１４）。仮の割当て、命令スケジュールによる割当て区別して、後で取り消せるようにしておく。【０２４５】
次に、ＴＳのすべての命令を仮に割当てたか判定し（ステップＳ４１５）、すべての命令を仮に割り当てていなければ、変数Ｖ２を１増やし、制御をステップＳ４０３に戻す（ステップＳ４１６）。すべての命令を仮に割り当てていれば、仮の割当てに関する情報をすべて消去して、ＴＬ［Ｖ２］のスロットのスレッド番号と時刻を返し処理を終了する（ステップＳ４１６）。ここで、ＴＬ［Ｖ２］は、命令ＲＩを先頭とする、最長依存命令列の末尾の命令である。【０２４６】
次に、本実施例の効果を説明する。【０２４７】
本実施例によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。【０２４８】
第１の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図６の例を用いて説明する。図６において、マス目はスレッド番号と、時刻のスロットを表し、色分けされたマス目はそこに命令が配置されていることを表す。同一プロセッサで動作する複数のスレッドを区別するために色を分けている。図６（ａ）では、スレッド１に多くの命令を割り当てたため、プロセッサ２において命令が実行されないサイクルが生じている。本実施例によれば、図６（ｂ）のように命令数を均等にして割り当てることができ、プロセッサ２における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。【０２４９】
第２の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドの実行開始時刻の間隔を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図７の例を用いて説明する。図７（ａ）では、スレッド２に割り当てられた命令列の開始時刻が遅れているため、プロセッサ１において命令が実行されないサイクルが生じている。本実施例によれば、図７（ｂ）のように命令の実行開始時刻の間隔を整えて割り当てることができ、プロセッサ１における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。【０２５０】
各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃え、かつ、各スレッドの実行開始時刻の間隔を揃えるには、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、並列実行時間を短くできるスケジュールを行う必要がある。命令スケジュールにおいて並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行完了の時刻を予測し、その時刻が最も遅いような先頭の命令を先にスケジュールする必要がある。最長依存命令列とは、依存グラフ上での依存に沿った命令列で、その実行終了時刻が最も遅い命令列である。なぜなら、最も遅く実行が完了する命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、この命令列の実行完了時刻の予測精度をあげる必要がある。このためには、先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握と、命令列の実行時刻の正確な予測が必要である。本実施例は、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、これらを可能にする。結果として、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えて、かつ、各スレッドの実行開始時刻の間隔を揃えることができる。【０２５１】
ここで、ある命令を先頭とする依存グラフ上の命令列について、その先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握ができる理由は、各スレッドの命令の実行開始・終了時刻の制限を考慮して、命令を割当て可能なスレッド番号と時刻を選択できるためである。【０２５２】
また、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる理由は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるためと、各スレッドの命令の開始・終了時刻の制限を考慮して、命令列の実行時間を予測できるためである。【０２５３】
（具体例）
図１４を参照して、第１の実施例に係るプログラム並列化装置１００におけるスレッド開始・終了時刻制限スケジュール部１０８の処理の具体例を説明する。【０２５４】
図１４（ａ）は、入力となる逐次処理中間プログラムと、入力となる命令間の依存情報を示す図である。丸は命令を表し、矢印は命令間の依存を表す。入力となる命令の実行開始・終了時刻の制限は、全てのスレッドに対して開始時刻と終了時刻の差が一定値６で、開始時刻がスレッド番号とともに一定の増分２で増えるような制限とする。プロセッサ数は３とする。全命令の遅延時間は１サイクルとする。フォーク命令の遅延時間は２サイクルとする。レジスタデータを命令の間で通信する場合の遅延時間は、スレッド番号ｉのスレッドからスレッド番号ｊのスレッドに送る場合に、２＋（ｊ−ｉ−１）＊１サイクルとする。各スレッドの命令の実行開始・終了時刻の制限を実現するために、あらかじめフォーク命令を、スレッド番号ｐのスレッドについては時刻ｐ＊２に割り当てておく。【０２５５】
図１５に、各スレッドの命令の実行開始・終了時間の制限と、フォーク命令を示す。灰色ではないマス目に命令を割り当てる。命令ｆ１〜ｆ３はあらかじめ割り当てられているフォーク命令である。【０２５６】
次に、図１４（ａ）に示す具体例に対する第１の実施例によるスレッド開始・終了時刻制限スケジュール部１０８の動作の詳細を、図２から図５のフローチャートも参照しつつ説明する。【０２５７】
まず、ステップＳ２０１において、各命令IについてのＨＴ（Ｉ）を計算する。全命令の遅延時間は１サイクルであるので、図１４（ｂ）に示す値となる。例えば、ＨＴ（命令ａ６）は６である。命令ＨＴ（Ｉ）を与える命令は、各命令に依存している命令である。例えば、命令ａ７に対しては命令ａ６である。【０２５８】
次に、ステップＳ２０２において、他の命令に依存していない命令ａ６、命令ｂ５、命令ｃ４、命令ｄ２、命令ｅ２を集合ＲＳに登録する。【０２５９】
次に、ステップＳ２０３において、集合ＲＳの全命令を未選択とする。【０２６０】
次に、ステップＳ２０４において、集合ＲＳに属する命令のうち、未選択のもの命令ａ６を命令ＲＩにする。【０２６１】
次に、ステップＳ２０５において、命令ａ６が依存している命令はないので、スレッド番号ＬＦを１とする。また、ＬＦより大きくかつ命令が割り当てられていない最小スレッド番号は２であるので、スレッド番号ＲＭは２とする。スレッド番号ＴＮをＬＦすなわち１にする。【０２６２】
次に、ステップＳ２０６において、各スレッドの命令の実行開始時刻の制限に従うと、番号１のスレッドについてはサイクル０から命令を割当て可能であるので、時刻ＥＲ１を０にする。【０２６３】
次に、ステップＳ２０７において、番号１のスレッドについては、サイクル０に命令ｆ１が割当てられているため、集合ＥＲ２を０以外の全てのサイクルとする。【０２６４】
次に、ステップＳ２０８において、命令ａ６が依存している命令はないため、ＥＲ３を０にする。【０２６５】
次に、ステップＳ２０９において、命令の実行終了時刻の制限に従うと、番号１のスレッドについてはサイクル５まで命令を割当て可能であるので、時刻ＥＲ４を５にする。【０２６６】
次に、ステップＳ２１０において、集合ＥＲ２の要素のうち、 時刻ＥＲ１以上かつ時刻ＥＲ４以下かつ時刻ＥＲ３以上のもののうち、最小のものは１で、存在するので、制御をステップＳ２１２に移す。【０２６７】
次に、ステップＳ２１２において、時刻ＥＲ５を１にする。【０２６８】
次に、ステップＳ２１３において、スレッド番号ＴＮ、時刻ＥＲ５に命令ＲＩを割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、命令ＲＩが属する最長依存命令列の末尾の命令ＴＩの実行時刻を推定する。【０２６９】
図３に移る。まず、 ステップＳ４０１において、命令ａ６を先頭とする、依存グラフにおける命令列について、最長のものはａ６、ａ５、ａ４、ａ３、ａ２、ａ１であるので、これを命令列ＴＳとする。【０２７０】
次に、ステップＳ４０２において、変数Ｖ２を１にする。【０２７１】
次に、ステップＳ４０３において、ＴＬ［１］は命令ａ５であり、命令ａ５が依存しているのは命令ａ６なのでスレッド番号ＬＦ２を１とする。現在命令が割り当てられていないスレッドのうち、番号が最小のものは２であるので、スレッド番号ＲＭ２は２とする。変数ＣＵにＬＦ２すなわち１を代入する。【０２７２】
次に、ステップＳ４０４おいて、各スレッドの命令実行開始時刻の制限に基づくと、番号１のスレッドについては、命令は時刻０以上に割り当てることができるので時刻ＥＲ１１を０にする。【０２７３】
次に、ステップＳ４０５において、番号１のスレッドについては、時刻０に命令が割り当てられていて、時刻１に命令が仮に割り当てられているので、集合ＥＲ１２は０と１以外とする。【０２７４】
次に、ステップＳ４０６において、命令ａ５が依存しているのは命令ａ６なのでＥＲ１３を時刻２とする。【０２７５】
次に、ステップＳ４０７において、命令実行終了時刻の制限に基づくと、番号１のスレッドについては、命令は時刻５以下にしか割り当てることができないので時刻ＥＲ１４を５にする。【０２７６】
次に、ステップＳ４０８において、集合ＥＲ１２の要素のうち、 時刻ＥＲ１１以上かつ時刻ＥＲ１４以下かつ時刻ＥＲ1３以上のもののうち、最小のものは２で、存在するので、制御をステップＳ４１０に移す。【０２７７】
次に、ステップＳ４１０において、時刻ＥＲ１５を２にする。【０２７８】
次に、ステップＳ４１１において、時刻の最小値を２と記憶する。また、スレッド番号ＣＵの値１も記憶する。【０２７９】
次に、ステップＳ４１２において、スレッド番号ＲＭ２は１である。ＣＵは２に達していないので、ステップＳ４１３において、スレッド番号ＣＵを１進め、制御をステップＳ４０４に戻す。【０２８０】
ステップＳ４０４〜Ｓ４１３からなるループの２番目の繰り返しは１番目の繰り返しと同様に実行されるので概要のみを説明する。ステップＳ４０４で、時刻ＥＲ１１は２とする。ステップＳ４０５において、時刻２にフォーク命令が割り当てられているので、ＥＲ１２は３とする。ステップＳ４０６において、命令ａ５が依存しているのは命令ａ６で、命令ａ６はスレッド番号１、時刻１に仮に割り当てられているので、データをスレッド番号２に送信すると、到着時刻は時刻３となる。このため、ＥＲ１３は時刻３となる。ステップＳ４０７において、時刻ＥＲ１４は７とする。そして、ステップＳ４１０において、時刻ＥＲ１５は３となる。このため、ステップＳ４１１では、時刻の最小値は更新されない。そして、ステップＳ４１２において、変数ＣＵはスレッド番号ＲＭ２に達し、制御はＳ４１４に移る。【０２８１】
次に、ステップＳ４１４において、命令ａ５をスレッド番号１、時刻２に仮に割り当てる。【０２８２】
次に、ステップＳ４１５において、まだ仮に割り当てていないＴＳの命令があるので、制御をステップＳ４１６に移す。【０２８３】
次に、ステップＳ４１６において、変数Ｖ２を１増やし、制御をステップＳ４０３に移す。【０２８４】
ステップＳ４０３〜Ｓ４１６からなるループの２番目の繰り返しは１番目の繰り返しと同様に実行される。ＴＬ［２］は命令ａ４であり、スレッド番号１、時刻３に仮に割り当てられる。さらに、ＴＬ［３］は命令ａ３であり、スレッド番号１、時刻４に仮に割り当てられる。さらに、ＴＬ［４］は命令ａ２であり、スレッド番号１、時刻５に仮に割り当てられる。【０２８５】
５番目の繰り返しについて説明する。ＴＬ［５］は命令ａ１である。ステップＳ４０３で変数ＣＵを１とする。ステップＳ４０５において、集合ＥＲ１２は時刻０〜５以外となる。スレッド番号１は命令の実行終了間隔の制限により、時刻５以下にしか命令が割り当てることができない。そのためステップＳ４０７において、時刻ＥＲ１４が５となる。そのため、ステップＳ４０８において、スレッド番号１には、命令ａ２を割り当てられる時刻が存在しないことが分かる。このため、ステップＳ４０９において、命令ａ２を割り当てようとしているスレッド番号を示す変数ＣＵが２となり、ステップＳ４０４に制御が移る。命令ａ１はスレッド番号１、時刻５の命令ａ２に依存している。さらに命令ａ２からスレッド番号２にデータを送信すると遅延時間が２サイクルかかる。このためステップＳ４０６において、時刻ＥＲ１３は７となる。このため、命令ａ１はスレッド番号２、時刻７に仮に割り当てられる。【０２８６】
図１６に命令ａ６がスレッド番号１、時刻１に割り当てられたと仮定したときの、命令列ａ６〜ａ１の仮の割当ての結果を示す。【０２８７】
ステップＳ４１５において、命令列ＴＳの全ての命令を仮に割り当てたので、制御をステップＳ４１７に移す。【０２８８】
ステップＳ４１７において、仮の割当てをすべて消去して、命令ＴＬ［Ｖ２］、すなわち命令ａ１が仮に割り当てられたスレッド番号２、時刻７を出力して処理を終了する。【０２８９】
図２及び図３に戻る。ステップＳ２１４において、命令ａ６のスレッド番号１と時刻１と、命令ａ１の時刻７を記憶する。【０２９０】
ステップＳ２１５において、スレッド番号ＲＭは２である。スレッド番号ＴＮは１であるのでまだＲＭに達していないと判断し、ステップＳ２１６に制御を移す。【０２９１】
ステップＳ２１６において、スレッド番号ＴＮを１進め、制御をステップＳ２０６に移す。【０２９２】
以下の説明では、ステップＳ２０６〜Ｓ２１６からなるループを「ループＣ」と呼ぶ。ループＣの２番目の繰り返しは１番目の繰り返しと同様に実行されるので概要のみを説明する。まず、ステップＳ２０６において、各スレッドの命令の実行開始時刻の制限により、時刻ＥＲ１は２とされる。そして、ステップＳ２０７において、時刻２に割り当てられているフォーク命令のために、集合ＥＲ２は２以外とされる。そして、ステップＳ２０８において、命令ａ６に依存している命令はないのでＥＲ３は０とされる。ステップＳ２０９において、時刻ＥＲ４は７とされる。そして、ステップＳ２１０、ステップＳ２１２でＥＲ５は３とされる。ステップＳ２１３では、命令ａ６をスレッド番号２、時刻３に仮に割り当てたと仮定して、命令ａ６を先頭とする最長依存命令列ａ６〜ａ１を仮に割り当てて、命令列のうちで最も遅くに実行される命令ａ１の実行時刻を推定する。【０２９３】
図１７に命令ａ６がスレッド番号２、時刻３に割り当てられたと仮定したときの、命令列ａ６〜ａ１の仮の割当ての結果を示す。【０２９４】
ステップＳ２１４において、命令ａ１の時刻９は以前記憶したものより大きいので記憶されない。【０２９５】
ステップＳ２１５において、スレッド番号ＴＮは２であるためＲＭに達したと判断し、制御をステップＳ２１７に移す。【０２９６】
ステップＳ２１７において、まだ割り当てていない命令があるため制御をステップＳ２０４に戻す。【０２９７】
以下の説明では、Ｓ２０４〜Ｓ２１７からなるループを「ループＢ」と呼ぶ。ループＢの２番目の繰り返しは１番目の繰り返しと同様に実行されるので概要のみを説明する。ステップＳ２０４で、命令ｂ５を命令ＲＩとする。Ｓ２０５〜Ｓ２１２において、スレッド番号ＴＮは１、時刻ＥＲ５は時刻１とされる。ステップＳ２１３において、命令ｂ５をこのスレッド番号と時刻に割り当てたと仮定して、命令ｂ５を先頭とする最長依存命令列ｂ５〜ｂ３、ａ２，ａ１について、これらを仮に割り当てる。そして、この命令列の末尾の命令ａ１の実行時刻を推定する。【０２９８】
図１８に命令ｂ５がスレッド番号１、時刻１に割り当てられたと仮定したときの、命令列ｂ５〜ｂ３、ａ２，ａ１の仮の割当ての結果を示す。【０２９９】
この結果が、命令ｂ５については、命令ａ１が最も早い時刻に実行されるものである。このため、ステップＳ２１５、ステップＳ２１６、ループＣの２番目の繰り返しの説明を省略する。ループＣは２回だけ繰り返し、ステップＳ２１７に制御が移る。【０３００】
ステップＳ２１７において、まだ割り当てていない命令があるため制御をステップＳ２０４に戻す。【０３０１】
ループＢの３番目の繰り返しの概要を説明する。命令ｃ４について、命令ｃ４を先頭とする最長依存命令列は命令ｃ４〜ｃ１である。命令ｃ１の実行時刻が最も早くなるような、命令ｃ４の割当ては、スレッド番号１、時刻１で、そのときの命令ｃ１の割当ては、スレッド番号１、時刻４である。【０３０２】
ループＢの４番目の繰り返しの概要を説明する。命令ｄ２について、命令ｄ２を先頭とする最長依存命令列は命令ｄ２〜ｃ１である。命令ｃ１の実行時刻が最も早くなるような、命令ｄ２の割当ては、スレッド番号１、時刻１で、そのときの命令ｃ１の割当ては、スレッド番号１、時刻２である。【０３０３】
ループＢの５番目の繰り返しの概要を説明する。命令ｅ２について、命令ｅ２を先頭とする最長依存命令列は命令ｅ２〜ｃ１である。命令ｃ１の実行時刻が最も早くなるような、命令ｅ２の割当ては、スレッド番号１、時刻１で、そのときの命令ｃ１の割当ては、スレッド番号１、時刻２である。【０３０４】
次にステップＳ２１８において、集合ＲＳに属する各命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行時刻が最大のものを選ぶ。ここでは、命令ａ６の最長依存命令列ａ６〜ａ１の命令ａ１の時刻が７で最大である。このため命令ａ６を選び、スレッド番号１、時刻１に割り当てる。図１９にスケジュールの結果を示す。【０３０５】
ステップＳ２１９において、命令ａ６を集合ＲＳから除去する。命令ａ６に依存している命令ａ５は、命令ａ６にだけ依存していたので、集合ＲＳに登録する。【０３０６】
ステップＳ２２０において、まだスケジュールを行っていない命令があるので、制御をＳ２０３に戻す。【０３０７】
以下の説明では、ステップＳ２０３〜Ｓ２２０からなるループを「ループＡ」と呼ぶ。図２０にループＡの実行結果を示す。各行は、ループＡの結果を示す。各列は、集合ＲＳに含まれる各命令についてのループＣの結果を示す。それぞれ、その命令と、その割当て候補のスレッド番号と時刻と、その命令を先頭とする最長依存命令列の末尾の命令と、その予測実行スレッド番号と時刻を示す。下線が引かれているものは、スケジュール対象として選ばれたものである。【０３０８】
ループＡの２番目の繰り返しでは、命令ａ５がスケジュールされる。【０３０９】
ループＡの３番目の繰り返しでは、命令ｂ５がスケジュールされる。ここで、命令ｂ５はスレッド番号１、時刻３にもスケジュールできるが、スレッド番号２、時刻３がループＣで選ばれている。これは、命令ｂ５の最長依存命令列の末尾の命令ａ１の予測実行時刻の差異による。命令ｂ５をスレッド番号１、時刻３にスケジュールした際は、各スレッドの命令の実行開始・終了時刻の制限のため、命令ａ１はスレッド番号３、時刻９に実行されると予測される。図２１にこの様子を示す。隣接プロセッサにデータを送信する場合の遅延が２サイクルであることに注意されたい。【０３１０】
一方、スレッド番号２、時刻３にスケジュールした際は、命令ａ１はスレッド番号２、時刻７に実行されると予測される。図２２にこの様子を示す。【０３１１】
このように、各スレッドの命令の実行開始・終了時刻の制限を考慮することで、命令をスケジュールする場所により最長依存命令列の末尾の命令の予測実行時刻が変化することが解析できる。【０３１２】
以下、ループＡの繰り返しで、命令ａ４、ｂ４、ｃ４、ｃ３、ｃ２、ｄ２、ｅ２、ｃ１、ａ３、ｂ３、ａ２、ａ１の順でスケジュールされる。【０３１３】
最後にステップ２２１において、スケジュール結果を出力して終了する。図２３にスケジュール結果を示す。【０３１４】
以上説明したように、本具体例によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。【０３１５】
第１の理由は、各スレッドの命令の実行開始時刻の制限を考慮できるため、スケジュール可能な時刻が正確に把握できるためである。例えば、ループＡの１番目の繰り返しで、命令ａ６をスレッド番号２にスケジュールすると仮定したとき、各スレッドの命令の実行開始時刻の制限から、スケジュールできる時刻は２以上と分かる。【０３１６】
第２の理由は、ある命令を先頭とする最長依存命令列について、命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるため、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができるためである。例えば、ループＡの９番目の繰り返しで、命令ｄ２をスレッド番号１、時刻４にスケジュールすると仮定したとき、さらに、命令ｄ２を先頭とする最長依存命令列ｄ２、ｃ１について、命令ｃ１が実行されるスレッド番号と時刻を予測する。命令ｃ１は命令ｃ２に依存しており、命令ｃ２はスレッド番号３、時刻７に割り当てられている。このため、命令ｃ１はスレッド番号３、時刻８に実行されると予測する。この様子を図２４に示す。【０３１７】
このように、最長依存命令列のそれぞれの命令について、実行されるスレッド番号と時刻を予測するため、最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる。【０３１８】
第３の理由は、命令の実行終了時刻の制限を考慮できるため、割当て可能なスレッド番号と時刻が正確に把握できるため、最長依存命令列の末尾の命令の実行時刻がより正確に予測できるためである。例えば、ループＡの３番目の繰り返しで、命令ｂ５をスレッド番号１、時刻３にスケジュールすると仮定したとき、命令ｂ４は時刻４、命令ｂ３は時刻５に仮に割り当てられ、命令ａ２は、命令の実行終了時刻の制限のため、スレッド番号２、時刻７に仮に割り当てられ、末尾の命令ａ１は、命令の実行終了時刻の制限のため、スレッド番号３、時刻９に実行されると予測される。この様子を図２５に示す。【０３１９】
命令ｂ５をスレッド番号２、時刻３にスケジュールすると仮定したときは、命令ａ１はスレッド番号２、時刻７に実行されると予測される。この様子を図２６に示す。【０３２０】
このように、命令の実行終了時刻の制限を考慮することで最長依存命令列の末尾の命令の実行時刻がより正確に予測できる。
【実施例２】
【０３２１】
図２７を参照すると、本発明の第２の実施例にかかるプログラム並列化装置１００Ａは、記憶装置３０２の記憶部３２０Ｍから、図示しないプログラム解析装置によって生成された、逐次処理中間プログラム３２０を入力し、記憶装置３０３の記憶部３３０Ｍから、図示しない依存解析装置によって生成された、命令間の依存情報３３０を入力し、記憶装置３０６の記憶部３６０Ｍから、命令の実行開始・終了時刻の制限集合３６０を入力し、各命令の実行時刻と実行プロセッサを決定した並列化中間プログラム３５０を生成し、記憶装置３０５の記憶部３５０Ｍに記録する装置である。【０３２２】
プログラム並列化装置１００Ａは、入力となる逐次処理中間プログラム３２０を記憶する磁気ディスクなどの記憶装置３０２と、入力となる命令間の依存情報３３０を記憶する磁気ディスク等の記憶装置３０３と、入力となる命令の実行開始・終了時刻の制限集合３６０を記憶する磁気ディスク等の記憶装置３０６と、出力となる並列化プログラム３５０を記憶する磁気ディスクなどの記憶装置３０５と、これらの記憶装置３０２、３０３、３０５及び３０６に接続された中央処理装置等の処理装置１０７Ａとで構成されている。また処理装置１０７Ａは、スレッド開始・終了時刻制限スケジュール部１０８Ａを備える。【０３２３】
このようなプログラム並列化装置１００Ａは、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスク等のコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にスレッド開始・終了時刻制限スケジュール部１０８Ａといった機能手段を実現する。【０３２４】
スレッド開始・終了時刻制限スケジュール部１０８Ａは、各スレッドの命令実行開始・終了時刻の制限集合の複数の要素について、命令スケジュールを行い、最も並列実行時間の短い命令スケジュールを決定する。命令スケジュールとはすなわち、各命令の実行スレッド番号と実行時刻を決定することである。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。そして、並列化の結果である並列化中間プログラム３５０を記録する。【０３２５】
スレッド開始・終了時刻制限スケジュール部１０８Ａは、各スレッドの命令実行開始・終了時刻の制限を選択する命令実行開始・終了時刻制限選択部１８０と、各スレッドの命令実行開始時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド開始時刻制限解析部２２０と、各スレッドの命令実行終了時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド終了時刻制限解析部２３０と、すでにスケジュールされた命令によって占有されているスレッド番号と時刻のスロットを解析する占有状況解析部２４０と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部２５０と、スレッド開始時刻制限解析部２２０と、スレッド終了時刻制限解析部２３０と、占有状況解析部２４０と、依存遅延解析部２５０の情報を元に、次にスケジュールを行う命令を選択するスケジュール候補命令選択部１９０と、スケジュール候補命令選択部１９０の決定に基づいて、命令をスロットに割り当てる、すなわち、命令の実行時刻と実行スレッドを決定する命令配置部２００と、スケジュール結果を実現するように命令の実行順序を決定し、フォーク命令を挿入するフォーク挿入部２１０と、スケジュール結果の並列実行時間を測定あるいは予測する並列実行時間測定部２７０と、各スレッドの命令実行開始・終了時刻の制限について、それを変化させて、それぞれのスケジュール結果を比較し、最良のものを選択する最良スケジュール決定部２６０と、を備える。【０３２６】
次に、本実施例にかかるプログラム並列化装置１００Ａの動作について説明する。特に、図２８を参照して、スレッド開始・終了時刻制限スケジュール部１０８Ａで処理される、各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理を説明する。【０３２７】
スレッド開始・終了時刻制限スケジュール部１０８Ａは、記憶装置３０２の記憶部３２０Ｍから逐次処理中間プログラム３２０を入力する。逐次処理中間プログラム３２０は、グラフの形で表現される。逐次処理中間プログラム３２０を構成する関数は、関数を表すノードとして表現され、関数を構成する命令は、命令を表すノードとして表現される。また、ループは再帰関数に変換して、再帰関数として表現してもよい。また、逐次処理中間プログラム３２０においては、命令の実行時刻と実行スレッド番号とを決定する命令スケジュールの対象となる、スケジュール領域が決定されている。スケジュール領域は、例えば、基本ブロックとしてもよいし、複数の基本ブロックとしてもよい。【０３２８】
次に、記憶装置３０３の記憶部３３０Ｍから命令間の依存情報３３０を入力する。依存情報３３０は、レジスタ、メモリの読み書きに伴うデータフローの解析、制御フローの解析により得られる、命令間の依存であり、命令を表すノードを結ぶ有向辺で表す。【０３２９】
次に、記憶装置３０６の記憶部３６０Ｍから各スレッドの命令の実行開始・終了時刻の制限の集合を命令の実行開始・終了時刻の制限集合３６０から入力する。【０３３０】
個々の制限は、例えば、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるようなものでもよい。図８を参照して、具体例を説明する。【０３３１】
図８で、マス目はスレッド番号と、時刻のスロットを表し、色分けされたマス目はそこに命令が配置されていることを表す。同一プロセッサで動作する複数のスレッドを区別するために色を分けている。間隔を１サイクル、命令数を４とするような制限は、図８（ａ）のような命令の配置の制限である。また、間隔を２サイクル、命令数を８とするような制限は、図８（ｂ）のような命令の配置の制限である。また、全てのスレッドに対して開始時刻がスレッド番号とともに一定の増分で増えるが、各スレッドの命令数に制限を加えないような制限を用いてもよい。また、各スレッドの命令数にだけ制限をおいて、各スレッドに対して開始時刻に制限を加えないような制限を用いてもよい。【０３３２】
全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような制限を、〈開始時刻の増分，開始時刻と終了時刻の差〉と表すことにする。プロセッサ数をＮＰＥ、フォーク命令の遅延時間をＬｆｏｒｋとする。制限の集合は、例えば、〈Ｌｆｏｒｋ、Ｌｆｏｒｋ×ＮＰＥ〉、〈Ｌｆｏｒｋ＋１，（Ｌｆｏｒｋ＋１）×ＮＰＥ〉、〈Ｌｆｏｒｋ＋２，（Ｌｆｏｒｋ＋２）×ＮＰＥ〉、…を用いてもよい。また、全てのスレッドに対して開始時刻がスレッド番号とともに一定の増分で増えるが、各スレッドの命令数に制限を加えないような制限をさらに加えたものを用いてもよい。【０３３３】
まず、各スレッドの命令の実行開始・終了時刻の制限の集合から、未選択のものを選び、ＳＨとする（ステップＳ１０１）。【０３３４】
次に、制限ＳＨに従って命令スケジュールを行う。スケジュール結果をＳＣとする（ステップＳ１０２）。このステップについては第１の実施例の図２から図５に示したものと同一である。【０３３５】
次に、スケジュール結果ＳＣの並列実行時間を計測あるいは推定する（ステップＳ１０３）。並列実行時間は、例えば、スレッド番号と時刻の二次元の表に、すでにスケジュールされた命令が割り当てられた位置を記録しておき、これを参照してもよい。また、例えば、シミュレーションによって推定してもよい。また、例えば、スケジュール結果ＳＣを実現するオブジェクトコードを生成し、実行して計測してもよい。【０３３６】
次に、記憶していた最短並列実行時間より短ければスケジュール結果SCを最短スケジュールとして記憶する（ステップＳ１０４）。【０３３７】
次に、全ての制限を選択したか判定する（ステップＳ１０５）。全ての制限を選択していなければ、制御をＳ１０１に戻す。【０３３８】
全ての制限を選択していれば、最短スケジュールを最終的なスケジュールとして出力して終了する（ステップＳ１０６）。【０３３９】
次に、第２の実施例の効果を説明する。【０３４０】
第２の実施例によれば、第１の実施例に比べて、並列実行時間のより短い並列化プログラムを生成することができる。その理由は、各スレッドの命令の実行開始・終了時刻の制限について、複数の制限の中からよりよい制限を選択して、その制限に基づいたスケジュールを得ることができるからである。
【実施例３】
【０３４１】
図２９を参照すると、本発明の第３の実施例にかかるプログラム並列化装置１００Ａは、図示しない逐次コンパイラによって生成された機械語命令形式の逐次処理プログラム１０１を入力し、マルチスレッド型並列プロセッサ向けの並列化プログラム１０３を生成し出力する装置である。【０３４２】
プログラム並列化装置１００Ｂは、入力となる逐次処理プログラム１０１を記憶する磁気ディスクなどの記憶装置１０２と、入力となる命令の実行開始・終了時刻の制限集合３６０を記憶する磁気ディスク等の記憶装置３０６と、出力となる並列化プログラム１０３を記憶する磁気ディスクなどの記憶装置１０４と、逐次処理プログラム１０１を並列化プログラム１０３に変換する過程で使用するプロファイルデータを記憶する磁気ディスク等の記憶装置３０１と、これらの記憶装置１０２、１０４、３０１及び３０６に接続された中央処理装置等の処理装置１０７Ｂとで構成されている。また処理装置１０７Ｂは、制御フロー解析部１１０と、スケジュール領域形成部１４０と、レジスタデータフロー解析部１５０と、命令間メモリデータフロー解析部１７０と、スレッド開始・終了時刻制限スケジュール部１０８Ａと、レジスタ割り当て部２８０と、プログラム出力部２９０とを備える。【０３４３】
このようなプログラム並列化装置１００Ｂは、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスク等のコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上に制御フロー解析部１１０、スケジュール領域形成部１４０、レジスタデータフロー解析部１５０、命令間メモリデータフロー解析部１７０、スレッド開始・終了時刻制限スケジュール部１０８Ａ、レジスタ割り当て部２８０およびプログラム出力部２９０といった機能手段を実現する。【０３４４】
制御フロー解析部１１０は、記憶装置１０２の記憶部１０１Ｍから逐次処理プログラム１０１を入力し、制御フローを解析する。この解析結果を参照して、ループを再帰関数に変換してもよい。この変換によって、ループの各イタレーションを並列化することができる。【０３４５】
スケジュール領域形成部１４０は、制御フロー解析部１１０による制御フローの解析結果および、記憶装置３０１の記憶部３１０Ｍから入力したプロファイルデータ３１０を参照して、命令の実行時刻と実行スレッド番号とを決定する命令スケジュールの対象となるスケジュール領域を決定する。【０３４６】
レジスタデータフロー解析部１５０は、制御フロー解析部１１０による制御フローの解析結果および、スケジュール領域形成部１４０によるスケジュール領域の決定を参照して、レジスタの読み書きに伴うデータフローを解析する。【０３４７】
命令間メモリデータフロー解析部１７０は、制御フロー解析部１１０による制御フローの解析結果および、記憶装置３０１の記憶部３１０Ｍから入力したプロファイルデータ３１０を参照して、あるメモリアドレスに対する読み書きに伴うデータフローを解析する。【０３４８】
スレッド開始・終了時刻制限スケジュール部１０８Ａは、各スレッドの命令の実行開始・終了時刻の制限集合について、その集合の複数の要素について、命令スケジュールを行い、最も並列実行時間の短い命令スケジュールを決定する。命令スケジュールとはすなわち、各命令の実行時刻と実行スレッド番号を決定することである。その際に、レジスタデータフロー解析部１５０によるレジスタのデータフローの解析結果および、命令間メモリデータフロー解析部１７０による命令間のデータフローの解析結果を参照する。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。【０３４９】
レジスタ割り当て部２８０は、スレッド開始・終了時刻制限スケジュール部１０８Ａによって決定された命令の実行順序とフォーク命令を参照して、レジスタ割り当てを行う。【０３５０】
プログラム出力部２９０は、レジスタ割り当て部２８０の結果を参照して、実行可能プログラムを生成して出力する。【０３５１】
スレッド開始・終了時刻制限スケジュール部１０８Ａは、各スレッドの命令の実行開始・終了時刻の制限を選択する命令実行開始・終了時刻制限選択部１８０と、各スレッドの命令実行開始時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド開始時刻制限解析部２２０と、各スレッドの命令実行終了時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド終了時刻制限解析部２３０と、すでにスケジュールされた命令によって占有されているスレッド番号と時刻のスロットを解析する占有状況解析部２４０と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部２５０と、スレッド開始時刻制限解析部２２０と、スレッド終了時刻制限解析部２３０と、占有状況解析部２４０と、依存遅延解析部２５０の情報を元に、次にスケジュールを行う命令を選択するスケジュール候補命令選択部１９０と、スケジュール候補命令選択部１９０の決定に基づいて、命令をスロットに割り当てる、すなわち、命令の実行時刻と実行スレッドを決定する命令配置部２００と、スケジュール結果を実現するように命令の実行順序を決定し、フォーク命令を挿入するフォーク挿入部２１０と、スケジュール結果の並列実行時間を測定あるいは予測する並列実行時間測定部２７０と、各スレッドの命令実行開始・終了時刻の制限について、それを変化させて、それぞれのスケジュール結果を比較し、最良のものを選択する最良スケジュール決定部２６０と、を備える。【０３５２】
次に、本実施例にかかるプログラム並列化装置１００Ｂの動作について説明する。【０３５３】
まず、制御フロー解析部１１０は、記憶装置１０２の記憶部１０１Ｍから逐次処理プログラム１０１を入力し、制御フローを解析する。プログラム並列化装置の内部では、逐次処理プログラム１０１はグラフの形で表現される。逐次プログラム１０１を構成する関数は、関数を表すノードとして表現され、関数を構成する命令は、命令を表すノードとして表現される。【０３５４】
スケジュール領域形成部１４０は、制御フロー解析部１１０による制御フローの解析結果および、記憶装置３０１の記憶部３１０Ｍから入力したプロファイルデータ３１０を参照して、命令の実行時刻と実行スレッドとを決定する命令スケジュールの対象となるスケジュール領域を決定する。スケジュール領域は、例えば、基本ブロックとしてもよいし、複数の基本ブロックとしてもよい。【０３５５】
レジスタデータフロー解析部１５０は、制御フロー解析部１１０による制御フローの解析結果および、スケジュール領域形成部１４０によるスケジュール領域の決定を参照して、レジスタの読み書きに伴うデータフローを解析する。データフローの解析は、例えば、関数内に限定して行ってもよいし、関数間にまたがって行ってもよい。データフローは命令間の依存として、命令を表すノードを結ぶ有向辺で表す。【０３５６】
命令間メモリデータフロー解析部１７０は、制御フロー解析部１１０による制御フローの解析結果および、記憶装置３０１の記憶部３１０Ｍから入力したプロファイルデータ３１０を参照して、あるメモリアドレスに対する読み書きに伴うデータフローを解析する。データフローは命令間の依存として、命令を表すノードを結ぶ有向辺で表す。【０３５７】
スレッド開始・終了時刻制限スケジュール部１０８Ａは、各スレッドの命令の実行開始・終了時刻の制限集合について、その集合の複数の要素について、命令スケジュールを行い、最も並列実行時間の短い命令スケジュールを決定する。命令スケジュールとはすなわち、各命令の実行時刻と実行スレッド番号を決定することである。命令スケジュールの際に、レジスタデータフロー解析部１５０によるレジスタのデータフローの解析結果および、命令間メモリデータフロー解析部１７０による命令間の依存の解析結果を参照する。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。【０３５８】
レジスタ割り当て部２８０は、スレッド開始・終了時刻制限スケジュール部１０８Ａによって決定された命令の実行順序とフォーク命令を参照して、レジスタ割り当てを行う。【０３５９】
プログラム出力部２９０は、レジスタ割り当て部２８０の結果を参照して、実行可能プログラムを生成して出力する。【０３６０】
スレッド開始・終了時刻制限スケジュール部１０８Ａで処理される、各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理は、第２の実施例と同じであるため、説明を省略する。【０３６１】
次に、本実施例の効果を説明する。【０３６２】
本実施例によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。【０３６３】
第１の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図６の例を用いて説明する。図６（ａ）では、スレッド１に多くの命令を割り当てたため、プロセッサ２において命令が実行されないサイクルが生じている。本実施例によれば、図６（ｂ）のように命令数を均等にして割り当てることができ、プロセッサ２における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。【０３６４】
第２の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドの実行開始時刻の間隔を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図７の例を用いて説明する。図７（ａ）では、スレッド２に割り当てられた命令列の開始時刻が遅れているため、プロセッサ１において命令が実行されないサイクルが生じている。本実施例によれば、図７（ｂ）のように命令の実行開始時刻の間隔を整えて割り当てることができ、プロセッサ１における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。【０３６５】
各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃え、かつ、各スレッドの実行開始時刻の間隔を揃えるには、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、並列実行時間を短くできるスケジュールを行う必要がある。命令スケジュールにおいて並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行完了の時刻を予測し、その時刻が最も遅いような先頭の命令を先にスケジュールする必要がある。なぜなら、最も遅く実行が完了する命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、この命令列の実行完了時刻の予測精度をあげる必要がある。このためには、先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握と、命令列の実行時刻の正確な予測が必要である。本実施例は、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、これらを可能にする。結果として、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えて、かつ、各スレッドの実行開始時刻の間隔を揃えることができる。【０３６６】
ここで、ある命令を先頭とする依存グラフ上の命令列について、その先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握ができる理由は、各スレッドの命令の実行開始・終了時刻の制限を考慮して、命令を割当て可能なスレッド番号と時刻を選択できるためである。【０３６７】
また、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる理由は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるためと、各スレッドの命令の実行開始・終了時刻の制限を考慮して、命令列の実行時間を予測できるためである。【０３６８】
［その他の実施例］
以上、本発明の実施の形態及び実施例について説明したが、本発明は以上の実施の形態及び実施例にのみ限定されず、その他各種の付加変更が可能である。例えば、前記各実施例において、プロファイルデータ３１０を省略した構成にすることも可能である。【０３６９】
なお、上述したプログラム並列化装置は、その構成要素となる上述した各部（各手段）の処理（機能）を実現可能なものであれば、その物理的構成、ハードウェア（アナログ回路、デジタル回路等）構成、及びソフトウェア（プログラム）構成については、特に限定されるものではない。例えば、独立して個別の回路やユニット或いはプログラム部品（プログラムモジュール等）を構成したり、１つの回路やユニット内に一体的に構成したりする等、いずれの形態でも提供可能である。これらの形態は、実際に使用する装置の機能や用途等の事情に応じて適宜選択可能である。また、上述した各構成要素の処理（機能）に対応して、これらと同様の処理を行う各ステップを有する動作方法（プログラム並列化方法）も、本発明の範疇に含まれる。【０３７０】
また、上述した各部（各手段）の機能の少なくとも一部をＣＰＵ（Central Processing Unit）又はＭＰＵ（Micro Processing Unit）等のコンピュータによるソフトウェア処理で実現する場合には、コンピュータにより実行されるプログラムも、本発明の範疇に含まれる。このプログラムは、ＣＰＵ等により直接実行可能な形式のプログラムに限らず、ソース形式のプログラムや、圧縮処理されたプログラム、暗号化されたプログラム等、種々形態のプログラムを含む。また、このプログラムは、装置全体の制御を行うＯＳ（Operating System）やファームウェア等の制御プログラムと連携して動作し、或いはその一部に組み込まれて一体的に動作するアプリケーションプログラムやそれを構成するソフトウェア部品（ソフトウェアモジュール）等、いずれの形態でも適用可能である。さらに、このプログラムは、無線又は有線回線を介して外部装置と通信する通信機能を有する装置に実装して使用する場合、例えば回線上に接続されたサーバ等の外部ノードからダウンロードして自装置内の記録媒体にインストールして使用することもできる。これらの形態は、実際に使用する装置の機能や用途等の事情に応じて適宜選択可能である。【０３７１】
また、上記のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体も、本発明の範疇に含まれる。この場合、記録媒体は、ＲＯＭ（Read Only Memory）等のメモリ等、装置内に固定して使用されるものや、利用者により持ち運びが可能な可搬型のもの等、いずれの形態でも適用可能である。【０３７２】
以上、実施の形態及び実施例を参照して本願発明を説明したが、本願発明は上記実施の形態及び実施例に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。【０３７３】
この出願は、２００８年２月１５日に出願された日本出願特願２００８−０３４６１４号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【産業上の利用可能性】
【０３７４】
以上説明したように、本発明は、逐次処理プログラムからマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するプログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラムに利用可能である。
【図１】
2009101976.tif 000003
【図２】
2009101976.tif 000004
【図３】
2009101976.tif 000005
【図４】
2009101976.tif 000006
【図５】
2009101976.tif 000007
【図６】
2009101976.tif 000008
【図７】
2009101976.tif 000009
【図８】
2009101976.tif 000010
【図９】
2009101976.tif 000011
【図１０】
2009101976.tif 000012
【図１１】
2009101976.tif 000013
【図１２】
2009101976.tif 000014
【図１３】
2009101976.tif 000015
【図１４】
2009101976.tif 000016
【図１５】
2009101976.tif 000017
【図１６】
2009101976.tif 000018
【図１７】
2009101976.tif 000019
【図１８】
2009101976.tif 000020
【図１９】
2009101976.tif 000021
【図２０】
2009101976.tif 000022
【図２１】
2009101976.tif 000023
【図２２】
2009101976.tif 000024
【図２３】
2009101976.tif 000025
【図２４】
2009101976.tif 000026
【図２５】
2009101976.tif 000027
【図２６】
2009101976.tif 000028
【図２７】
2009101976.tif 000029
【図２８】
2009101976.tif 000030
【図２９】
2009101976.tif 000031
【図３０】
2009101976.tif 000032
【図３１】
2009101976.tif 000033
【図３２】
2009101976.tif 000034
【図３３】
2009101976.tif 000035
【国際調査報告】
2009101976.tif 000036
2009101976.tif 000037
2009101976.tif 000038
2009101976.tif 000039