(57)【要約】【課題】従来までは、プログラムを並列化することによる高速化の程度を事前に知ることができなかった。【解決手段】並列化が可能であると見込まれる部分を検出し、当該並列化可能部分に対応するダミーのプログラムである部分並列プログラムを生成するための情報である並列プログラム生成情報を用いて、入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、並列プログラム生成情報を用いて、並列化可能部分に対応する部分並列プログラムを生成することにより、部分並列プログラムを有する並列プログラムを、入力プログラムから生成する並列プログラム生成部と、並列プログラムを実行し、実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、実行時間情報を出力する出力部とを備える実行時間算出装置により、プログラムを並列化することによりどの程度の高速化が図れるかを事前に知ることができる。【選択図】図１
2014099108.tif 000002
【特許請求の範囲】
【請求項１】
一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である１以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部と、
入力プログラムを受け付ける受付部と、
前記１以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、
前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成部と、
前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、
前記並列プログラム実行部が取得した実行時間情報を出力する出力部とを備える実行時間算出装置。
【請求項２】
前記並列化可能部分検出部は、
前記１以上の並列プログラム生成情報を用いて、前記入力プログラムから１以上の並列化可能部分を検出する並列化可能部分検出手段と、
前記並列化可能部分において行われる計算の特性である計算特性を、前記並列化可能部分から検出する計算特性取得手段とを備え、
前記並列プログラム生成部は、
前記並列化可能部分を検出した際に用いた並列プログラム生成情報と、前記計算特性取得手段が取得した計算特性とを用いて、前記並列化可能部分に対応する部分並列プログラムを生成することにより、前記並列プログラムを、前記入力プログラムから生成する請求項１記載の実行時間算出装置。
【請求項３】
前記並列プログラム生成情報は、前記入力プログラムを擬似的な命令で表現したものである中間表現から、前記部分並列プログラムを生成するための情報であり、
前記入力プログラムから中間表現を生成するための情報である１以上の中間表現生成情報が格納される中間表現生成情報格納部と、
前記１以上の中間表現生成情報を用いて、前記入力プログラムから前記中間表現を生成する中間表現生成部とをさらに備え、
前記並列プログラム生成部は、
前記１以上の並列プログラム生成情報を用いて、前記中間表現生成部が生成した中間表現における並列化可能部分に対応する部分並列プログラムを生成することにより、前記並列プログラムを、前記入力プログラムから生成する請求項１または請求項２記載の実行時間算出装置。
【請求項４】
前記計算特性取得手段は、
前記中間表現生成部が生成した中間表現から、所定の並列化可能部分を計算特性として取得する請求項３記載の実行時間算出装置。
【請求項５】
前記並列プログラム生成情報は、ループ部分に対応する部分並列プログラムを生成するための情報であり、
前記並列化可能部分検出手段は、
前記並列プログラム生成情報を用いて、前記入力プログラムから１以上のループ部分を検出し、
前記計算特性取得手段は、
前記ループ部分において、ループが実行されるごとに一の値に対して一定数加算または減算する処理の部分、同一配列へのアクセスを行う処理の部分、２以上の値から１つの値を選択する処理の部分のうちのいずれか１以上の処理の部分を計算特性として取得する請求項２から請求項４いずれか一項に記載の実行時間算出装置。
【請求項６】
前記並列化可能部分検出部は、
前記入力プログラムを実行する入力プログラム実行手段をさらに備え、
前記計算特性取得手段は、
前記入力プログラム実行手段による入力プログラムの実行結果から、所定の並列化可能部分の実行結果を計算特性として取得する請求項２から請求項５いずれか一項に記載の実行時間算出装置。
【請求項７】
前記並列プログラム生成情報は、条件分岐部分に対応する部分並列プログラムを生成するための情報であり、
前記並列化可能部分検出手段は、
前記並列化可能部分検出情報を用いて、前記入力プログラムから１以上の条件分岐部分を検出し、
前記計算特性取得手段は、
前記入力プログラム実行手段による入力プログラムの実行結果から、前記条件分岐部分における分岐の結果を計算特性として取得する請求項６記載の実行時間算出装置。
【請求項８】
前記並列プログラム生成情報は、メモリへのアクセスを行うメモリアクセス部分に対応する部分並列プログラムを生成するための情報であり、
前記並列化可能部分検出手段は、
前記並列プログラム生成情報を用いて、前記入力プログラムから１以上のメモリアクセス部分を検出し、
前記計算特性取得手段は、
前記入力プログラム実行手段による入力プログラムの実行結果から、前記メモリアクセス部分においてアクセスしたメモリアドレスを計算特性として取得する請求項６または請求項７記載の実行時間算出装置。
【請求項９】
一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である１以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部と、
受付部と、並列化可能部分検出部と、並列プログラム生成部と、並列プログラム実行部と、出力部とを用いて行われる実行時間算出方法であって、
前記受付部が、
入力プログラムを受け付ける受付ステップと、
前記並列化可能部分検出部が、
前記１以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出ステップと、
前記並列プログラム生成部が、
前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成ステップと、
前記並列プログラム実行部が、
前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行ステップと、
前記出力部が、
前記並列プログラム実行部が取得した実行時間情報を出力する出力ステップとを備える実行時間算出方法。
【請求項１０】
一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である１以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部にアクセス可能なコンピュータを、
入力プログラムを受け付ける受付部と、
前記１以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、
前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成部と、
前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、
前記並列プログラム実行部が取得した実行時間情報を出力する出力部として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行時間を算出する装置等に関するものである。
【背景技術】
【０００２】
今日、ＣＰＵ単体の動作周波数の向上速度が低下し、これに伴い、ＣＰＵ単体の処理能力の向上速度も大きく低下した。半導体ベンダー各社は、代わりに、１つのチップに複数の演算装置（コア）を搭載することにより、処理能力の向上を図るようになった。このようなＣＰＵを、一般的に、マルチコアＣＰＵと呼ぶ。このようなマルチコアＣＰＵの性能を生かすには、各コアで並列に動作するプログラムが必要である。
【０００３】
従来、プログラムを並列化するには、人手で並列化する方法や、コンパイラなどにより自動的に並列化する方法などが採用される。人手で並列化する場合、例えば、ＯｐｅｎＭＰ（非特許文献１参照）や、ＭＰＩ（Ｍｅｓｓａｇｅ  Ｐａｓｓｉｎｇ  Ｉｎｔｅｒｆａｃｅ）（非特許文献２参照）などの技術が用いられる。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】非特許文献１：“OpenMP Application Program Interface”、［online］、OpenMP.org、インターネット［URL；http://www.openmp.org/mp-documents/OpenMP3.1.pdf］
【非特許文献２】非特許文献２：“MPI: A Message-Passing Interface Standard Version 3.0”、［online］、Message Passing Interface Forum、インターネット［URL；http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf］
【発明の概要】
【発明が解決しようとする課題】
【０００５】
プログラムの並列化に際しては、プログラムを並列化することによる高速化の程度を事前に知り、それに応じて、並列化を行うか否かを判断することが好適である。従来においては、プログラムを並列化することによる高速化の程度を、事前に知ることはできた。しかしながら、従来までは、得られた高速化の程度の精度が十分ではなかった。また、高速化の程度を知るには、実際に並列化を行う際の手間と同等の手間を要していた。
【課題を解決するための手段】
【０００６】
本第一の発明の実行時間算出装置は、一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、並列化可能部分から、並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である１以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部と、入力プログラムを受け付ける受付部と、１以上の並列プログラム生成情報を用いて、入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、並列化可能部分に対応する部分並列プログラムを生成することにより、部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、入力プログラムから生成する並列プログラム生成部と、並列プログラム生成部が生成した並列プログラムを実行し、実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、並列プログラム実行部が取得した実行時間情報を出力する出力部とを備える実行時間算出装置である。
【０００７】
このような構成により、並列化の対象となるプログラムと同等の処理を行うダミーの並列プログラムを生成することができる。また、当該並列プログラムを実行することにより、プログラムを並列化することによる高速化の程度を、精度良くまた手間を要することなく知ることができる。
【０００８】
また、本第二の発明の実行時間算出装置は、第一の発明に対して、並列化可能部分検出部は、１以上の並列プログラム生成情報を用いて、入力プログラムから１以上の並列化可能部分を検出する並列化可能部分検出手段と、並列化可能部分において行われる計算の特性である計算特性を、並列化可能部分から検出する計算特性取得手段とを備え、並列プログラム生成部は、並列化可能部分を検出した際に用いた並列プログラム生成情報と、計算特性取得手段が取得した計算特性とを用いて、並列化可能部分に対応する部分並列プログラムを生成することにより、並列プログラムを、入力プログラムから生成する実行時間算出装置である。
【０００９】
このような構成により、並列化の対象となるプログラムと同等の計算特性を持つ並列プログラムを生成することができる。
【００１０】
また、本第三の発明の実行時間算出装置は、第一または第二の発明に対して、並列プログラム生成情報は、入力プログラムを擬似的な命令で表現したものである中間表現から、部分並列プログラムを生成するための情報であり、入力プログラムから中間表現を生成するための情報である１以上の中間表現生成情報が格納される中間表現生成情報格納部と、１以上の中間表現生成情報を用いて、入力プログラムから中間表現を生成する中間表現生成部とをさらに備え、並列プログラム生成部は、１以上の並列プログラム生成情報を用いて、中間表現生成部が生成した中間表現における並列化可能部分に対応する部分並列プログラムを生成することにより、並列プログラムを、入力プログラムから生成する実行時間算出装置である。
【００１１】
このような構成により、並列化の対象となるプログラムと同等の計算特性を持つ並列プログラムを、一度、中間表現に変換してから生成することができる。
【００１２】
また、本第四の発明の実行時間算出装置は、第三の発明に対して、計算特性取得手段は、中間表現生成部が生成した中間表現から、所定の並列化可能部分を計算特性として取得する実行時間算出装置である。
【００１３】
このような構成により、中間表現から計算特性を取得することができる。
【００１４】
また、本第五の発明の実行時間算出装置は、第二から第四いずれか１つの発明に対して、並列プログラム生成情報は、ループ部分に対応する部分並列プログラムを生成するための情報であり、並列化可能部分検出手段は、並列プログラム生成情報を用いて、入力プログラムから１以上のループ部分を検出し、計算特性取得手段は、ループ部分において、ループが実行されるごとに一の値に対して一定数加算または減算する処理の部分、同一配列へのアクセスを行う処理の部分、２以上の値から１つの値を選択する処理の部分のうちのいずれか１以上の処理の部分を計算特性として取得する実行時間算出装置である。
【００１５】
このような構成により、演算の集合に関する計算特性を取得することができる。
【００１６】
また、本第六の発明の実行時間算出装置は、第二から第五いずれか１つの発明に対して、並列化可能部分検出部は、入力プログラムを実行する入力プログラム実行手段をさらに備え、計算特性取得手段は、入力プログラム実行手段による入力プログラムの実行結果から、所定の並列化可能部分の実行結果を計算特性として取得する実行時間算出装置である。
【００１７】
このような構成により、入力プログラムの実行結果から、計算特性を取得することができる。
【００１８】
また、本第七の発明の実行時間算出装置は、第六の発明に対して、並列プログラム生成情報は、条件分岐部分に対応する部分並列プログラムを生成するための情報であり、並列化可能部分検出手段は、並列化可能部分検出情報を用いて、入力プログラムから１以上の条件分岐部分を検出し、計算特性取得手段は、入力プログラム実行手段による入力プログラムの実行結果から、条件分岐部分における分岐の結果を計算特性として取得する実行時間算出装置である。
【００１９】
このような構成により、条件分岐に関する計算特性を取得することができる。
【００２０】
また、本第八の発明の実行時間算出装置は、第六または第七の発明に対して、並列プログラム生成情報は、メモリへのアクセスを行うメモリアクセス部分に対応する部分並列プログラムを生成するための情報であり、並列化可能部分検出手段は、並列プログラム生成情報を用いて、入力プログラムから１以上のメモリアクセス部分を検出し、計算特性取得手段は、入力プログラム実行手段による入力プログラムの実行結果から、メモリアクセス部分においてアクセスしたメモリアドレスを計算特性として取得する実行時間算出装置である。
【００２１】
このような構成により、アクセス先が不定であるメモリアクセスに関する計算特性を取得することができる。
【発明の効果】
【００２２】
本発明による実行時間算出装置等によれば、プログラムを並列化することによる高速化の程度を、精度良くまた手間を要することなく知ることができる。
【図面の簡単な説明】
【００２３】
【図１】実施の形態１における実行時間算出装置１のブロック図
【図２】同インダクションの例を示す図
【図３】同同一配列のアクセスの例を示す図
【図４】同縮約の例を示す図
【図５】同縮約の例を示す図
【図６】同分岐結果を取得するためのプログラムコードの挿入例を示す図
【図７】同アクセスするメモリアドレスを取得するためのプログラムコードの挿入例を示す図
【図８】同グラフ化した中間表現の例を示す図
【図９】同グラフ化した中間表現の例を示す図
【図１０】同実行時間算出装置１の全体動作について説明するフローチャート
【図１１】同中間表現の生成処理について説明するフローチャート
【図１２】同並列化可能部分の検出処理について説明するフローチャート
【図１３】同計算特性の取得処理について説明するフローチャート
【図１４】同中間表現生成情報の例を示す図
【図１５】同並列プログラム生成情報の例を示す図
【図１６】同入力プログラムの例を示す図
【図１７】同アセンブリプログラムの例を示す図
【図１８】同中間表現の例を示す図
【図１９】同中間表現の例を示す図
【図２０】同分岐結果を取得するためのプログラムコードの挿入例を示す図
【図２１】同アクセスするメモリアドレスを取得するためのプログラムコードの挿入例を示す図
【図２２】同並列プログラムの例を示す図
【図２３】同並列プログラムの例を示す図
【図２４】同並列プログラムの例を示す図
【図２５】同中間表現のグラフ化の例を示す図
【図２６】同実行時間算出装置２のブロック図
【図２７】上記実施の形態におけるコンピュータシステムの概観図
【図２８】上記実施の形態におけるコンピュータシステムのブロック図
【発明を実施するための形態】
【００２４】
以下、本発明による実行時間算出装置等の実施形態について図面を参照して説明する。なお、実施の形態において同じ符号を付した構成要素は同様の動作を行うので、再度の説明を省略する場合がある。また、本実施の形態において説明する各情報の形式、内容などは、あくまで例示であり、各情報の持つ意味を示すことができれば、形式、内容などは問わない。
【００２５】
（実施の形態１）
本実施の形態において、並列化の対象となるプログラムの計算特性を引き継いだ並列プログラムを生成し、当該並列プログラムの実行時間を算出する実行時間算出装置１について説明する。
【００２６】
図１は、本実施の形態における実行時間算出装置１のブロック図である。実行時間算出装置１は、並列プログラム生成情報格納部１１、中間表現生成情報格納部１２、受付部１３、中間表現生成部１４、並列化可能部分検出部１５、並列プログラム生成部１６、並列プログラム実行部１７、出力部１８を備える。また、並列化可能部分検出部１５は、並列化可能部分検出手段１５１、入力プログラム実行手段１５２、計算特性取得手段１５３を備える。
【００２７】
並列プログラム生成情報格納部１１には、１以上の並列プログラム生成情報が格納される。並列プログラム生成情報とは、一のプログラムから、並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分に対応する部分並列プログラムを生成するための情報である。
【００２８】
ここで、本実施の形態において、プログラムとは、通常、いわゆるソースコードである。つまり、プログラムとは、いわゆるプログラミング言語で記述されたものである。また、プログラムは、例えば、いわゆるアセンブリコードで記述されたプログラムや、いわゆるスクリプト言語で記述されたプログラムなどであってもよい。また、一のプログラムにおける各行を、以下、適宜、プログラムコード、または、単にコードとする。また、プログラムには、例えば、いわゆる実行プログラムや、いわゆるバイナリ、オブジェクトコードなどを含んでもよい。
【００２９】
「一のプログラム」とは、後述の受付部１３が受け付ける入力プログラムである。また、入力プログラムとは、並列化の対象となるプログラムである。また、入力プログラムは、通常、並列化可能部分を１以上有する。また、入力プログラムは、プログラミング言語による記述が、並列実行されることが考慮されていない記述となっていることが好適である。当該入力プログラムを、以下、適宜、直列プログラムとする。また、入力プログラムは、並列化済みの部分を１以上有していてもよい。
【００３０】
つまり、並列プログラム生成情報は、入力プログラムから並列プログラムを生成するための情報である。並列プログラムとは、並列実行が可能なプログラムである。また、並列プログラムは、通常、１以上の部分並列プログラムを有する。
【００３１】
また、「並列化可能部分」とは、言い換えると、並列化が可能であると考えられる部分や、並列化が可能であると判断できる部分などである。また、「並列化可能部分」は、例えば、並列化が可能であると見込まれる部分を検出するためのパターンに合致する部分であってもよい。また、「並列化可能部分」は、例えば、並列化が可能であると見込まれればよく、実際には並列化が行えない部分であってもよい。「並列化可能部分」は、通常、ループ部分である。また、当該ループ部分には、条件分岐や、同一配列へのアクセス、異なる２以上の変数に対し他の一の変数による演算、与えられる引数や使用する変数が相互に影響のない２以上の関数の呼び出しなどが含まれていることが好適である。また、ループには、通常、コンパイラの最適化処理などによって展開されているものも含む。
【００３２】
また、「部分並列プログラム」とは、少なくとも並列実行が可能なダミーのプログラムである。「並列実行が可能」とは、いわゆる並列計算が可能なコンピュータにおいて、並列的に実行することが可能であることを意味する。また、並列計算が可能なコンピュータとは、例えば、いわゆるマルチコアＣＰＵが搭載されているコンピュータや、いわゆるＧＰＵが搭載されているコンピュータ、いわゆる並列コンピュータと呼ばれるコンピュータなどである。また、「ダミーのプログラム」とは、当該ダミーのプログラムに対応する元のプログラムを、人手により並列化した際の実行時間を取得するためのプログラムである。これは、言い換えると、当該ダミーのプログラムに対応する元のプログラムと同等の計算を行うが、得られる実行結果が異なるプログラムのことである。また、元のプログラムとは、通常、入力プログラムである。また、同等の計算とは、例えば、いわゆる計算量が同等であることや、計算に要するクロック数が同等であること、計算を実現する命令数が同等であること、使用するメモリ容量が同等であることなどである。
【００３３】
また、並列プログラム生成情報は、通常、検出情報と、生成情報との対応表である。検出情報とは、一のプログラムから並列化可能部分を検出するための情報である。また、生成情報とは、当該並列化可能部分から部分並列プログラムを生成するための情報である。
【００３４】
検出情報は、例えば、並列化可能部分を検出するための条件である検出条件や、並列化可能部分を検出する方法に関する情報である検出方法情報などである。また、生成情報は、例えば、生成する部分並列プログラムの内容を示す生成内容情報や、部分並列プログラムの生成方法に関する情報である生成方法情報などである。以下、これらの情報について、順次、説明する。
【００３５】
検出条件は、通常、プログラムコードのパターンである。当該パターンは、例えば、正規表現である。また、パターンは、プログラムコードそのものであってもよい。また、２行以上の範囲を検出する場合、検出条件は、通常、開始位置を検出するためのパターンと、終了位置を検出するためのパターンとを有する。なお、検出条件は、一のプログラムから並列化可能部分を検出することができるものであれば、その内容や形式などは、問わない。また、検出条件の例については、後述する。
【００３６】
また、検出方法情報は、通常、並列化可能部分を検出するアルゴリズムを表現したものである。検出方法情報は、例えば、例えば、並列化可能部分を検出する実行プログラムや、並列化可能部分を検出する手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどである。また、擬似的なプログラムコードとは、アルゴリズムを、自然言語を用いてプログラミング言語のように記述したものである。また、擬似的なプログラムコードの文法は、通常、既存のプログラミング言語の文法に似たものである。
【００３７】
また、検出方法情報が実行プログラムである場合、当該実行プログラムは、通常、検出条件を用いて、並列化可能部分を検出する。つまり、当該実行プログラムは、後述の並列化可能部分検出手段１５１が行う、検出条件を用いた並列化可能部分の検出の方法や手順などと同様の方法や手順などにより、並列化可能部分を検出する。
【００３８】
また、検出方法情報は、例えば、上記の実行プログラムやソースコードなどの識別子であってもよい。当該識別子は、通常、いわゆるファイル名や、いわゆるファイルパスなどである。また、当該識別子で識別される実行プログラムやソースコードなどは、通常、並列プログラム生成情報格納部１１に格納されている。また、当該実行プログラムやソースコードなどは、例えば、所定の記憶領域または所定の記憶領域に格納されていてもよい。
【００３９】
また、生成内容情報は、例えば、プログラムコードや、プログラムコードのパターンなどである。当該パターンは、例えば、プログラムコードのテンプレートや、ひな形などである。テンプレートや、ひな形などは、通常、一部を書き換えることでプログラムコードとなるものである。なお、生成内容情報は、並列化可能部分に対応する部分並列プログラムの内容を示すことができるものであれば、その内容や形式などは、問わない。
【００４０】
また、生成方法情報は、通常、部分並列プログラムを生成するアルゴリズムを表現したものである。生成方法情報は、例えば、並列化可能部分に対応する部分並列プログラムを生成する実行プログラムや、当該部分並列プログラムを生成する手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどである。
【００４１】
また、並列プログラム生成情報は、例えば、一のプログラムから並列化可能部分を検出し、当該並列化可能部分に対応する部分並列プログラムを生成するプログラムや、当該検出と生成の手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどであってもよい。
【００４２】
また、並列プログラム生成情報は、例えば、中間表現から部分並列プログラムを生成するための情報であってもよい。中間表現とは、入力プログラムを擬似的な命令で表現したものである。また、擬似的な命令とは、通常、入力プログラムにより表現されるアルゴリズムを、命令形式で表現したものである。また、当該擬似的な命令の内容や形式などは、問わない。また、当該擬似的な命令を、以下、中間表現命令とする。また、中間表現は、入力プログラムを擬似的に表現したものであれば、その内容や形式などは、問わない。また、中間表現は、入力プログラムからの並列プログラムの生成を容易にするためのものでもある。なお、並列プログラム生成情報が、中間表現から部分並列プログラムを生成するための情報である場合における検出情報や、生成情報は、上記と同様であるので、説明を省略する。また、中間表現は、通常、無閉路有向グラフとみなせることが好適である。この場合、無閉路有向グラフの各ノードは、通常、中間表現命令により示される。
【００４３】
また、並列プログラム生成情報は、例えば、並列化可能部分から取得する計算特性を示す取得計算特性情報を有していてもよい。計算特性とは、入力プログラムが行う計算の特性である。また、計算特性とは、例えば、所定の処理が行われる部分や、当該処理における処理結果などである。また、計算特性は、例えば、１以上の演算の集合に関する演算特性や、条件分岐部分における分岐の結果である分岐特性、メモリアクセス部分においてアクセスしたメモリアドレスであるメモリアクセス特性などである。
【００４４】
演算特性とは、入力プログラムが、自身への入力に対してどのような処理を行い、どこに出力するのかを示すものである。演算特性は、例えば、インダクションや、同一配列へのアクセス、縮約、四則演算などの単純な演算などの処理である。また、分岐特性は、条件分岐部分において、ｔｈｅｎ側、ｅｌｓｅ側のどちらに分岐したかを示すものである。また、メモリアクセス特性は、例えば、配列のインデックス値であってもよい。
【００４５】
インダクションとは、例えば、図２に示す様な処理である。当該処理は、一の値に対して、ループが実行されるごとに一定数加算するまたは一定数減算する処理である。当該一の値とは、図２においては、キャリー値のことである。また、キャリー値は、一のループ部分において、一のループにおいて算出され、かつ、次のループにおいて使用する値のことである。また、一の値は、通常、変数である。
【００４６】
また、同一配列へのアクセスとは、例えば、図３におけるメモリ読出しと、メモリ書込みの様に、配列にアクセスする際のインデックス値が、固定のインデックス値と、インダクションと、定数値との乗算や加算などの演算により算出される配列へのアクセス処理のことである。当該インデックス値は、メモリアドレスでもよい。
【００４７】
また、縮約とは、２以上の値から１つの値を選択する処理のことである。具体的に、縮約は、例えば、図４に示す様な、他の値との加算、他の値との減算、他の値との乗算、他の値との除算を行っている処理のことである。また、縮約は、例えば、図５に示す様な、他の値と比較し大きい値または小さい値を選択する演算のみを行っている処理のことである。
【００４８】
また、取得計算特性情報は、通常、検出情報に対応付いている。また、取得計算特性情報は、例えば、演算特性を取得することを示す「演算特性」や、分岐特性を取得することを示す「分岐特性」、メモリアクセス特性を取得することを示す「メモリアクセス特性」などである。
【００４９】
中間表現生成情報格納部１２には、１以上の中間表現生成情報が格納される。中間表現生成情報とは、入力プログラムから中間表現を生成するための情報である。中間表現生成情報は、通常、検出情報と、生成情報との対応表である。検出情報とは、入力プログラムからプログラムコードを検出するための情報である。また、生成情報とは、検出情報により検出したプログラムコードに対応する中間表現を生成するための情報である。また、当該検出情報は、上記の並列プログラム生成情報が有する検出情報の内容や形式などと同様である。また、当該生成情報は、プログラムコードではなく中間表現命令を生成するためのものであること以外は、上記の並列プログラム生成情報が有する生成情報の内容や形式などと同様である。
【００５０】
また、中間表現生成情報は、例えば、入力プログラムから中間表現を生成するプログラムや、当該生成の手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどであってもよい。
【００５１】
受付部１３は、入力プログラムを受け付ける。また、受付部１３は、入力プログラムであるファイルの識別子を受け付けてもよい。当該ファイルの識別子とは、通常、ファイル名である。また、この場合、当該ファイルは、通常、所定の記憶領域に格納されている。また、この場合、受付部１３は、通常、受け付けたファイル名で識別されるファイルを、所定の記憶領域から取得する。
【００５２】
また、受け付けとは、光ディスクや、磁気ディスク、半導体メモリなどの記録媒体からの情報の取得や、これらの記録媒体から読み出された情報の受け付け、有線もしくは無線の通信回線を介して送信された情報の受信などを含む概念である。
【００５３】
また、受付部１３における情報や指示などの入力手段は、メニュー画面によるものや、キーボードなど、何でもよい。受付部１３は、メニュー画面の制御ソフトウェアや、キーボード等の入力手段のデバイスドライバーなどで実現され得る。
【００５４】
中間表現生成部１４は、入力プログラムから中間表現を生成する。「生成する」とは、通常、結果として取得することであり、広く解する。また、「生成する」とは、例えば、入力プログラムとは別に、中間表現を作成することであってもよい。また、「生成する」とは、入力プログラム中のプログラムコードを置換などし、中間表現に書き換えることであってもよい。また、以下において、「変換する」とは、「生成する」と同義である。また、中間表現生成部１４は、通常、１以上の中間表現生成情報を用いて、一の入力プログラムから一の中間表現を生成する。
【００５５】
例えば、中間表現生成情報が、検出情報と、生成情報との対応表である場合、中間表現生成部１４は、通常、当該検出情報を用いて、入力プログラムから１以上のプログラムコードを検出する。そして、中間表現生成部１４は、生成情報に従い、当該検出したプログラムコードを中間表現命令に書き換える。「書き換える」とは、出力することであってもよい。
【００５６】
また、例えば、中間表現生成情報が、入力プログラムから中間表現を生成する実行プログラムである場合、中間表現生成部１４は、通常、当該実行プログラムを実行する。また、例えば、中間表現生成情報が、入力プログラムから中間表現を生成する手順を示すフローチャートである場合、中間表現生成部１４は、通常、当該フローチャートの各ステップで示される処理に従い、入力プログラムから中間表現を生成する。
【００５７】
また、例えば、入力プログラムが、いわゆるプログラミング言語で記述されたものである場合、中間表現生成部１４は、中間表現生成情報を用いて、当該入力プログラムから中間表現を生成する。また、この場合、中間表現生成部１４は、例えば、入力プログラムをコンパイルし、アセンブリコードを取得する。そして、中間表現生成部１４は、中間表現生成情報を用いて、当該アセンブリコードから中間表現を生成してもよい。これは、入力プログラムがアセンブリコードで記述されている場合も同様である。
【００５８】
また、中間表現生成部１４は、例えば、入力プログラムのすべてから中間表現を生成してもよい。また、中間表現生成部１４は、例えば、入力プログラムのうち、後述の並列化可能部分検出部１５が検出した並列化可能部分から中間表現を生成してもよい。前者の場合、中間表現生成部１４は、通常、一の入力プログラムに対応する一の中間表現を生成する。また、後者の場合、中間表現生成部１４は、通常、並列化可能部分検出部１５が検出した並列化可能部分と同数の中間表現を生成する。
【００５９】
なお、中間表現生成部１４が中間表現を生成する場合、入力プログラムは、通常、プログラミング言語で記述されたものであることが好適である。また、中間表現生成部１４は、通常、当該プログラミング言語で記述された入力プログラムからアセンブリコードを取得し、当該アセンブリコードから中間表現を生成することが好適である。また、当該入力プログラムからアセンブリコードを取得する場合、中間表現生成部１４は、通常、当該入力プログラムをコンパイルする。
【００６０】
並列化可能部分検出部１５は、１以上の並列プログラム生成情報を用いて、入力プログラムにおける並列化可能部分を検出する。これは、つまり、入力プログラムから並列化可能部分を検出することである。また、並列化可能部分検出部１５は、例えば、検出した並列化可能部分から、計算特性を取得する。なお、並列化可能部分検出部１５は、通常、後述の各手段により、並列化可能部分の検出や、当該並列化可能部分からの計算特性の取得を行う。
【００６１】
並列化可能部分検出手段１５１は、並列プログラム生成情報が有する検出情報を用いて、受付部１３が受け付けた入力プログラムから１以上の並列化可能部分を検出する。「検出する」とは、取得することであってもよい。例えば、検出情報が検出条件である場合、並列化可能部分検出手段１５１は、通常、入力プログラムの各行について、当該各行のプログラムコードが、当該検出条件に合致するか否かを判断する。そして、並列化可能部分検出手段１５１は、当該検出条件に合致する１以上のプログラムコードを、並列化可能部分として検出する。また、例えば、検出情報が検出方法情報である場合、並列化可能部分検出手段１５１は、当該検出方法情報に従い、並列化可能部分を検出する。
【００６２】
例えば、検出情報が、ループ部分を検出するための検出条件である場合、並列化可能部分検出手段１５１は、当該検出条件に従い、入力プログラムが有する１以上のループ部分を検出する。この場合、並列化可能部分検出手段１５１は、通常、入力プログラム（ソースコード）から、アセンブリプログラムを取得する。そして、並列化可能部分検出手段１５１は、当該取得したアセンブリプログラムから制御フローグラフ（Ｃｏｎｔｒｏｌ  Ｆｌｏｗ  Ｇｒａｐｈ：以下、適宜、ＣＦＧ）を作成し、当該制御フローグラフから、ループ部分を検出する。なお、アセンブリプログラムからのＣＦＧの作成の方法や手順などは、公知であるので、詳細な説明を省略する。
【００６３】
ここで、制御フローグラフとは、プログラムを実行したときに通る可能性のある命令の全経路をグラフで表したものである。制御フローグラフは、通常、有向グラフである。また、制御フローグラフは、アセンブリプログラムを構成する各命令をノードとする２以上のノードを有するものであってもよい。
【００６４】
また、並列化可能部分検出手段１５１は、ＣＦＧからのループ部分の検出を、例えば、次の様にして行う。まず、並列化可能部分検出手段１５１は、ＣＦＧからループの起点となるノードを検出する。当該ノードが示す命令は、通常、予め決められている。そして、並列化可能部分検出手段１５１は、当該起点となるノードから順に、接続されているノードをたどっていく。そして、当該たどった結果、起点となるノードに戻ってきた場合、並列化可能部分検出手段１５１は、当該起点となるノードから出発し起点となるノードに戻ってくるまでのパスを、ループ部分として検出する。
【００６５】
また、制御フローグラフからループ部分を検出する場合の検出条件は、例えば、「ループ」や、「ループ部分」、「ＬＯＯＰ」などである。また、入力プログラム（ソースコード）からループ部分を検出する場合の検出条件は、例えば、「ループ」や、「ｆｏｒ文」や、「ｗｈｉｌｅ文」、「ｄｏ−ｗｈｉｌｅ文」、「ｆｏｒ（．．．）｛．．．｝」、「ｗｈｉｌｅ（．．．）｛．．．｝」、「ｄｏ｛．．．｝ｗｈｉｌｅ（．．．）」などである。「．．．」は、ｆｏｒ文において指定する初期値や、ｗｈｉｌｅ文において指定する継続条件式、任意のプログラムコードなどを意味する。
【００６６】
また、例えば、検出情報が、条件分岐部分を検出するための検出条件である場合、並列化可能部分検出手段１５１は、当該検出条件に従い、入力プログラムが有する１以上の条件分岐部分を検出する。また、並列化可能部分検出手段１５１は、例えば、ＣＦＧから１以上の条件分岐部分を検出してもよい。入力プログラムから条件分岐部分を検出する場合、並列化可能部分検出手段１５１は、例えば、ｉｆ文やｓｗｉｔｃｈ文などの制御構文の部分を、条件分岐部分として検出する。また、ＣＦＧから条件分岐部分を検出する場合、並列化可能部分検出手段１５１は、例えば、一のノードから２以上のノードに分岐し、当該分岐した２以上のノードからのパスが、他の一のノードに合流する部分を、条件分岐部分として検出する。
【００６７】
また、入力プログラムから条件分岐部分を検出する場合の検出条件は、例えば、「条件分岐」や、「ｉｆ文」、「ｓｗｉｔｃｈ文」、「ｉｆ（．．．）｛．．．｝」、「ｓｗｉｔｃｈ（．．．）｛．．．｝などである。「．．．」は、ｉｆ文において指定する条件式や、任意のプログラムコードなどを意味する。また、ＣＦＧから条件分岐部分を検出する場合の検出条件は、例えば、「条件分岐」や、「分岐」、「ｂｒａｎｃｈ」などである。
【００６８】
また、例えば、検出情報が、メモリアクセス部分を検出するための検出条件である場合、並列化可能部分検出手段１５１は、当該検出条件に従い、入力プログラムが有する１以上のメモリアクセス部分を検出する。この場合の検出条件は、例えば、「メモリアクセス」や、「配列へのアクセス」、「メモリに割りつけられた変数へのアクセス」、「配列への代入」、「＄配列名［．．．］＝」、「＝＄配列名［．．．］」、「＄変数名＝」、「＝＄変数名」などである。また、「．．．」は、配列のインデックス値や、インデックス値を示す変数などを意味する。
【００６９】
また、例えば、検出情報が、アクセス先が不定なメモリアクセスを検出するための検出条件である場合、並列化可能部分検出手段１５１は、入力プログラムが有する１以上のメモリアクセス部分のうち、実行時までアクセス先が不定であるメモリアクセス部分を検出する。この場合の検出条件は、例えば、「アクセス先不定メモリアクセス」や、「アクセス先不定配列へのアクセス」、「アクセス先不定配列への代入」などである。
【００７０】
また、並列化可能部分検出手段１５１は、実行時までアクセス先が不定であるか否かの判断に、例えば、上記の中間表現を用いてもよい。この場合、並列化可能部分検出手段１５１は、まず、中間表現から、１以上のメモリアクセス部分を検出する。そして、並列化可能部分検出手段１５１は、当該検出した１以上のメモリアクセス部分においてアクセスするメモリアドレスについて、当該メモリアクセスが所属するループよりも外側に所属している値、同じループに所属するインダクション値、これらの値同士から算出した値のいずれかであるか否かを判断する。ここで、「メモリアクセスが所属するループ」とは、当該メモリアクセスが行われているループや、当該メモリアクセスを含むループなどである。また、「ループに所属するインダクション値」とは、当該ループにおいて算出されるインダクション値や、当該ループが含むインダクション値などである。そして、並列化可能部分検出手段１５１は、これらの値のいずれでもない場合に、当該メモリアクセスについて、実行時までアクセス先が不定であるメモリアクセスであると判断する。
【００７１】
また、例えば、検出情報が、並列化可能部分を検出する実行プログラムである場合、並列化可能部分検出手段１５１は、当該実行プログラムを実行する。当該実行プログラムは、検出方法情報である。また、当該実行プログラムは、例えば、ループ部分を検出する場合は、通常、上記のループ部分を検出するための検出条件を用いて、ループ部分を検出する。また、当該実行プログラムは、例えば、条件分岐部分を検出する場合は、通常、上記の条件分岐部分を検出するための検出条件を用いて、条件分岐部分を検出する。また、当該実行プログラムは、例えば、メモリアクセス部分を検出する場合は、通常、上記のメモリアクセス部分を検出するための検出条件を用いて、メモリアクセス部分を検出する。
【００７２】
また、例えば、検出情報が並列化可能部分を検出する手順を示すフローチャートである場合、並列化可能部分検出手段１５１は、当該フローチャートの各ステップで示される処理に従い、入力プログラムから並列化可能部分を検出する。例えば、フローチャートのあるステップにおける処理が「ｆｏｒ文のブロックを検出する」である場合、並列化可能部分検出手段１５１は、入力プログラムから、ｆｏｒ文のブロック（ｆｏｒ文の開始から終了まで）に該当する部分を検出する。
【００７３】
また、例えば、検出情報が並列化可能な部分を検出する手順を示す擬似的なプログラムコードである場合、並列化可能部分検出手段１５１は、当該プログラムコードを解釈し、当該解釈に従い、入力プログラムから並列化可能部分を検出する。例えば、擬似的なプログラムコードが「ｅｘｔｒａｃｔ  ｌｏｏｐ（ｆｏｒ）」であるとする。当該擬似的なプログラムコードは、ｆｏｒ文で構成されるループを検出すること、を意味する。この場合、並列化可能部分検出手段１５１は、入力プログラムから、ｆｏｒ文のブロックに該当する部分を検出する。
【００７４】
また、並列化可能部分検出手段１５１は、並列化可能部分の検出により、当該並列化可能部分や、入力プログラムにおける当該並列化可能部分の位置などを取得する。並列化可能部分の位置を取得する場合、並列化可能部分検出手段１５１は、通常、１以上の行番号や、範囲を示す２つの行番号の１以上のセットを取得する。
【００７５】
また、入力プログラムから並列化可能部分検出条件に合致する並列化可能部分を検出する具体的な方法や手順などは、公知であるので、詳細な説明を省略する。例えば、入力プログラム中の制御構造部分を検出したり、所定の条件に合致するプログラムコードを検出したりするものには、例えば、いわゆるプログラミング用のエディタや、コンパイラなどがある。
【００７６】
入力プログラム実行手段１５２は、入力プログラムを実行する。入力プログラムを実行する方法や手順などは、公知であるので、詳細な説明を省略する。そして、入力プログラム実行手段１５２は、入力プログラムの実行結果を取得する。当該入力プログラムは、通常、計算特性取得手段１５３により、条件分岐部分における分岐の結果を取得するためのプログラムコードや、メモリアクセス部分におけるアクセスしたメモリアドレスを取得するためのプログラムコードなどが挿入されたプログラムである。また、実行結果とは、入力プログラムが出力する情報である。また、実行結果の出力先は、問わない。実行結果の出力先は、例えば、標準出力や、ファイル、メモリなどである。また、入力プログラム実行手段１５２は、例えば、プログラムを実行することができるコンピュータに入力プログラムを送信し、当該コンピュータから、入力プログラムが出力する情報を取得してもよい。
【００７７】
計算特性取得手段１５３は、入力プログラムから計算特性を取得する。計算特性取得手段１５３は、通常、入力プログラムにおける並列化可能部分から計算特性を取得する。また、計算特性取得手段１５３は、通常、各並列化可能部分に対応した所定の計算特性を取得する。計算特性取得手段１５３は、例えば、並列化可能部分検出手段１５１が並列化可能部分を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報に従い、計算特性を取得する。
【００７８】
例えば、取得計算特性情報が演算特性を取得することを示す「演算特性」である場合、計算特性取得手段１５３は、並列化可能部分から演算特性を取得する。また、例えば、取得計算特性情報が分岐特性を取得することを示す「分岐特性」である場合、計算特性取得手段１５３は、並列化可能部分から分岐特性を取得する。また、例えば、取得計算特性情報がメモリアクセス特性を取得することを示す「メモリアクセス特性」である場合、計算特性取得手段１５３は、並列化可能部分からメモリアクセス特性を取得する。
【００７９】
また、計算特性取得手段１５３は、例えば、入力プログラムや、入力プログラムから生成した中間表現、入力プログラムを実行した結果である実行結果などから、計算特性を取得する。
【００８０】
演算特性を取得する場合、計算特性取得手段１５３は、入力プログラムから、演算特性を取得する。具体的に、計算特性取得手段１５３は、並列化可能部分検出手段１５１が検出した並列化可能部分に対応する中間表現から、演算特性を取得する。当該並列化可能部分は、通常、ループ部分である。また、計算特性取得手段１５３は、通常、１種類以上の演算特性を取得する。
【００８１】
また、並列化可能部分に対応する中間表現は、例えば、中間表現生成部１４が、並列化可能部分検出手段１５１が検出した並列化可能部分から生成した中間表現である。また、並列化可能部分に対応する中間表現は、例えば、中間表現生成部１４が入力プログラムから生成した中間表現のうち、並列化可能部分検出手段１５１が検出した並列化可能部分に対応する箇所であってもよい。当該並列化可能部分に対応する箇所は、通常、計算特性取得手段１５３が検出する。
【００８２】
また、入力プログラムから生成した中間表現から、並列化可能部分に対応する箇所を検出する場合、計算特性取得手段１５３は、通常、中間表現から並列プログラムを生成するための並列プログラム生成情報を用いる。
【００８３】
また、中間表現から演算特性を取得することとは、通常、演算特性であるインダクションや、同一配列へのアクセスなどの処理を、中間表現から検出することである。また、中間表現から演算特性を取得することは、例えば、当該処理において算出される値を取得することであってもよい。また、中間表現から演算特性を取得することは、例えば、当該処理と、当該処理において算出される値とを置換することであってもよい。
【００８４】
また、演算特性である処理と、当該処理において算出される値とを置換することとは、中間表現における演算特性を、並列プログラムに引き継がれるように書き換えることである。当該書き換えは、中間表現を簡略化することである。
【００８５】
例えば、中間表現からインダクションを検出した場合、計算特性取得手段１５３は、当該インダクションにおいて算出される値と、当該インダクションとを置換する。また、例えば、中間表現から縮約を検出した場合、計算特性取得手段１５３は、当該縮約において算出される値と、当該縮約とを置換する。当該置換の例は、例えば、図８から図９への変換である。図８、および図９は、中間表現で示される各処理を、グラフ化したものである。また、図９における「インダクション値」は、図８におけるインダクションにおいて算出される値であり、図８のインダクションを当該値で置換している。また、図９における「縮約値」は、図９における縮約において算出される値であり、図９の縮約を当該値で置換している。
【００８６】
以上より、計算特性取得手段１５３は、入力プログラムを解析し、演算特性を導出するために必要な情報を中間表現の形で取得する。そして、計算特性取得手段１５３は、上記の様な処理により中間表現を書き換え、当該書き換えた中間表現を演算特性として取得する。
【００８７】
また、分岐特性を取得する場合、計算特性取得手段１５３は、入力プログラム実行手段１５２による入力プログラムの実行結果から、条件分岐部分における分岐の結果である分岐特性を取得する。計算特性取得手段１５３は、通常、入力プログラムに、条件分岐部分における分岐の結果を取得するためのプログラムコードを挿入する。そして、計算特性取得手段１５３は、当該プログラムコードが挿入された入力プログラムを、入力プログラム実行手段１５２が実行することにより、分岐の結果を取得する。例えば、入力プログラムが図６に示すフローチャートの様な処理の場合、計算特性取得手段１５３は、当該分岐の結果を取得するためのプログラムコードを、「分岐結果記録プログラム追加箇所」に挿入する。
【００８８】
例えば、分岐の結果を取得するためのプログラムコードが、「分岐結果：＄分岐結果」の書式にて、分岐の結果を出力するとする。「＄分岐結果」は、分岐の結果を示す変数である。この場合、計算特性取得手段１５３は、入力プログラムの実行結果から、「分岐結果：」を手掛かりに、「分岐結果：＄分岐結果」における「＄分岐結果」部分の文字列を取得する。また、例えば、分岐の結果を取得するためのプログラムコードが、その他の書式にて分岐の結果を出力する場合、計算特性取得手段１５３は、当該書式に従い、入力プログラムの実行結果から、分岐特性を取得する。
【００８９】
なお、分岐特性を取得するために挿入するプログラムコードや、当該プログラムコードにより取得される分岐特性は、条件分岐部分における分岐の結果を示すものであれば、その内容や形式などは、問わない。
【００９０】
また、メモリアクセス特性を取得する場合、計算特性取得手段１５３は、入力プログラム実行手段１５２による入力プログラムの実行結果から、メモリアクセス部分においてアクセスしたメモリアドレスであるメモリアクセス特性を取得する。計算特性取得手段１５３は、通常、分岐特性の取得と同様に、入力プログラムに、メモリアクセス部分においてアクセスするメモリアドレスを取得するためのプログラムコードを挿入する。そして、計算特性取得手段１５３は、当該プログラムコードが挿入された入力プログラムを、入力プログラム実行手段１５２が実行することにより、メモリアドレスを取得する。例えば、入力プログラムが図７に示すフローチャートの様な処理の場合、計算特性取得手段１５３は、当該メモリアドレスを取得するためのプログラムコードを、「ランダムアクセスアドレス記録収集プログラム追加箇所」に挿入する。
【００９１】
例えば、メモリアドレスを取得するためのプログラムコードが、「メモリアドレス：＄メモリアドレス」の書式にて、メモリアドレスを出力するとする。「＄メモリアドレス」は、メモリアドレスを示す変数である。この場合、計算特性取得手段１５３は、入力プログラムの実行結果から、「メモリアドレス：」を手掛かりに、「メモリアドレス：＄メモリアドレス」における「＄メモリアドレス」部分の文字列を取得する。また、例えば、メモリアドレスを取得するためのプログラムコードが、その他の書式にてメモリアドレスを出力する場合、計算特性取得手段１５３は、当該書式に従い、入力プログラムの実行結果から、メモリアクセス特性を取得する。
【００９２】
なお、分岐特性を取得するために挿入するプログラムコードや、当該プログラムコードにより取得される分岐特性は、条件分岐部分における分岐の結果を示すものであれば、その内容や形式などは、問わない。
【００９３】
並列プログラム生成部１６は、入力プログラムから並列プログラムを生成する。この場合、並列プログラム生成部１６は、通常、並列化可能部分検出部１５が並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該検出した並列化可能部分に対応する部分並列プログラムを生成する。そして、並列プログラム生成部１６は、例えば、入力プログラムにおける並列化可能部分と、生成した部分並列プログラムとを置換し、並列プログラムを生成する。
【００９４】
また、並列プログラム生成部１６は、中間表現から並列プログラムを生成してもよい。この場合、並列プログラム生成部１６は、通常、並列プログラム生成情報を用いて、中間表現から並列プログラムを生成する。また、この場合、並列プログラム生成部１６は、例えば、中間表現のうち、並列化可能部分検出部１５が検出した並列化可能部分に対応する中間表現から部分並列プログラムを生成してもよい。そして、並列プログラム生成部１６は、例えば、入力プログラムにおける並列化可能部分と、生成した部分並列プログラムとを置換し、並列プログラムを生成する。
【００９５】
また、並列プログラム生成部１６は、通常、並列プログラム生成情報と、計算特性取得手段１５３が取得した計算特性とを用いて、当該検出した並列化可能部分に対応する部分並列プログラムを生成する。
【００９６】
例えば、並列プログラム生成情報が、並列化可能部分を検出するための検出情報と、生成するプログラムコードの内容を示す生成内容情報である場合、並列化可能部分検出部１５は、入力プログラムから１以上の並列化可能部分を検出する。従って、並列プログラム生成部１６は、並列化可能部分検出部１５が検出した１以上の各並列化可能部分を、当該生成内容情報に従い、並列プログラムが有するプログラムコードに書き換える。
【００９７】
また、例えば、並列プログラム生成情報が、中間表現命令を検出するための検出情報と、生成するプログラムコードの内容を示す生成内容情報との対応表である場合、中間表現生成部１４は、入力プログラムから中間表現を生成する。従って、並列プログラム生成部１６は、中間表現生成部１４が生成した中間表現が有する１以上の各中間表現命令を、当該生成内容情報に従い、並列プログラムが有するプログラムコードに書き換える。
【００９８】
また、例えば、並列プログラム生成情報が、中間表現または入力プログラムから並列プログラムを生成する実行プログラムである場合、並列プログラム生成部１６は、通常、当該実行プログラムを実行する。また、例えば、並列プログラム生成情報が、中間表現または入力プログラムから並列プログラムを生成する手順を示すフローチャートである場合、並列プログラム生成部１６は、通常、当該フローチャートの各ステップで示される処理に従い、中間表現または入力プログラムから並列プログラムを生成する。
【００９９】
また、並列プログラム生成部１６は、並列プログラムを生成する過程において、必要に応じて、計算特性取得手段１５３が取得した計算特性に応じて、並列プログラムが有するプログラムコードを生成する。
【０１００】
例えば、生成内容情報が、分岐特性を代入することを示す変数を有する場合、並列プログラム生成部１６は、計算特性取得手段１５３が取得した分岐特性と、当該変数とを置換する。そして、並列プログラム生成部１６は、当該置換された生成内容情報に従い、並列プログラムを生成する。
【０１０１】
また、例えば、生成内容情報が、条件分岐部分において分岐したブロックのプログラムコードを出力することを示す場合、並列プログラム生成部１６は、計算特性取得手段１５３が取得した分岐特性が示す分岐の結果に応じて、当該条件分岐部分におけるｔｈｅｎ側、ｅｌｓｅ側のいずれかのブロックに対応するプログラムコードを生成する。
【０１０２】
また、例えば、生成内容情報が、メモリアクセス特性を代入することを示す変数を有する場合、並列プログラム生成部１６は、計算特性取得手段１５３が取得したメモリアクセス特性と、当該変数とを置換する。そして、並列プログラム生成部１６は、当該置換された生成内容情報に従い、並列プログラムを生成する。
【０１０３】
なお、並列化可能部分検出部１５が行う処理と、並列プログラム生成部１６が行う処理との関係は、次のとおりである。例えば、並列プログラム生成情報が、検出情報と、生成情報との対応表であるとする。すると、並列化可能部分検出部１５は、当該検出情報を用いて、入力プログラムから並列化可能部分を検出する。そして、並列化可能部分検出部１５が検出情報を用いて並列化可能部分を検出した場合、並列プログラム生成部１６は、当該並列化可能部分に対応する部分並列プログラムを、生成情報を用いて生成する。
【０１０４】
また、上記において、並列プログラム生成情報が、取得計算特性情報を有している場合、並列化可能部分検出部１５（計算特性取得手段１５３）は、検出した並列化可能部分から、当該取得計算特性情報が示す計算特性を取得する。そして、並列プログラム生成部１６は、並列化可能部分検出部１５が検出した並列化可能部分に対応する並列プログラムを、当該生成情報と、当該計算特性とを用いて生成する。
【０１０５】
並列プログラム実行部１７は、並列プログラム生成部１６が生成した並列プログラムを実行する。当該実行は、通常、並列実行である。また、並列プログラムを実行する方法や手順などは、公知であるので、説明を省略する。そして、並列プログラム実行部１７は、並列プログラムの実行に要した時間に関する情報である実行時間情報を取得する。実行に要した時間とは、つまりは、実行時間のことである。また、実行時間は、実行速度としてもよい。
【０１０６】
また、実行時間情報とは、通常、実行に要した時間（秒）を示す情報である。また、実行時間情報は、例えば、入力プログラムを並列化したことにより得られた実行時間の短縮率や、その割合、また、実行速度の向上率や、その割合などを示す情報であってもよい。実行時間を示す場合、実行時間情報は、例えば、「１０μｓｅｃ」や、「０．１秒」などである。また、実行時間の短縮率や、実行速度の向上率などを示す場合、実行時間情報は、例えば、「２０％短縮」や、「５０％向上」、「１．５倍」などである。また、実行時間情報を取得する方法や手順などは、公知であるので、詳細な説明を省略する。
【０１０７】
出力部１８は、並列プログラム実行部１７が取得した実行時間情報を出力する。出力とは、ディスプレイへの表示、プロジェクターを用いた投影、プリンタでの印字、音出力、外部の装置への送信、記録媒体への蓄積、他の処理装置や他のプログラムなどへの処理結果の引渡しなどを含む概念である。なお、送信や蓄積、処理結果の引渡しについては、出力対象が最終的にユーザに提示されるものとする。
【０１０８】
また、出力部１８は、ディスプレイやスピーカーなどの出力デバイスを含むと考えてもよいし、含まないと考えてもよい。出力部１８は、出力デバイスのドライバーソフトまたは、出力デバイスのドライバーソフトと出力デバイスなどで実現され得る。
【０１０９】
なお、並列プログラム生成情報格納部１１、中間表現生成情報格納部１２は、不揮発性の記録媒体が好適であるが、揮発性の記録媒体でも実現可能である。また、並列プログラム生成情報格納部１１などに所定の情報が記憶される過程は、問わない。例えば、当該所定の情報は、記録媒体や、通信回線、入力デバイスなどを介して並列プログラム生成情報格納部１１などに記憶されてもよい。
【０１１０】
また、中間表現生成部１４、並列化可能部分検出部１５、並列化可能部分検出手段１５１、入力プログラム実行手段１５２、計算特性取得手段１５３、並列プログラム生成部１６、並列プログラム実行部１７は、通常、ＭＰＵやメモリ等から実現され得る。また、中間表現生成部１４などの処理手順は、通常、ソフトウェアで実現され、当該ソフトウェアはＲＯＭ等の記録媒体に記録されている。なお、中間表現生成部１４などは、ハードウェア（専用回路）で実現されてもよい。
【０１１１】
次に、実行時間算出装置１の全体動作について、フローチャートを用いて説明する。なお、所定の情報におけるｉ番目の情報は、「情報［ｉ］」と記載するものとする。図１０は、実行時間算出装置１の全体動作を示すフローチャートである。なお、図１０のフローチャートにおいて、並列プログラム生成情報は、取得計算特性情報を有するものとする。
【０１１２】
（ステップＳ１００１）中間表現生成部１４は、受付部１３が入力プログラムを受け付けたか否かを判断する。受け付けた場合は、ステップＳ１００２に進み、そうでない場合は、ステップＳ１００１に戻る。
【０１１３】
（ステップＳ１００２）中間表現生成部１４は、ステップＳ１００１で受け付けた入力プログラムから、中間表現を生成する。この処理の詳細は、図１１のフローチャートを用いて説明する。
【０１１４】
（ステップＳ１００３）並列化可能部分検出手段１５１は、並列プログラム生成情報格納部１１に格納されている１以上の並列プログラム生成情報を用いて、ステップＳ１００１で受け付けた入力プログラムから、１以上の並列化可能部分を検出する。この処理の詳細は、図１２のフローチャートを用いて説明する。また、この処理の結果、並列化可能部分検出手段１５１は、ｍ個の並列化可能部分を検出したものとする。
【０１１５】
（ステップＳ１００４）並列プログラム生成部１６は、カウンタｉに１をセットする。
【０１１６】
（ステップＳ１００５）計算特性取得手段１５３は、並列化可能部分［ｉ］から、計算特性を取得する。この処理の詳細は、図１３のフローチャートを用いて説明する。
【０１１７】
（ステップＳ１００６）並列プログラム生成部１６は、並列化可能部分［ｉ］を検出した際に用いた並列プログラム生成情報と、ステップＳ１００５で取得した計算特性とを用いて、並列化可能部分［ｉ］に対応する部分並列プログラムを生成する。
【０１１８】
（ステップＳ１００７）並列プログラム生成部１６は、入力プログラムにおける並列化可能部分［ｉ］と、ステップＳ１００６で生成した部分並列プログラムとを置換する。なお、このとき、並列プログラム生成部１６は、例えば、入力プログラムを複製する。そして、並列プログラム生成部１６は、当該複製した入力プログラムに対し、順次、置換を行う。
【０１１９】
（ステップＳ１００８）並列プログラム生成部１６は、ｉがｍであるか否かを判断する。ｍである場合は、ステップＳ１０１０に進み、そうでない場合は、ステップＳ１００９に進む。
【０１２０】
（ステップＳ１００９）並列プログラム生成部１６は、ｉを１インクリメントし、ステップＳ１００５に戻る。
【０１２１】
（ステップＳ１０１０）並列プログラム実行部１７は、ステップＳ１００７での置換により生成された並列プログラムを実行し、実行時間関連情報を取得する。
【０１２２】
（ステップＳ１０１１）出力部１８は、ステップＳ１０１０で取得した実行時間関連情報を取得する。そして、ステップＳ１００１に戻る。
【０１２３】
なお、図１０のフローチャートにおいて、電源オフや処理終了の割り込みにより処理を終了してもよい。
【０１２４】
また、図１０のフローチャートにおいて、ステップＳ１００２の処理は行わなくてもよい。この場合、ステップＳ１００５の処理において、計算特性取得手段１５３は、中間表現からではなく、入力プログラムから計算特性を取得する。
【０１２５】
図１１は、図１０のフローチャートのステップＳ１００２の中間表現の生成処理を示すフローチャートである。なお、図１１のフローチャートにおいて、中間表現生成情報格納部１２には、ｎ個の中間表現生成情報が格納されているものとする。また、当該中間表現生成情報は、検出条件と、生成内容情報との対応表であるものとする。
【０１２６】
（ステップＳ１１０１）中間表現生成部１４は、受付部１３が受け付けた入力プログラムからアセンブリコードを取得する。ここで、中間表現生成部１４は、ｍ行のアセンブリコードが取得できたものとする。
【０１２７】
（ステップＳ１１０２）中間表現生成部１４は、カウンタｉに１をセットする。
【０１２８】
（ステップＳ１１０３）中間表現生成部１４は、カウンタｊに１をセットする。
【０１２９】
（ステップＳ１１０４）中間表現生成部１４は、アセンブリコードのｉ行目が、中間表現生成情報［ｊ］が有する検出条件に合致するか否かを判断する。合致する場合は、ステップＳ１１０５に進み、そうでない場合は、ステップＳ１１０６に進む。
【０１３０】
（ステップＳ１１０５）中間表現生成部１４は、中間表現生成情報［ｊ］が有する生成内容情報に従い、中間表現命令を生成する。ここで、中間表現生成部１４は、例えば、生成した中間表現をファイルに出力する場合、当該生成した中間表現命令を、ファイルに書き出す。そして、ステップＳ１１０８に進む。
【０１３１】
（ステップＳ１１０６）中間表現生成部１４は、ｊがｎであるか否かを判断する。ｎである場合は、ステップＳ１１０８に進み、そうでない場合は、ステップＳ１１０７に進む。
【０１３２】
（ステップＳ１１０７）中間表現生成部１４は、ｊを１インクリメントし、ステップＳ１１０４に戻る。
【０１３３】
（ステップＳ１１０８）中間表現生成部１４は、ｉがｍであるか否かを判断する。ｍである場合は、上位処理にリターンし、そうでない場合は、ステップＳ１１０９に進む。
【０１３４】
（ステップＳ１１０９）中間表現生成部１４は、ｉを１インクリメントし、ステップＳ１１０３に戻る。
【０１３５】
なお、図１１のフローチャートにおいて、中間表現生成部１４は、例えば、所定の単位ごとに、アセンブリコードから中間表現命令を生成してもよい。この場合の所定の単位とは、例えば、２以上の行である。
【０１３６】
図１２は、図１０のフローチャートのステップＳ１００３の並列化可能部分の検出処理を示すフローチャートである。なお、図１２のフローチャートにおいて、並列プログラム生成情報格納部１１には、ｍ個の並列プログラム生成情報が格納されているものとする。また、当該並列プログラム生成情報は、検出条件を有するものとする。
【０１３７】
（ステップＳ１２０１）並列化可能部分検出手段１５１は、変数ｃに０をセットする。
【０１３８】
（ステップＳ１２０２）並列化可能部分検出手段１５１は、カウンタｉに１をセットする。
【０１３９】
（ステップＳ１２０３）並列化可能部分検出手段１５１は、並列プログラム生成情報［ｉ］が有する検出条件に合致する部分が、入力プログラム中に存在するか否かを判断する。存在する場合は、ステップＳ１２０４に進み、そうでない場合は、ステップＳ１２０６に進む。
【０１４０】
（ステップＳ１２０４）並列化可能部分検出手段１５１は、ｃを１インクリメントする。
【０１４１】
（ステップＳ１２０５）並列化可能部分検出手段１５１は、検出した並列化可能部分を格納するための配列である並列化可能部分［ｃ］に、検出条件［ｉ］に合致する入力プログラムの行番号をセットする。このとき、例えば、検出条件に合致する入力プログラム中のプログラムコードが１行のみであった場合、並列化可能部分検出手段１５１は、当該１行の行番号をセットする。また、例えば、検出条件に合致する入力プログラム中のプログラムコードが２行以上であった場合、並列化可能部分検出手段１５１は、例えば、当該２行以上の各行番号をセットしてもよいし、当該２行以上の開始の行番号と、終了の行番号との２つの行番号をセットしてもよい。
【０１４２】
（ステップＳ１２０６）並列化可能部分検出手段１５１は、ｉがｍであるか否かを判断する。ｍである場合は、上位処理にリターンし、そうでない場合は、ステップＳ１２０７に進む。
【０１４３】
（ステップＳ１２０７）並列化可能部分検出手段１５１は、ｉを１インクリメントし、ステップＳ１２０３に戻る。
【０１４４】
図１３は、図１０のフローチャートのステップＳ１００５の計算特性の取得処理を示すフローチャートである。
【０１４５】
（ステップＳ１３０１）計算特性取得手段１５３は、並列化可能部分［ｉ］が演算特性を取得する部分であるか否かを判断する。当該判断は、例えば、並列化可能部分［ｉ］を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報が、演算特性を取得することを示すか否かを判断することにより行う。そして、演算特性を取得する部分である場合は、ステップＳ１３０２に進み、そうでない場合は、ステップＳ１３０４に進む。
【０１４６】
（ステップＳ１３０２）計算特性取得手段１５３は、ステップＳ１００２で生成した中間表現のうち、並列化可能部分［ｉ］に対応する部分から演算特性を取得する。
【０１４７】
（ステップＳ１３０３）計算特性取得手段１５３は、取得した演算特性を、当該演算特性において算出される値で置換する。そして、上位処理にリターンする。
【０１４８】
（ステップＳ１３０４）計算特性取得手段１５３は、並列化可能部分［ｉ］が分岐特性を取得する部分であるか否かを判断する。当該判断は、例えば、並列化可能部分［ｉ］を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報が、分岐特性を取得することを示すか否かを判断することにより行う。そして、分岐特性を取得する部分である場合は、ステップＳ１３０５に進み、そうでない場合は、ステップＳ１３０８に進む。
【０１４９】
（ステップＳ１３０５）計算特性取得手段１５３は、入力プログラムにおける並列化可能部分［ｉ］に対応する部分に、分岐特性取得用のプログラムコードを挿入する。このとき、計算特性取得手段１５３は、例えば、分岐特性を取得するたびに、入力プログラムを複製する。そして、計算特性取得手段１５３は、当該複製した入力プログラムに対し、プログラムコードを挿入する。
【０１５０】
（ステップＳ１３０６）入力プログラム実行手段１５２は、ステップＳ１３０５でプログラムコードが挿入された入力プログラムを実行する。
【０１５１】
（ステップＳ１３０７）計算特性取得手段１５３は、ステップＳ１３０６で入力プログラムを実行した結果から、分岐特性を取得する。そして、上位処理にリターンする。
【０１５２】
（ステップＳ１３０８）計算特性取得手段１５３は、計算特性取得手段１５３は、並列化可能部分［ｉ］がメモリアクセス特性を取得する部分であるか否かを判断する。当該判断は、例えば、並列化可能部分［ｉ］を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報が、メモリアクセス特性を取得することを示すか否かを判断することにより行う。そして、メモリアクセス特性を取得する部分である場合は、ステップＳ１３０９に進み、そうでない場合は、上位処理にリターンする。
【０１５３】
（ステップＳ１３０９）計算特性取得手段１５３は、入力プログラムにおける並列化可能部分［ｉ］に対応する部分に、メモリアクセス特性取得用のプログラムコードを挿入する。このとき、計算特性取得手段１５３は、例えば、メモリアクセス特性を取得するたびに、入力プログラムを複製する。そして、計算特性取得手段１５３は、当該複製した入力プログラムに対し、プログラムコードを挿入する。
【０１５４】
（ステップＳ１３１０）入力プログラム実行手段１５２は、ステップＳ１３０９でプログラムコードが挿入された入力プログラムを実行する。
【０１５５】
（ステップＳ１３１１）計算特性取得手段１５３は、ステップＳ１３１０で入力プログラムを実行した結果から、メモリアクセス特性を取得する。そして、上位処理にリターンする。
【０１５６】
（具体例）
次に、実行時間算出装置１の動作の具体例について説明する。なお、本具体例において、中間表現生成部１４は、図１４に示す中間表現生成情報を保持しているものとする。当該中間表現生成情報は、レコードを一意に特定するためのＩＤ（項目名：ＩＤ）と、アセンブリ命令（項目名：ｘ８６命令）と、中間表現命令（項目名：中間表現命令）とを有する。また、並列プログラム生成部１６は、図１５に示す並列プログラム生成情報を保持しているものとする。当該並列プログラム生成情報は、レコードを一意に特定するためのＩＤ（項目名：ＩＤ）と、中間表現命令（項目名：中間表現命令）と、プログラムコード（項目名：プログラムコード）とを有する。
【０１５７】
また、以下の各例における中間表現命令の意味は、以下のとおりである。
・ｃｏｍａｓｓｏｃ：プログラム中の演算を、多項式の形式で表現したもの
・ｓｔｏｒｅ：メモリアクセスのうち、書込みを行うもの
・ｌｏａｄ：メモリアクセスのうち，読み出しを行うもの
・ｃｏｎｄ：どの分岐履歴を参照すればよいかを示すもの
・ｉｎｓｎ：プログラム中の演算を、命令形式で表現したもの
・ｉｎｄｕｃｔｉｖｅ：ループが回るごとに一定値増加、あるいは減少する変数を示すもの
・ｃｏｎｓｔａｎｔ：定数を示すもの
・ｃａｒｒｙ：あるループ実行回に算出した値を次のループ実行回に使用するもの
・ｒｅｄｕｃｔｉｏｎ：入力配列からより、小さな配列を算出する処理（縮約）を示すもの
・ｐｈｉ：関連する複数のｃｏｎｄによって、複数の値から１つを選択するもの
・ｓｅｌｅｃｔ：関連する１つのｃｏｎｄによって、複数の値から１つを選択するもの
【０１５８】
（例１）
本例において、入力プログラムからの中間表現の生成の例について説明する。なお、本例において、入力プログラムは、図１６に示すプログラムであるものとする。また、当該入力プログラムに対応するアセンブリプログラムは、図１７に示すプログラムであるものとする。また、図１７の各命令は、いわゆるｘ８６命令と呼ばれている命令である。また、図１６や、図１７における左端の数字は、便宜上の行番号であり、入力プログラムや、アセンブリプログラムなどに含まれるものではない。
【０１５９】
まず、中間表現生成部１４は、入力プログラムから、並列化可能部分であるループ部分を検出する。具体的に、中間表現生成部１４は、図１７のｘ８６命令列から制御フローグラフを作成する。そして、中間表現生成部１４は、当該制御フローグラフから、ループ部分を検出する。図１７において、３７行目にアドレスが小さくなる方向へのジャンプ命令があるので、このジャンプ先からこのジャンプ命令の範囲がループになることがわかる。これ以外のジャンプ命令は、すべてアドレスが大きくなる方向へのジャンプなので、プログラムに含まれるループはこの１つだけである。また、６行目のｊｍｐ命令以外にこのループに入る手段がないので、このループの開始位置は１０行目のｃｍｐｌ命令であることがわかる。
【０１６０】
次に、中間表現生成部１４は、図１７の各命令から中間表現の要素を生成する。中間表現生成部１４は、図１７において、ループの開始位置から順に、図１４の中間表現生成情報を用いて中間表現の要素を生成する。このとき、中間表現生成部１４は、通常、生成した中間表現の要素に、「ｉｎｓｎ０」、「ｉｎｓｎ１」、「ｉｎｓｎ２」、・・・の様に、通し番号を付与する。
【０１６１】
まず、図１７の１０行目の命令「ｃｍｐｌ」が、図１４の中間表現生成情報の項目「ｘ８６命令」に含まれているとする。すると、中間表現生成部１４は、図１７の１０行目のｘ８６命令「ｃｍｐｌ」から、ｉｎｓｎ０を生成する。なお、以降、中間表現生成部１４は、図１７から検出したループ部分において、各行が有するｘ８６命令が、図１４の中間表現生成情報の項目「ｘ８６命令」に含まれているか否かを判断する。そして、含まれている場合に、中間表現生成部１４は、当該ｘ８６命令に対応する「ｉｎｓｎ＃」（＃は通し番号）を生成する。
【０１６２】
図１７の１０行目のｘ８６命令のオペランドは、定数「＄０ｘ２７１０」とメモリ上の値「−０ｘ８（％ｅｂｐ）」である。そして、ｘ８６命令をたどると、メモリの値は、５行目の命令を初期値とし、９行目の命令によってループが回るたびに更新されるものであることがわかる。ここで、５行目の命令は定数０をメモリ格納するので、定数「０」として扱うことができる。また、９行目の命令は、そのオペランドをたどると、８行目の命令の結果をそのままメモリに格納するだけであることがわかる。そこで、中間表現生成部１４は、定数はそのまま中間表現のｃｏｎｓｔａｎｔ（定数）とする。また、中間表現生成部１４は、メモリ上の値については、初期値０で、毎回８行目のｘ８６命令によって更新されるｃａｒｒｙ０とし、比較を行う中間表現命令ｃｍｐ３２（ｉｎｓｎ０）を生成する。ｃａｒｒｙ０を更新する値については、後ほど８行目のｘ８６命令を変換した際に定める。
【０１６３】
次に、中間表現生成部１４は、１３行目のｘ８６命令から、ｉｎｓｎ１を生成する。このｘ８６命令では、メモリ上の値をレジスタの値に加算している。従って、中間表現生成部１４は、加算を行う中間表現命令ａｄｄ３２を生成する。また、中間表現生成部１４は、加算数はメモリ上の値で、該当するアドレスに対する書込みは解析対象の命令列中では更新されていないので、定数ｃｏｎｓｔａｎｔ３とする。被加算数は、１０行目のｘ８６命令の際と同じｃａｒｒｙ０である。
【０１６４】
次に、中間表現生成部１４は、１４行目のｘ８６命令から、ｌｏａｄ０とｉｎｓｎ２を生成する。このｘ８６命令は、８ｂｉｔ符号付き整数を、３２ｂｉｔに拡張するものである。また、１４行目のｘ８６命令のオペランドは、レジスタに格納された値と、アドレスのメモリ上の値である。このレジスタには、１３行目のｘ８６命令の結果が格納されており、１３行目のｘ８６命令はｉｎｓｎ１に変換されている。従って、中間表現生成部１４は、まずｉｎｓｎ１からのメモリ読み出しを表す中間表現ｌｏａｄ０を生成し、これを符号拡張する中間表現命令ｓｘ３２＿８を生成する。
【０１６５】
次に、中間表現生成部１４は、１５行目のｘ８６命令から、ｉｎｓｎ３を生成する。このｘ８６命令は、１４行目のｘ８６命令の結果からＣＰＵ内部のフラグを設定するものである。また、１４行目のｘ８６命令からはｉｎｓｎ２が生成されている。従って、中間表現生成部１４は、ｉｎｓｎ２から、ＣＰＵ内部のフラグを再現するための中間表現命令ｉｎｓｎ３を生成する。
【０１６６】
次に、中間表現生成部１４は、１８行目のｘ８６命令から、ｉｎｓｎ４を生成する。このｘ８６命令は、メモリ上の値とレジスタ値の加算を行っている。その内容は、１３行目のｘ８６命令と同じである。
【０１６７】
次に、中間表現生成部１４は、２４行目のｘ８６命令から、ｉｎｓｎ５を生成する。このｘ８６命令も、メモリ上の値とレジスタ値の加算を行っており、内容も１３行目のｘ８６命令と同じである。
【０１６８】
次に、中間表現生成部１４は、１９行目のｘ８６命令から、ｉｎｓｎ６を生成する。このｘ８６命令は１４行目のｘ８６命令と同様に、８ｂｉｔ符号付き整数を、３２ｂｉｔに拡張するものなので、中間表現も同様のものを生成する。
【０１６９】
次に、中間表現生成部１４は、２０行目のｘ８６命令から、ｉｎｓｎ７を生成する。このｘ８６命令は、レジスタ値を符号付き整数とみなし、符号反転する命令である。レジスタには１９行目の命令の結果が格納されており、このｘ８６命令には中間表現命令ｉｎｓｎ６が対応しているので、中間表現生成部１４は、符号反転を行う中間表現命令ｎｅｇ３２を生成し、そのオペランドはｉｎｓｎ６とする。
【０１７０】
次に、中間表現生成部１４は、２５行目のｘ８６命令から、ｉｎｓｎ８を生成する。このｘ８６命令は１４行目のｘ８６命令と同様に、８ｂｉｔ符号付き整数を、３２ｂｉｔに拡張するものなので、中間表現も同様のものを生成する。
【０１７１】
次に、中間表現生成部１４は、２８行目のｘ８６命令から、ｉｎｓｎ９を生成する。このｘ８６命令は、レジスタに格納された値を定数「２」だけ右シフトするものである。そこで、中間表現生成部１４は、右シフトを行う中間表現命令ｓｈｒ３２を生成する。レジスタの値は、この命令が実行される前に通ったパスによって、２０行目のｘ８６命令か、２５行目のｘ８６命令のどちらかの結果が格納されている。そして、これら２つのｘ８６命令は、それぞれｉｎｓｎ７とｉｎｓｎ８が対応している。そこで、中間表現生成部１４は、ｉｎｓｎ７とｉｎｓｎ８のどちらかを選択するｐｈｉ０を生成して、ｉｎｓｎ９のオペランドとする。選択される条件は、ｉｎｓｎ７とｉｎｓｎ８について、それぞれ１６行目のｘ８６命令ｊｎｌ＝ｊｇｅでの分岐が発生しなかったか否かである。また、このｘ８６命令が用いるフラグはｉｎｓｎ３に対応する１５行目のｘ８６命令である。そこで、中間表現生成部１４は、ｐｈｉ０の選択条件として、ｉｎｓｎ３に基づくｊｎｌ命令による分岐が発生しなかったこと（ｎｏｔ＿ｔａｋｅｎ）を表す中間表現ｃｏｎｄ３と、発生したこと（ｔａｋｅｎ）を表す中間表現ｃｏｎｄ４を用いる。
【０１７２】
次に、中間表現生成部１４は、３２行目のｘ８６命令から、メモリ読み出しを表す中間表現ｌｏａｄ３を生成する。また、中間表現生成部１４は、ｌｏａｄ３のアドレスを計算するための、いくつかの中間表現命令も生成する。このｘ８６命令は、レジスタ値に定数「４」を掛けたものに別のレジスタ値を加算したアドレスに格納された値を、レジスタに書き込むものである。ｘ８６命令列をたどると、乗算の対象となるレジスタには、２８行目のｘ８６命令の結果が、加算だけ行うレジスタには定数（ｘ８６命令列の外部でメモリに格納された値）が格納されていることがわかる。そこで、中間表現生成部１４は、まず２８行目のｘ８６命令に対応するｉｎｓｎ９と、定数との乗算を行う中間表現命令ｍｕｌ３２＿３２（ｉｎｓｎ１０）を生成する。そして、中間表現生成部１４は、さらにこの値と定数ｃｏｎｓｔａｎｔ４を加算する中間表現命令ａｄｄ３２（ｉｎｓｎ１１）を生成する。最後に、中間表現生成部１４は、このｉｎｓｎ１１のアドレスからのメモリ読み出しを表す中間表現ｌｏａｄ３を生成する。
【０１７３】
次に、中間表現生成部１４は、３３行目のｘ８６命令から、ｉｎｓｎ１４を生成する。このｘ８６命令は、レジスタの値に１を加えるものである。レジスタには、３２行目のｘ８６命令の結果が格納されているので、中間表現生成部１４は、中間表現ｌｏａｄ３と定数１をオペランドとして持つ中間表現命令ａｄｄ３２（ｉｎｓｎ１４）を生成する。
【０１７４】
次に、中間表現生成部１４は、３６行目のｘ８６命令から、メモリ書込みを表す中間表現ｓｔｏｒｅ０を生成する。また、中間表現生成部１４は、ｓｔｏｒｅ０のアドレスを計算するための、いくつかの中間表現命令も生成する。このｘ８６命令は、３２行目のｘ８６命令とは逆に、レジスタの値をメモリに書き込むものである。ｘ８６命令列をたどると、書き込む値は３３行目のｘ８６命令の結果、アドレスは３２行目のｘ８６命令で用いたアドレスと同じものであることがわかる。そこで、中間表現生成部１４は、３２行目のｘ８６命令の際と同じ２つの中間表現命令（ｉｎｓｎ１２、ｉｎｓｎ１３）を生成し、このｉｎｓｎ１３をアドレスとして、３３行目のｘ８６命令と対応するｉｎｓｎ１４の値を書きこむ中間表現ｓｔｏｒｅ０を生成する。
【０１７５】
次に、中間表現生成部１４は、８行目のｘ８６命令から、ｉｎｓｎ１５を生成する。このｘ８６命令は、レジスタの値に１を加えるものである。ｘ８６命令列をたどると、このレジスタにはｃａｒｒｙ０が格納されていることが判明する。そこで、ｃａｒｒｙ０と定数１をオペランドとして持ち、加算を行う中間表現命令ａｄｄ３２（ｉｎｓｎ１５）を生成する。また、ｃａｒｒｙ０は８行目のｘ８６命令によって更新されることが判明しているので、ｃａｒｒｙ０のバックエッジとして、ｉｎｓｎ１５を設定する。バックエッジとは、一のループ部分において、一のループにおいて算出される値のことである。
【０１７６】
以上の様な処理により、中間表現生成部１４は、図１８に示す中間表現を生成する。
【０１７７】
（例２）
本例において、図１８の中間表現から図１９の中間表現への書き換えの例について説明する。当該書き換えは、通常、中間表現の最適化である。また、本例では、当該最適化を大きく次の手順で行う例を取り上げる。なお、以下の処理は、通常、計算特性取得手段１５３が行う。
（１）ｃｏｍａｓｓｏｃの生成・簡略化
（２）ｃａｒｒｙ展開
（３）ｉｎｄｕｃｔｉｖｅの検出
（４）共通配列の検出
（５）特殊命令の変換
（６）条件分岐の簡略化
（７）共通部分式除去
（８）縮約検出
【０１７８】
ｃｏｍａｓｓｏｃは、中間表現の複数要素の加減算を表すものである。ｃｏｍａｓｓｏｃの生成では、計算特性取得手段１５３は、中間表現命令（ｉｎｓｎ）を調べ、加算や減算については、加算項と減算項からなるｃｏｍａｓｓｏｃにまとめることで、これ以降の最適化処理で加減算を取り扱いやすくする。例えば、図１８の中間表現のｉｎｓｎ１は、「ａｄｄ３２  ｃｏｎｓｔａｎｔ３  ｃａｒｒｙ０」という形をしているので、計算特性取得手段１５３は、これを「ｃｏｎｓｔａｎｔ３  ＋  ｃａｒｒｙ０」という形のｃｏｍａｓｓｏｃに変換する。また、計算特性取得手段１５３は、ｃｏｍａｓｓｏｃに複数の定数が含まれている場合はまとめて１つの定数に変換し、入れ子になっている場合は展開して１つのｃｏｍａｓｓｏｃに置き換える。さらに、この手順で項１つからのみなるｃｏｍａｓｓｏｃが生成された場合、計算特性取得手段１５３は、該当するｃｏｍａｓｓｏｃを削除し、そのｃｏｍａｓｓｏｃの唯一の項と置き換える。
【０１７９】
ｃｏｍａｓｓｏｃの生成・簡略化を終えると、ｃａｒｒｙのバックエッジとして１つの定数を持つものが生じることがある。これらのｃａｒｒｙ値は今後の最適化の妨げとなることがあるため、ｃａｒｒｙ展開の最適化では、計算特性取得手段１５３は、このようなｃａｒｒｙをバックエッジの定数に置き換える。
【０１８０】
ｉｎｄｕｃｔｉｖｅの検出では、計算特性取得手段１５３は、ｃａｒｒｙのバックエッジをたどり、ループ内で加減乗算のみが行われているｃａｒｒｙをすべて求める。これらのｃａｒｒｙは、ループを実行する前に、各ループ実行回で取る値が判明するため、ループごとの増分が定められたｉｎｄｕｃｔｉｖｅという値に置き換える。図１８の中間表現では、ｃａｒｒｙ０のバックエッジをたどると、ループ内では定数１の加算のみが行われていることがわかるので、計算特性取得手段１５３は、ｃａｒｒｙ０をｉｎｄｕｃｔｉｖｅに置き換える。なお、当該ｉｎｄｕｃｔｉｖｅの検出とは、インダクションの検出のことである。
【０１８１】
共通配列の検出では、すべてのメモリアクセス（ｌｏａｄ／ｓｔｏｒｅ）のアドレスを調べ、大きな差がなければ同一配列へアクセスするものであるとみなす。これにより、入力プログラムで同一配列へのアクセスしている箇所を、並列プログラムでも同一配列へのアクセスを行うよう変換できるようになる。ここで、アドレスのｃｏｍａｓｓｏｃである場合、そのｃｏｍａｓｓｏｃに含まれる値のうち即値定数を除いたものが一致した場合、大きな差がないとし、それ以外を大きな差があるとする。アドレスがｃｏｍａｓｓｏｃでない場合、計算特性取得手段１５３は、その値１つだけを持つｃｏｍａｓｓｏｃを作り、同様の比較を行う。
【０１８２】
特殊命令の変換では、計算特性取得手段１５３は、ｘ８６特有の命令について、一般的な形に変換する。「ｘ８６特有の命令」とは、ｘ８６アーキテクチャにおいて特有のアセンブリ命令のことである。「ｘ８６特有の命令」は、例えば、ＦＹＬ２Ｘや、ＦＳＣＡＬＥ、ＦＬＤＺ、ＦＬＤ１などである。また、「ｘ８６特有の命令」は、通常、予め決められている。また、「一般的な形」とは、並列プログラムにおいて容易に表現できる形である。また、「一般的な形」は、通常、予め決められている。ｘ８６特有の命令は、これ以降の最適化で扱うことが困難であるため、本手順が必要となる。例えば、計算特性取得手段１５３は、ｘ８６には浮動小数点スタックに１．０をプッシュする命令に対応する中間表現命令を、即値定数１に置き換える。
【０１８３】
条件分岐の簡略化では、１つの条件だけで表現可能なｐｈｉを、ｓｅｌｅｃｔに置き換える。図１８の中間表現では、条件分岐で異なる値が得られる場合、値は必ずｐｈｉとして表現される。しかし、ｐｈｉは複数の条件を持っており、ダミーコード生成の妨げになることがある。そこで、計算特性取得手段１５３は、条件を１つしか持たないｓｅｌｅｃｔに置き換え、適切なダミーコードを生成できるようにする。
【０１８４】
共通部分式除去では、中間表現の要素のうち、全く同じ処理を行っているものを１つにまとめ、残りを除去する。これにより、並列プログラム中で全く同じ処理が行われることを防止する。図１８の中間表現では、ｉｎｓｎ１、ｉｎｓｎ４、ｉｎｓｎ５が同じ処理を行っているため、計算特性取得手段１５３は、ｉｎｓｎ１だけを残して残りを削除する。
【０１８５】
縮約検出では、計算特性取得手段１５３は、入力配列から、より小さな配列を算出する処理（縮約）を検出する。縮約処理は、通常の並列演算とは異なる手順で行わないと、その実行時間を再現することができないので、本手順が必要となる。縮約処理の例としては、配列に格納された値の総和や総乗、最大値や最小値の算出が挙げられる。計算特性取得手段１５３は、ｃａｒｒｙのバックエッジをたどり、ｃａｒｒｙに対する演算が縮約処理にあたるものであった場合、このｃａｒｒｙをｒｅｄｕｃｔｉｏｎ（縮約）値に置き換える。
【０１８６】
以上の様な処理により、計算特性取得手段１５３は、図１９に示す新たな中間表現を生成する。
【０１８７】
（例３）
本例において、分岐特性と、メモリアドレス特性の取得の例について説明する。
【０１８８】
まず、計算特性取得手段１５３は、入力プログラムから、図１６の入力プログラムにおける１９行目から２３行目の様な条件分岐の部分を検出する。当該検出は、例えば、並列化可能部分検出情報によるものであってもよいし、予め決められていてもよい。通常は、計算特性取得手段１５３が、条件分岐部分を検出すると予め決められている。
【０１８９】
次に、計算特性取得手段１５３は、検出した条件分岐部分において、ｔｈｅｎ側のブロックと、ｅｌｓｅ側のブロックのそれぞれの先頭に、当該いずれかのブロックに分岐したことを標準出力に出力する関数を挿入する。当該挿入の例は、図２０である。図２０は、図１６の入力プログラムの一部である。
【０１９０】
次に、入力プログラム実行手段１５２は、図２０の挿入がなされた入力プログラムを実行する。例えば、当該実行の結果、図２０のｔｈｅｎ側に分岐した場合、入力プログラムは、「ｂｒａｎｃｈ  ｔｏ  ｔｈｅｎ」を標準出力に出力する。また、図２０のｅｌｓｅ側に分岐した場合、入力プログラムは、「ｂｒａｎｃｈ  ｔｏ  ｅｌｓｅ」を標準出力に出力する。
【０１９１】
次に、計算特性取得手段１５３は、例えば、「ｂｒａｎｃｈ」をキーに標準出力の内容を検索し、「ｔｈｅｎ」または「ｅｌｓｅ」を分岐特性として取得する。
【０１９２】
次に、計算特性取得手段１５３は、入力プログラムから、図１６の入力プログラムにおける４４行目から４６行目の様なメモリアクセスの部分を検出する。当該検出は、例えば、並列化可能部分検出情報によるものであってもよいし、予め決められていてもよい。通常は、計算特性取得手段１５３が、メモリアクセス部分を検出すると予め決められている。
【０１９３】
次に、計算特性取得手段１５３は、検出したメモリアクセス部分において、配列にアクセスするプログラムコードの直前に、当該アクセスされる配列のメモリアドレスを出力する関数を挿入する。当該挿入の位置は、当該プログラムコードの直後であってもよい。当該挿入の例は、図２１である。図２１は、図１６の入力プログラムの一部である。
【０１９４】
次に、入力プログラム実行手段１５２は、図２１の挿入がなされた入力プログラムを実行する。例えば、当該実行の結果、配列ｄの１番目の要素、ｄ［ｉ］に対応するメモリアドレスが「０ｘｂｆｆｆｆａ８０」である場合、入力プログラムは、「ａｄｄｒｅｓｓ  ｏｆ  ｄ［１］  ＝  ０ｘｂｆｆｆｆａ８０」を標準出力に出力する。
【０１９５】
次に、計算特性取得手段１５３は、例えば、「ａｄｄｒｅｓｓ  ｏｆ」をキーに標準出力の内容を検索し、「０ｘｂｆｆｆｆａ８０」をメモリアクセス特性として取得する。
【０１９６】
（例４）
本例において、書き換えた中間表現からの並列プログラムの生成の例について説明する。また、以下において説明する行番号は、すべて、図２２から図２４におけるものである。また、生成する並列プログラムは、並列計算アーキテクチャＣＵＤＡで使用される並列計算向け言語「ＣＵＤＡ  Ｃ」で記述されたものであるものとする。なお、ＣＵＤＡについては、「http://www.nvidia.co.jp/object/cuda-jp.html」を参照されたい。また、以下、「ＣＵＤＡ  Ｃ」を「ＣＵＤＡ」と表記する場合もある。
【０１９７】
並列プログラムの生成にあたり、まず、元のｘ８６命令を実行し、いくつかのパラメタを取得する。必要なパラメタは、ループが実行された回数と、性能評価の対象となるループの実行前にレジスタやメモリに格納されていた値と、中間表現のメモリアクセス（ｌｏａｄ／ｓｔｏｒｅ）のうちランダムアクセスであるものについて、対応するｘ８６命令にて実際にアクセスしたアドレスと、ｘ８６の分岐命令で、ジャンプが実行されたかどうかの履歴である。
【０１９８】
まず、並列プログラム生成部１６は、ループが実行された回数（１０行目）と、性能評価の対象となるループの実行前にレジスタやメモリに格納されていた値（１２〜２６行目）を、マクロとして書き出す。
【０１９９】
次に、並列プログラム生成部１６は、並列プログラムの本体となるカーネル関数（２８〜５９行目）を書き出す。カーネル関数の仮引数は、中間表現に含まれる配列と、ランダムアクセスと、条件分岐の数だけ用意する（２９〜３４行目）。
【０２００】
次に、カーネル関数の内容のうち、ダミー変数の定義（３６行目）と、ループインデックスに相当する値の導出（３７行目）と、ループ回数の設定（３８行目）については、どのような入力に対しても必ず行う。
【０２０１】
また、内部の処理は、図１９の中間表現をグラフとみなし、ｓｔｏｒｅから深さ優先探索を行うことで出力する。当該グラフは、図２５である。
【０２０２】
並列プログラム生成部１６は、まず、ｘ８６命令を事前実行した際に得られたアドレスで、ｓｔｏｒｅ０とｌｏａｄ１の処理を出力する。ｓｔｏｒｅ０、ｌｏａｄ１、ｃｏｍａｓｓｏｃ２のグラフの形は、ＣＵＤＡのａｔｏｍｉｃＡｄｄに対応するものなので、最初にｃｏｍａｓｓｏｃ２のｌｏａｄ１以外の参照先としてｃｏｎｓｔａｎｔ１を出力する（３９行目）。そして、並列プログラム生成部１６は、ｓｔｏｒｅ０とｌｏａｄ１に共通する配列（ａｒｒａｙ＿１）の事前に記録したインデックス（ｒａｎｄｏｍ＿ｌｏａｄ＿ｍａｐ＿１）の箇所のアドレスと、ｃｏｎｓｔａｎｔ１（ｖ０）を引数として、ａｔｏｍｉｃＡｄｄ関数を呼び出す（４０行目）。
【０２０３】
次に、並列プログラム生成部１６は、アクセスするアドレスの計算処理についても出力し、アドレス計算にかかる負荷を再現する。ｓｔｏｒｅ０とｌｏａｄ１の共通するアドレスであるｃｏｍａｓｓｏｃ１をたどると、まずｃｏｎｓｔａｎｔ１に行きつく。そこで、並列プログラム生成部１６は、ｃｏｎｓｔａｎｔ１の値を並列プログラムに出力する（４１行目）。
【０２０４】
ｃｏｍａｓｓｏｃ１からグラフを戻ると、ｉｎｄｕｃｔｉｖｅ０に当たる。ｉｎｄｕｃｔｉｖｅは、ループが回るごとに増加する値であったので、並列プログラム生成部１６は、ループインデックスに係数を掛けた値を出力する（４２行目）。
【０２０５】
グラフを戻って、まだ探索していない方向をたどると、ｃｏｎｓｔａｎｔ３に当たる。ｃｏｎｓｔａｎｔ３は定数なので、並列プログラム生成部１６は、使用されていない変数名「ｖ３」で変数を定義し、この変数を、ｃｏｎｓｔａｎｔ３の値で初期化するコード「ｉｎｔ  ｖ３  ＝  ０；」を出力する。
【０２０６】
以上でｃｏｍａｓｓｏｃ０から先はすべて探索したので、並列プログラム生成部１６は、ｃｏｍａｓｓｏｃ０を出力する。並列プログラム生成部１６は、通常、ある要素（ノード）から先の探索が終われば、その要素（ノード）を出力する。ｃｏｍａｓｓｏｃは加減算を表す中間表現なので、並列プログラム生成部１６は、単純に子要素の加算を書き出す（４４行目）。例では、減算は行っていないので出力する必要はない。
【０２０７】
グラフを戻ると、ｃｏｍａｓｓｏｃ０はロードアドレスとして使われていることがわかる。そこで、並列プログラム生成部１６は、ｃｏｍａｓｓｏｃ０をインデックスとした配列アクセスを出力する（４５行目）。
【０２０８】
さらにグラフを戻ると、ｉｎｓｎ０にたどりつく。ｉｎｓｎ０は８ｂｉｔから３２ｂｉｔへの整数拡張（ｓｘ３２＿８）なので、並列プログラム生成部１６は、単純なキャストとして出力する（４７行目）。
【０２０９】
さらにグラフを戻り、未探索のノードｉｎｓｎ１に進む。その先のｉｎｓｎ０は探索済みなので、並列プログラム生成部１６は、ここでｉｎｓｎ１を出力する。ｉｎｓｎ１は符号反転する命令（ｎｅｇ３２）なので、ｉｎｓｎ０の値に単項マイナス演算を行う（４８行目）。
【０２１０】
以上で、ｓｅｌｅｃｔ０以降の探索が終わったので、並列プログラム生成部１６は、ｓｅｌｅｃｔ０を出力する。ｓｅｌｅｃｔ０に付属するｃｏｎｄを見ると、対応する分岐履歴と分岐方向がわかるので、これに基づいて３項演算子を出力し、ｉｎｓｎ０とｉｎｓｎ１のうち、適切なものを選択するようにする（４９行目）。
【０２１１】
グラフを戻り、未探索のノードｃｏｎｓｔａｎｔ４に進む。これは定数なので、並列プログラム生成部１６は、そのまま出力する（５０行目）。
【０２１２】
グラフを戻り、並列プログラム生成部１６は、ｉｎｓｎ２を出力する。ｉｎｓｎ２は右シフトを行う命令（ｓｈａ３２）なので、並列プログラム生成部１６は、ｓｅｌｅｃｔ０をｃｏｎｓｔａｎｔ４だけ右シフトするコードを生成する（５１行目）。
【０２１３】
グラフを戻り、未探索のノードｃｏｎｓｔａｎｔ５に進む。これは定数なので、並列プログラム生成部１６は、そのまま出力する（５２行目）。
【０２１４】
グラフを戻り、並列プログラム生成部１６は、ｉｎｓｎ３を出力する。ｉｎｓｎ３は乗算を行う命令（ｍｕｌ３２＿３２）なので、並列プログラム生成部１６は、ｉｎｓｎ２とｃｏｎｓｔａｎｔ５の乗算を行うコードを生成する（５３行目）。
【０２１５】
グラフを戻り、未探索のノードｃｏｎｓｔａｎｔ６に進む。これは定数なので、並列プログラム生成部１６は、そのまま出力する（５４行目）。
【０２１６】
グラフを戻り、並列プログラム生成部１６は、ｃｏｍａｓｓｏｃ１を出力する。ｃｏｍａｓｓｏｃ０と同様に、並列プログラム生成部１６は、単純に子要素の加算を書き出す（５５行目）。
【０２１７】
次に、並列プログラム生成部１６は、ｃｏｍａｓｓｏｃ１の結果をｖｏｌａｔｉｌｅ変数に書き出す（５６行目）。これは、ＣＵＤＡコンパイラによりコンパイルを行った際に、最適化の処理により計算特性に含まれる処理がコンパイラによって削除されてしまい、計算特性を再現することができなくなる可能性があるためである。なお、コンパイラがＣＵＤＡコンパイラでない場合であっても、何らかの方法にて、当該最適化によるコードの削除を回避することが必要である。当該何らかの方法とは、上記の様なコードを挿入することなどである。また、これ以降は、４０行目のａｔｏｍｉｃＡｄｄ関数として出力しているため、以上がカーネル関数の内容となる。
【０２１８】
最後に、ｍａｉｎ関数内の処理について述べる。ｍａｉｎ関数内では、ランダムアクセスのインデックス（６２〜７５行目）や、分岐結果（７６〜９０行目）を記録した配列を用意し、デバイス側領域を確保して転送する（９５〜１０６行目）。また、配列についてもデバイス側領域の確保を行う（９１〜９４行目）。
【０２１９】
以上の領域とデータを引数として、生成したカーネル関数を実行する。この時、ブロック数とスレッド数について、いくつかの組み合わせについて試行する（１０８〜１２５行目）。
【０２２０】
以上の様な処理により、並列プログラム生成部１６は、図２２から図２４に示す並列プログラムを生成する。
【０２２１】
以上、本実施の形態による実行時間算出装置１によれば、並列化の対象となるプログラムと同等の計算特性を持つ並列プログラムを生成することができる。また、その実行時間を算出することができる。これにより、ユーザは、プログラムを並列化することによりどの程度の高速化が図れるかを事前に知ることができる。
【０２２２】
また、例えば、入力プログラムのすべてが並列化可能部分である場合、実行時間算出装置１は、当該入力プログラムに対応する並列プログラムを生成する。当該並列プログラムは、つまりは、入力プログラムのすべてを並列実行が可能なプログラムに書き換えたものである。
【０２２３】
また、例えば、入力プログラムが１以上の並列化可能部分を有する場合、実行時間算出装置１は、当該１以上の各並列化可能部分を並列化した並列プログラムを生成する。当該並列プログラムは、つまりは、入力プログラムの一部を並列実行が可能なプログラムに書き換えたものである。
【０２２４】
また、本実施の形態において、実行時間算出装置１は、例えば、中間表現生成部１４を備えていない実行時間算出装置２であってもよい。この場合の実行時間算出装置２のブロック図を、図２８に示す。図２８において、実行時間算出装置２は、並列プログラム生成情報格納部１１と、受付部１３と、並列化可能部分検出部１５と、並列プログラム生成部１６と、並列プログラム実行部１７と、出力部１８とを備える。また、並列化可能部分検出部１５は、並列化可能部分検出手段１５１と、入力プログラム実行手段１５２と、計算特性取得手段１５３を備える。また、この場合、計算特性取得手段１５３は、受付部１３が受け付けた入力プログラムから、上記の３種類のうちの１種類以上の計算特性を取得する。
【０２２５】
また、本実施の形態において、実行時間算出装置１は、例えば、並列プログラム実行部１７と、出力部１８とを備えていなくてもよい。この場合、ユーザは、並列プログラム生成部１６が生成した並列プログラムを得る。また、これにより、ユーザは、アーキテクチャの異なる様々な並列コンピュータ上で当該並列プログラムを実行することにより、当該実行時の実行時間を、入力プログラムを当該各アーキテクチャ向けに並列化した際の実行時間の目安とすることができる。
【０２２６】
また、本実施の形態において、実行時間算出装置１は、例えば、中間表現生成部１４と、並列プログラム実行部１７と、出力部１８とを備えていなくてもよい。この場合、ユーザは、並列プログラム生成部１６が生成した並列プログラムを得る。また、この場合の効果については、上記と同様であるので、説明を省略する。
【０２２７】
また、上記各実施の形態において、一の装置に存在する２以上の通信手段は、物理的に一の媒体で実現されてもよいことは言うまでもない。
【０２２８】
また、上記各実施の形態における実行時間算出装置は、例えば、スタンドアロンの装置であってもよいし、サーバ・クライアントシステムにおけるサーバ装置であってもよい。後者の場合には、例えば、ＡＳＰ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｅｒｖｉｃｅ  Ｐｒｏｖｉｄｅｒ）として実行時間の算出が行われてもよい。
【０２２９】
また、上記各実施の形態において、各処理または各機能は、単一の装置または単一のシステムによって集中処理されることによって実現されてもよいし、あるいは、複数の装置または複数のシステムによって分散処理されることによって実現されてもよい。
【０２３０】
また、上記各実施の形態において、各構成要素は専用のハードウェアにより構成されてもよいし、あるいは、ソフトウェアにより実現可能な構成要素については、プログラムを実行することによって実現されてもよい。例えば、ハードディスクや半導体メモリ等の記録媒体に記録されたソフトウェア・プログラムをＣＰＵ等のプログラム実行部が読み出して実行することによって、各構成要素が実現され得る。
【０２３１】
また、上記各実施の形態における実行時間算出装置を実現するソフトウェアは、例えば、以下のようなプログラムである。つまり、このプログラムは、一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である１以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部にアクセス可能なコンピュータを、入力プログラムを受け付ける受付部と、入力プログラムを受け付ける受付部と、前記１以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成部と、前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、前記並列プログラム実行部が取得した実行時間情報を出力する出力部として機能させるためのプログラムである。
【０２３２】
なお、上記プログラムにおいて、上記プログラムが実現する機能には、ハードウェアでしか実現できない機能は含まれない。
【０２３３】
また、上記プログラムは、サーバなどからダウンロードされることによって実行されてもよいし、所定の記録媒体（例えば、ＣＤ−ＲＯＭなどの光ディスクや磁気ディスク、半導体メモリなど）に記録されたプログラムが読み出されることによって実行されてもよい。また、このプログラムは、プログラムプロダクトを構成するプログラムとして用いられてもよい。
【０２３４】
また、上記プログラムを実行するコンピュータは、単数であってもよいし、複数であってもよい。つまり、集中処理を行ってもよいし、あるいは分散処理を行ってもよい。
【０２３５】
また、図２７は、前述のプログラムを実行して、前述の実施の形態の実行時間算出装置等を実現するコンピュータシステム９の概観図である。前述の実施の形態は、コンピュータハードウェア及びその上で実行されるコンピュータプログラムで実現され得る。
【０２３６】
図２７において、コンピュータシステム９は、ＣＤ−ＲＯＭドライブ９０１１、ＦＤドライブ９０１２を含むコンピュータ９０１と、キーボード９０２と、マウス９０３と、モニタ９０４とを備える。
【０２３７】
図２８は、コンピュータシステム９のブロック図である。図２８において、コンピュータ９０１は、ＣＤ−ＲＯＭドライブ９０１１、ＦＤドライブ９０１２に加えて、ＭＰＵ９０１３と、ブートアッププログラム等のプログラムを記憶するためのＲＯＭ９０１４と、ＭＰＵ９０１３に接続され、アプリケーションプログラムの命令を一時的に記憶するとともに一時記憶空間を提供するためのＲＡＭ９０１５と、アプリケーションプログラム、システムプログラム、及びデータを記憶するためのハードディスク９０１６と、ＣＤ−ＲＯＭドライブ９０１１、ＦＤドライブ９０１２、ＭＰＵ９０１３等を相互に接続するバス９０１７とを備える。ここでは図示しないが、コンピュータ９０１は、さらに、ＬＡＮへの接続を提供するネットワークカードを備えていてもよい。
【０２３８】
コンピュータシステム９に、前述の実施の形態の実行時間算出装置等の機能を実行させるプログラムは、ＣＤ−ＲＯＭ９１０１、またはＦＤ９１０２に記憶されて、ＣＤ−ＲＯＭドライブ９０１１またはＦＤドライブ９０１２に挿入され、さらにハードディスク９０１６に転送されてもよい。これに代えて、プログラムは、図示しないネットワークを介してコンピュータ９０１に送信され、ハードディスク９０１６に記憶されてもよい。プログラムは実行の際にＲＡＭ９０１５にロードされる。プログラムは、ＣＤ−ＲＯＭ９１０１、ＦＤ９１０２またはネットワークから直接、ロードされてもよい。
【０２３９】
プログラムは、コンピュータ９０１に、前述の実施の形態の実行時間算出装置等の機能を実行させるオペレーティングシステム（ＯＳ）、またはサードパーティープログラム等は、必ずしも含まなくてもよい。プログラムは、制御された態様で適切な機能（モジュール）を呼び出し、所望の結果が得られるようにする命令の部分のみを含んでいればよい。コンピュータシステム９がどのように動作するかは周知であり、詳細な説明は省略する。
【０２４０】
本発明は、以上の実施の形態に限定されることなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【符号の説明】
【０２４１】
１  実行時間算出装置
１１  並列プログラム生成情報格納部
１２  中間表現生成情報格納部
１３  受付部
１４  中間表現生成部
１５  並列化可能部分検出部
１６  並列プログラム生成部
１７  並列プログラム実行部
１８  出力部
１５１  並列化可能部分検出手段
１５２  入力プログラム実行手段
１５３  計算特性取得手段
【図１】
2014099108.tif 000003
【図２】
2014099108.tif 000004
【図３】
2014099108.tif 000005
【図４】
2014099108.tif 000006
【図５】
2014099108.tif 000007
【図６】
2014099108.tif 000008
【図７】
2014099108.tif 000009
【図８】
2014099108.tif 000010
【図９】
2014099108.tif 000011
【図１０】
2014099108.tif 000012
【図１１】
2014099108.tif 000013
【図１２】
2014099108.tif 000014
【図１３】
2014099108.tif 000015
【図１４】
2014099108.tif 000016
【図１５】
2014099108.tif 000017
【図１６】
2014099108.tif 000018
【図１７】
2014099108.tif 000019
【図１８】
2014099108.tif 000020
【図１９】
2014099108.tif 000021
【図２０】
2014099108.tif 000022
【図２１】
2014099108.tif 000023
【図２２】
2014099108.tif 000024
【図２３】
2014099108.tif 000025
【図２４】
2014099108.tif 000026
【図２５】
2014099108.tif 000027
【図２６】
2014099108.tif 000028
【図２７】
2014099108.tif 000029
【図２８】
2014099108.tif 000030