JP2014099108A - 実行時間算出装置、実行時間算出方法、およびプログラム - Google Patents

実行時間算出装置、実行時間算出方法、およびプログラム Download PDF

Info

Publication number
JP2014099108A
JP2014099108A JP2012251560A JP2012251560A JP2014099108A JP 2014099108 A JP2014099108 A JP 2014099108A JP 2012251560 A JP2012251560 A JP 2012251560A JP 2012251560 A JP2012251560 A JP 2012251560A JP 2014099108 A JP2014099108 A JP 2014099108A
Authority
JP
Japan
Prior art keywords
program
parallel
parallelizable
parallel program
information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2012251560A
Other languages
English (en)
Inventor
Yosuke Tamura
陽介 田村
Natsuki Kawai
夏輝 河合
Takashi Nakamura
孝史 中村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
FIXSTARS CORP
Original Assignee
FIXSTARS CORP
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by FIXSTARS CORP filed Critical FIXSTARS CORP
Priority to JP2012251560A priority Critical patent/JP2014099108A/ja
Publication of JP2014099108A publication Critical patent/JP2014099108A/ja
Pending legal-status Critical Current

Links

Images

Abstract

【課題】従来までは、プログラムを並列化することによる高速化の程度を事前に知ることができなかった。
【解決手段】並列化が可能であると見込まれる部分を検出し、当該並列化可能部分に対応するダミーのプログラムである部分並列プログラムを生成するための情報である並列プログラム生成情報を用いて、入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、並列プログラム生成情報を用いて、並列化可能部分に対応する部分並列プログラムを生成することにより、部分並列プログラムを有する並列プログラムを、入力プログラムから生成する並列プログラム生成部と、並列プログラムを実行し、実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、実行時間情報を出力する出力部とを備える実行時間算出装置により、プログラムを並列化することによりどの程度の高速化が図れるかを事前に知ることができる。
【選択図】図1

Description

本発明は、プログラムの実行時間を算出する装置等に関するものである。
今日、CPU単体の動作周波数の向上速度が低下し、これに伴い、CPU単体の処理能力の向上速度も大きく低下した。半導体ベンダー各社は、代わりに、1つのチップに複数の演算装置(コア)を搭載することにより、処理能力の向上を図るようになった。このようなCPUを、一般的に、マルチコアCPUと呼ぶ。このようなマルチコアCPUの性能を生かすには、各コアで並列に動作するプログラムが必要である。
従来、プログラムを並列化するには、人手で並列化する方法や、コンパイラなどにより自動的に並列化する方法などが採用される。人手で並列化する場合、例えば、OpenMP(非特許文献1参照)や、MPI(Message Passing Interface)(非特許文献2参照)などの技術が用いられる。
非特許文献1:"OpenMP Application Program Interface"、[online]、OpenMP.org、インターネット[URL;http://www.openmp.org/mp-documents/OpenMP3.1.pdf] 非特許文献2:"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]
プログラムの並列化に際しては、プログラムを並列化することによる高速化の程度を事前に知り、それに応じて、並列化を行うか否かを判断することが好適である。従来においては、プログラムを並列化することによる高速化の程度を、事前に知ることはできた。しかしながら、従来までは、得られた高速化の程度の精度が十分ではなかった。また、高速化の程度を知るには、実際に並列化を行う際の手間と同等の手間を要していた。
本第一の発明の実行時間算出装置は、一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、並列化可能部分から、並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である1以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部と、入力プログラムを受け付ける受付部と、1以上の並列プログラム生成情報を用いて、入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、並列化可能部分に対応する部分並列プログラムを生成することにより、部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、入力プログラムから生成する並列プログラム生成部と、並列プログラム生成部が生成した並列プログラムを実行し、実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、並列プログラム実行部が取得した実行時間情報を出力する出力部とを備える実行時間算出装置である。
このような構成により、並列化の対象となるプログラムと同等の処理を行うダミーの並列プログラムを生成することができる。また、当該並列プログラムを実行することにより、プログラムを並列化することによる高速化の程度を、精度良くまた手間を要することなく知ることができる。
また、本第二の発明の実行時間算出装置は、第一の発明に対して、並列化可能部分検出部は、1以上の並列プログラム生成情報を用いて、入力プログラムから1以上の並列化可能部分を検出する並列化可能部分検出手段と、並列化可能部分において行われる計算の特性である計算特性を、並列化可能部分から検出する計算特性取得手段とを備え、並列プログラム生成部は、並列化可能部分を検出した際に用いた並列プログラム生成情報と、計算特性取得手段が取得した計算特性とを用いて、並列化可能部分に対応する部分並列プログラムを生成することにより、並列プログラムを、入力プログラムから生成する実行時間算出装置である。
このような構成により、並列化の対象となるプログラムと同等の計算特性を持つ並列プログラムを生成することができる。
また、本第三の発明の実行時間算出装置は、第一または第二の発明に対して、並列プログラム生成情報は、入力プログラムを擬似的な命令で表現したものである中間表現から、部分並列プログラムを生成するための情報であり、入力プログラムから中間表現を生成するための情報である1以上の中間表現生成情報が格納される中間表現生成情報格納部と、1以上の中間表現生成情報を用いて、入力プログラムから中間表現を生成する中間表現生成部とをさらに備え、並列プログラム生成部は、1以上の並列プログラム生成情報を用いて、中間表現生成部が生成した中間表現における並列化可能部分に対応する部分並列プログラムを生成することにより、並列プログラムを、入力プログラムから生成する実行時間算出装置である。
このような構成により、並列化の対象となるプログラムと同等の計算特性を持つ並列プログラムを、一度、中間表現に変換してから生成することができる。
また、本第四の発明の実行時間算出装置は、第三の発明に対して、計算特性取得手段は、中間表現生成部が生成した中間表現から、所定の並列化可能部分を計算特性として取得する実行時間算出装置である。
このような構成により、中間表現から計算特性を取得することができる。
また、本第五の発明の実行時間算出装置は、第二から第四いずれか1つの発明に対して、並列プログラム生成情報は、ループ部分に対応する部分並列プログラムを生成するための情報であり、並列化可能部分検出手段は、並列プログラム生成情報を用いて、入力プログラムから1以上のループ部分を検出し、計算特性取得手段は、ループ部分において、ループが実行されるごとに一の値に対して一定数加算または減算する処理の部分、同一配列へのアクセスを行う処理の部分、2以上の値から1つの値を選択する処理の部分のうちのいずれか1以上の処理の部分を計算特性として取得する実行時間算出装置である。
このような構成により、演算の集合に関する計算特性を取得することができる。
また、本第六の発明の実行時間算出装置は、第二から第五いずれか1つの発明に対して、並列化可能部分検出部は、入力プログラムを実行する入力プログラム実行手段をさらに備え、計算特性取得手段は、入力プログラム実行手段による入力プログラムの実行結果から、所定の並列化可能部分の実行結果を計算特性として取得する実行時間算出装置である。
このような構成により、入力プログラムの実行結果から、計算特性を取得することができる。
また、本第七の発明の実行時間算出装置は、第六の発明に対して、並列プログラム生成情報は、条件分岐部分に対応する部分並列プログラムを生成するための情報であり、並列化可能部分検出手段は、並列化可能部分検出情報を用いて、入力プログラムから1以上の条件分岐部分を検出し、計算特性取得手段は、入力プログラム実行手段による入力プログラムの実行結果から、条件分岐部分における分岐の結果を計算特性として取得する実行時間算出装置である。
このような構成により、条件分岐に関する計算特性を取得することができる。
また、本第八の発明の実行時間算出装置は、第六または第七の発明に対して、並列プログラム生成情報は、メモリへのアクセスを行うメモリアクセス部分に対応する部分並列プログラムを生成するための情報であり、並列化可能部分検出手段は、並列プログラム生成情報を用いて、入力プログラムから1以上のメモリアクセス部分を検出し、計算特性取得手段は、入力プログラム実行手段による入力プログラムの実行結果から、メモリアクセス部分においてアクセスしたメモリアドレスを計算特性として取得する実行時間算出装置である。
このような構成により、アクセス先が不定であるメモリアクセスに関する計算特性を取得することができる。
本発明による実行時間算出装置等によれば、プログラムを並列化することによる高速化の程度を、精度良くまた手間を要することなく知ることができる。
実施の形態1における実行時間算出装置1のブロック図 同インダクションの例を示す図 同同一配列のアクセスの例を示す図 同縮約の例を示す図 同縮約の例を示す図 同分岐結果を取得するためのプログラムコードの挿入例を示す図 同アクセスするメモリアドレスを取得するためのプログラムコードの挿入例を示す図 同グラフ化した中間表現の例を示す図 同グラフ化した中間表現の例を示す図 同実行時間算出装置1の全体動作について説明するフローチャート 同中間表現の生成処理について説明するフローチャート 同並列化可能部分の検出処理について説明するフローチャート 同計算特性の取得処理について説明するフローチャート 同中間表現生成情報の例を示す図 同並列プログラム生成情報の例を示す図 同入力プログラムの例を示す図 同アセンブリプログラムの例を示す図 同中間表現の例を示す図 同中間表現の例を示す図 同分岐結果を取得するためのプログラムコードの挿入例を示す図 同アクセスするメモリアドレスを取得するためのプログラムコードの挿入例を示す図 同並列プログラムの例を示す図 同並列プログラムの例を示す図 同並列プログラムの例を示す図 同中間表現のグラフ化の例を示す図 同実行時間算出装置2のブロック図 上記実施の形態におけるコンピュータシステムの概観図 上記実施の形態におけるコンピュータシステムのブロック図
以下、本発明による実行時間算出装置等の実施形態について図面を参照して説明する。なお、実施の形態において同じ符号を付した構成要素は同様の動作を行うので、再度の説明を省略する場合がある。また、本実施の形態において説明する各情報の形式、内容などは、あくまで例示であり、各情報の持つ意味を示すことができれば、形式、内容などは問わない。
(実施の形態1)
本実施の形態において、並列化の対象となるプログラムの計算特性を引き継いだ並列プログラムを生成し、当該並列プログラムの実行時間を算出する実行時間算出装置1について説明する。
図1は、本実施の形態における実行時間算出装置1のブロック図である。実行時間算出装置1は、並列プログラム生成情報格納部11、中間表現生成情報格納部12、受付部13、中間表現生成部14、並列化可能部分検出部15、並列プログラム生成部16、並列プログラム実行部17、出力部18を備える。また、並列化可能部分検出部15は、並列化可能部分検出手段151、入力プログラム実行手段152、計算特性取得手段153を備える。
並列プログラム生成情報格納部11には、1以上の並列プログラム生成情報が格納される。並列プログラム生成情報とは、一のプログラムから、並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分に対応する部分並列プログラムを生成するための情報である。
ここで、本実施の形態において、プログラムとは、通常、いわゆるソースコードである。つまり、プログラムとは、いわゆるプログラミング言語で記述されたものである。また、プログラムは、例えば、いわゆるアセンブリコードで記述されたプログラムや、いわゆるスクリプト言語で記述されたプログラムなどであってもよい。また、一のプログラムにおける各行を、以下、適宜、プログラムコード、または、単にコードとする。また、プログラムには、例えば、いわゆる実行プログラムや、いわゆるバイナリ、オブジェクトコードなどを含んでもよい。
「一のプログラム」とは、後述の受付部13が受け付ける入力プログラムである。また、入力プログラムとは、並列化の対象となるプログラムである。また、入力プログラムは、通常、並列化可能部分を1以上有する。また、入力プログラムは、プログラミング言語による記述が、並列実行されることが考慮されていない記述となっていることが好適である。当該入力プログラムを、以下、適宜、直列プログラムとする。また、入力プログラムは、並列化済みの部分を1以上有していてもよい。
つまり、並列プログラム生成情報は、入力プログラムから並列プログラムを生成するための情報である。並列プログラムとは、並列実行が可能なプログラムである。また、並列プログラムは、通常、1以上の部分並列プログラムを有する。
また、「並列化可能部分」とは、言い換えると、並列化が可能であると考えられる部分や、並列化が可能であると判断できる部分などである。また、「並列化可能部分」は、例えば、並列化が可能であると見込まれる部分を検出するためのパターンに合致する部分であってもよい。また、「並列化可能部分」は、例えば、並列化が可能であると見込まれればよく、実際には並列化が行えない部分であってもよい。「並列化可能部分」は、通常、ループ部分である。また、当該ループ部分には、条件分岐や、同一配列へのアクセス、異なる2以上の変数に対し他の一の変数による演算、与えられる引数や使用する変数が相互に影響のない2以上の関数の呼び出しなどが含まれていることが好適である。また、ループには、通常、コンパイラの最適化処理などによって展開されているものも含む。
また、「部分並列プログラム」とは、少なくとも並列実行が可能なダミーのプログラムである。「並列実行が可能」とは、いわゆる並列計算が可能なコンピュータにおいて、並列的に実行することが可能であることを意味する。また、並列計算が可能なコンピュータとは、例えば、いわゆるマルチコアCPUが搭載されているコンピュータや、いわゆるGPUが搭載されているコンピュータ、いわゆる並列コンピュータと呼ばれるコンピュータなどである。また、「ダミーのプログラム」とは、当該ダミーのプログラムに対応する元のプログラムを、人手により並列化した際の実行時間を取得するためのプログラムである。これは、言い換えると、当該ダミーのプログラムに対応する元のプログラムと同等の計算を行うが、得られる実行結果が異なるプログラムのことである。また、元のプログラムとは、通常、入力プログラムである。また、同等の計算とは、例えば、いわゆる計算量が同等であることや、計算に要するクロック数が同等であること、計算を実現する命令数が同等であること、使用するメモリ容量が同等であることなどである。
また、並列プログラム生成情報は、通常、検出情報と、生成情報との対応表である。検出情報とは、一のプログラムから並列化可能部分を検出するための情報である。また、生成情報とは、当該並列化可能部分から部分並列プログラムを生成するための情報である。
検出情報は、例えば、並列化可能部分を検出するための条件である検出条件や、並列化可能部分を検出する方法に関する情報である検出方法情報などである。また、生成情報は、例えば、生成する部分並列プログラムの内容を示す生成内容情報や、部分並列プログラムの生成方法に関する情報である生成方法情報などである。以下、これらの情報について、順次、説明する。
検出条件は、通常、プログラムコードのパターンである。当該パターンは、例えば、正規表現である。また、パターンは、プログラムコードそのものであってもよい。また、2行以上の範囲を検出する場合、検出条件は、通常、開始位置を検出するためのパターンと、終了位置を検出するためのパターンとを有する。なお、検出条件は、一のプログラムから並列化可能部分を検出することができるものであれば、その内容や形式などは、問わない。また、検出条件の例については、後述する。
また、検出方法情報は、通常、並列化可能部分を検出するアルゴリズムを表現したものである。検出方法情報は、例えば、例えば、並列化可能部分を検出する実行プログラムや、並列化可能部分を検出する手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどである。また、擬似的なプログラムコードとは、アルゴリズムを、自然言語を用いてプログラミング言語のように記述したものである。また、擬似的なプログラムコードの文法は、通常、既存のプログラミング言語の文法に似たものである。
また、検出方法情報が実行プログラムである場合、当該実行プログラムは、通常、検出条件を用いて、並列化可能部分を検出する。つまり、当該実行プログラムは、後述の並列化可能部分検出手段151が行う、検出条件を用いた並列化可能部分の検出の方法や手順などと同様の方法や手順などにより、並列化可能部分を検出する。
また、検出方法情報は、例えば、上記の実行プログラムやソースコードなどの識別子であってもよい。当該識別子は、通常、いわゆるファイル名や、いわゆるファイルパスなどである。また、当該識別子で識別される実行プログラムやソースコードなどは、通常、並列プログラム生成情報格納部11に格納されている。また、当該実行プログラムやソースコードなどは、例えば、所定の記憶領域または所定の記憶領域に格納されていてもよい。
また、生成内容情報は、例えば、プログラムコードや、プログラムコードのパターンなどである。当該パターンは、例えば、プログラムコードのテンプレートや、ひな形などである。テンプレートや、ひな形などは、通常、一部を書き換えることでプログラムコードとなるものである。なお、生成内容情報は、並列化可能部分に対応する部分並列プログラムの内容を示すことができるものであれば、その内容や形式などは、問わない。
また、生成方法情報は、通常、部分並列プログラムを生成するアルゴリズムを表現したものである。生成方法情報は、例えば、並列化可能部分に対応する部分並列プログラムを生成する実行プログラムや、当該部分並列プログラムを生成する手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどである。
また、並列プログラム生成情報は、例えば、一のプログラムから並列化可能部分を検出し、当該並列化可能部分に対応する部分並列プログラムを生成するプログラムや、当該検出と生成の手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどであってもよい。
また、並列プログラム生成情報は、例えば、中間表現から部分並列プログラムを生成するための情報であってもよい。中間表現とは、入力プログラムを擬似的な命令で表現したものである。また、擬似的な命令とは、通常、入力プログラムにより表現されるアルゴリズムを、命令形式で表現したものである。また、当該擬似的な命令の内容や形式などは、問わない。また、当該擬似的な命令を、以下、中間表現命令とする。また、中間表現は、入力プログラムを擬似的に表現したものであれば、その内容や形式などは、問わない。また、中間表現は、入力プログラムからの並列プログラムの生成を容易にするためのものでもある。なお、並列プログラム生成情報が、中間表現から部分並列プログラムを生成するための情報である場合における検出情報や、生成情報は、上記と同様であるので、説明を省略する。また、中間表現は、通常、無閉路有向グラフとみなせることが好適である。この場合、無閉路有向グラフの各ノードは、通常、中間表現命令により示される。
また、並列プログラム生成情報は、例えば、並列化可能部分から取得する計算特性を示す取得計算特性情報を有していてもよい。計算特性とは、入力プログラムが行う計算の特性である。また、計算特性とは、例えば、所定の処理が行われる部分や、当該処理における処理結果などである。また、計算特性は、例えば、1以上の演算の集合に関する演算特性や、条件分岐部分における分岐の結果である分岐特性、メモリアクセス部分においてアクセスしたメモリアドレスであるメモリアクセス特性などである。
演算特性とは、入力プログラムが、自身への入力に対してどのような処理を行い、どこに出力するのかを示すものである。演算特性は、例えば、インダクションや、同一配列へのアクセス、縮約、四則演算などの単純な演算などの処理である。また、分岐特性は、条件分岐部分において、then側、else側のどちらに分岐したかを示すものである。また、メモリアクセス特性は、例えば、配列のインデックス値であってもよい。
インダクションとは、例えば、図2に示す様な処理である。当該処理は、一の値に対して、ループが実行されるごとに一定数加算するまたは一定数減算する処理である。当該一の値とは、図2においては、キャリー値のことである。また、キャリー値は、一のループ部分において、一のループにおいて算出され、かつ、次のループにおいて使用する値のことである。また、一の値は、通常、変数である。
また、同一配列へのアクセスとは、例えば、図3におけるメモリ読出しと、メモリ書込みの様に、配列にアクセスする際のインデックス値が、固定のインデックス値と、インダクションと、定数値との乗算や加算などの演算により算出される配列へのアクセス処理のことである。当該インデックス値は、メモリアドレスでもよい。
また、縮約とは、2以上の値から1つの値を選択する処理のことである。具体的に、縮約は、例えば、図4に示す様な、他の値との加算、他の値との減算、他の値との乗算、他の値との除算を行っている処理のことである。また、縮約は、例えば、図5に示す様な、他の値と比較し大きい値または小さい値を選択する演算のみを行っている処理のことである。
また、取得計算特性情報は、通常、検出情報に対応付いている。また、取得計算特性情報は、例えば、演算特性を取得することを示す「演算特性」や、分岐特性を取得することを示す「分岐特性」、メモリアクセス特性を取得することを示す「メモリアクセス特性」などである。
中間表現生成情報格納部12には、1以上の中間表現生成情報が格納される。中間表現生成情報とは、入力プログラムから中間表現を生成するための情報である。中間表現生成情報は、通常、検出情報と、生成情報との対応表である。検出情報とは、入力プログラムからプログラムコードを検出するための情報である。また、生成情報とは、検出情報により検出したプログラムコードに対応する中間表現を生成するための情報である。また、当該検出情報は、上記の並列プログラム生成情報が有する検出情報の内容や形式などと同様である。また、当該生成情報は、プログラムコードではなく中間表現命令を生成するためのものであること以外は、上記の並列プログラム生成情報が有する生成情報の内容や形式などと同様である。
また、中間表現生成情報は、例えば、入力プログラムから中間表現を生成するプログラムや、当該生成の手順を示すソースコード、当該手順を示す擬似的なプログラムコード、当該手順を示すフローチャートなどであってもよい。
受付部13は、入力プログラムを受け付ける。また、受付部13は、入力プログラムであるファイルの識別子を受け付けてもよい。当該ファイルの識別子とは、通常、ファイル名である。また、この場合、当該ファイルは、通常、所定の記憶領域に格納されている。また、この場合、受付部13は、通常、受け付けたファイル名で識別されるファイルを、所定の記憶領域から取得する。
また、受け付けとは、光ディスクや、磁気ディスク、半導体メモリなどの記録媒体からの情報の取得や、これらの記録媒体から読み出された情報の受け付け、有線もしくは無線の通信回線を介して送信された情報の受信などを含む概念である。
また、受付部13における情報や指示などの入力手段は、メニュー画面によるものや、キーボードなど、何でもよい。受付部13は、メニュー画面の制御ソフトウェアや、キーボード等の入力手段のデバイスドライバーなどで実現され得る。
中間表現生成部14は、入力プログラムから中間表現を生成する。「生成する」とは、通常、結果として取得することであり、広く解する。また、「生成する」とは、例えば、入力プログラムとは別に、中間表現を作成することであってもよい。また、「生成する」とは、入力プログラム中のプログラムコードを置換などし、中間表現に書き換えることであってもよい。また、以下において、「変換する」とは、「生成する」と同義である。また、中間表現生成部14は、通常、1以上の中間表現生成情報を用いて、一の入力プログラムから一の中間表現を生成する。
例えば、中間表現生成情報が、検出情報と、生成情報との対応表である場合、中間表現生成部14は、通常、当該検出情報を用いて、入力プログラムから1以上のプログラムコードを検出する。そして、中間表現生成部14は、生成情報に従い、当該検出したプログラムコードを中間表現命令に書き換える。「書き換える」とは、出力することであってもよい。
また、例えば、中間表現生成情報が、入力プログラムから中間表現を生成する実行プログラムである場合、中間表現生成部14は、通常、当該実行プログラムを実行する。また、例えば、中間表現生成情報が、入力プログラムから中間表現を生成する手順を示すフローチャートである場合、中間表現生成部14は、通常、当該フローチャートの各ステップで示される処理に従い、入力プログラムから中間表現を生成する。
また、例えば、入力プログラムが、いわゆるプログラミング言語で記述されたものである場合、中間表現生成部14は、中間表現生成情報を用いて、当該入力プログラムから中間表現を生成する。また、この場合、中間表現生成部14は、例えば、入力プログラムをコンパイルし、アセンブリコードを取得する。そして、中間表現生成部14は、中間表現生成情報を用いて、当該アセンブリコードから中間表現を生成してもよい。これは、入力プログラムがアセンブリコードで記述されている場合も同様である。
また、中間表現生成部14は、例えば、入力プログラムのすべてから中間表現を生成してもよい。また、中間表現生成部14は、例えば、入力プログラムのうち、後述の並列化可能部分検出部15が検出した並列化可能部分から中間表現を生成してもよい。前者の場合、中間表現生成部14は、通常、一の入力プログラムに対応する一の中間表現を生成する。また、後者の場合、中間表現生成部14は、通常、並列化可能部分検出部15が検出した並列化可能部分と同数の中間表現を生成する。
なお、中間表現生成部14が中間表現を生成する場合、入力プログラムは、通常、プログラミング言語で記述されたものであることが好適である。また、中間表現生成部14は、通常、当該プログラミング言語で記述された入力プログラムからアセンブリコードを取得し、当該アセンブリコードから中間表現を生成することが好適である。また、当該入力プログラムからアセンブリコードを取得する場合、中間表現生成部14は、通常、当該入力プログラムをコンパイルする。
並列化可能部分検出部15は、1以上の並列プログラム生成情報を用いて、入力プログラムにおける並列化可能部分を検出する。これは、つまり、入力プログラムから並列化可能部分を検出することである。また、並列化可能部分検出部15は、例えば、検出した並列化可能部分から、計算特性を取得する。なお、並列化可能部分検出部15は、通常、後述の各手段により、並列化可能部分の検出や、当該並列化可能部分からの計算特性の取得を行う。
並列化可能部分検出手段151は、並列プログラム生成情報が有する検出情報を用いて、受付部13が受け付けた入力プログラムから1以上の並列化可能部分を検出する。「検出する」とは、取得することであってもよい。例えば、検出情報が検出条件である場合、並列化可能部分検出手段151は、通常、入力プログラムの各行について、当該各行のプログラムコードが、当該検出条件に合致するか否かを判断する。そして、並列化可能部分検出手段151は、当該検出条件に合致する1以上のプログラムコードを、並列化可能部分として検出する。また、例えば、検出情報が検出方法情報である場合、並列化可能部分検出手段151は、当該検出方法情報に従い、並列化可能部分を検出する。
例えば、検出情報が、ループ部分を検出するための検出条件である場合、並列化可能部分検出手段151は、当該検出条件に従い、入力プログラムが有する1以上のループ部分を検出する。この場合、並列化可能部分検出手段151は、通常、入力プログラム(ソースコード)から、アセンブリプログラムを取得する。そして、並列化可能部分検出手段151は、当該取得したアセンブリプログラムから制御フローグラフ(Control Flow Graph:以下、適宜、CFG)を作成し、当該制御フローグラフから、ループ部分を検出する。なお、アセンブリプログラムからのCFGの作成の方法や手順などは、公知であるので、詳細な説明を省略する。
ここで、制御フローグラフとは、プログラムを実行したときに通る可能性のある命令の全経路をグラフで表したものである。制御フローグラフは、通常、有向グラフである。また、制御フローグラフは、アセンブリプログラムを構成する各命令をノードとする2以上のノードを有するものであってもよい。
また、並列化可能部分検出手段151は、CFGからのループ部分の検出を、例えば、次の様にして行う。まず、並列化可能部分検出手段151は、CFGからループの起点となるノードを検出する。当該ノードが示す命令は、通常、予め決められている。そして、並列化可能部分検出手段151は、当該起点となるノードから順に、接続されているノードをたどっていく。そして、当該たどった結果、起点となるノードに戻ってきた場合、並列化可能部分検出手段151は、当該起点となるノードから出発し起点となるノードに戻ってくるまでのパスを、ループ部分として検出する。
また、制御フローグラフからループ部分を検出する場合の検出条件は、例えば、「ループ」や、「ループ部分」、「LOOP」などである。また、入力プログラム(ソースコード)からループ部分を検出する場合の検出条件は、例えば、「ループ」や、「for文」や、「while文」、「do−while文」、「for(...){...}」、「while(...){...}」、「do{...}while(...)」などである。「...」は、for文において指定する初期値や、while文において指定する継続条件式、任意のプログラムコードなどを意味する。
また、例えば、検出情報が、条件分岐部分を検出するための検出条件である場合、並列化可能部分検出手段151は、当該検出条件に従い、入力プログラムが有する1以上の条件分岐部分を検出する。また、並列化可能部分検出手段151は、例えば、CFGから1以上の条件分岐部分を検出してもよい。入力プログラムから条件分岐部分を検出する場合、並列化可能部分検出手段151は、例えば、if文やswitch文などの制御構文の部分を、条件分岐部分として検出する。また、CFGから条件分岐部分を検出する場合、並列化可能部分検出手段151は、例えば、一のノードから2以上のノードに分岐し、当該分岐した2以上のノードからのパスが、他の一のノードに合流する部分を、条件分岐部分として検出する。
また、入力プログラムから条件分岐部分を検出する場合の検出条件は、例えば、「条件分岐」や、「if文」、「switch文」、「if(...){...}」、「switch(...){...}などである。「...」は、if文において指定する条件式や、任意のプログラムコードなどを意味する。また、CFGから条件分岐部分を検出する場合の検出条件は、例えば、「条件分岐」や、「分岐」、「branch」などである。
また、例えば、検出情報が、メモリアクセス部分を検出するための検出条件である場合、並列化可能部分検出手段151は、当該検出条件に従い、入力プログラムが有する1以上のメモリアクセス部分を検出する。この場合の検出条件は、例えば、「メモリアクセス」や、「配列へのアクセス」、「メモリに割りつけられた変数へのアクセス」、「配列への代入」、「$配列名[...]=」、「=$配列名[...]」、「$変数名=」、「=$変数名」などである。また、「...」は、配列のインデックス値や、インデックス値を示す変数などを意味する。
また、例えば、検出情報が、アクセス先が不定なメモリアクセスを検出するための検出条件である場合、並列化可能部分検出手段151は、入力プログラムが有する1以上のメモリアクセス部分のうち、実行時までアクセス先が不定であるメモリアクセス部分を検出する。この場合の検出条件は、例えば、「アクセス先不定メモリアクセス」や、「アクセス先不定配列へのアクセス」、「アクセス先不定配列への代入」などである。
また、並列化可能部分検出手段151は、実行時までアクセス先が不定であるか否かの判断に、例えば、上記の中間表現を用いてもよい。この場合、並列化可能部分検出手段151は、まず、中間表現から、1以上のメモリアクセス部分を検出する。そして、並列化可能部分検出手段151は、当該検出した1以上のメモリアクセス部分においてアクセスするメモリアドレスについて、当該メモリアクセスが所属するループよりも外側に所属している値、同じループに所属するインダクション値、これらの値同士から算出した値のいずれかであるか否かを判断する。ここで、「メモリアクセスが所属するループ」とは、当該メモリアクセスが行われているループや、当該メモリアクセスを含むループなどである。また、「ループに所属するインダクション値」とは、当該ループにおいて算出されるインダクション値や、当該ループが含むインダクション値などである。そして、並列化可能部分検出手段151は、これらの値のいずれでもない場合に、当該メモリアクセスについて、実行時までアクセス先が不定であるメモリアクセスであると判断する。
また、例えば、検出情報が、並列化可能部分を検出する実行プログラムである場合、並列化可能部分検出手段151は、当該実行プログラムを実行する。当該実行プログラムは、検出方法情報である。また、当該実行プログラムは、例えば、ループ部分を検出する場合は、通常、上記のループ部分を検出するための検出条件を用いて、ループ部分を検出する。また、当該実行プログラムは、例えば、条件分岐部分を検出する場合は、通常、上記の条件分岐部分を検出するための検出条件を用いて、条件分岐部分を検出する。また、当該実行プログラムは、例えば、メモリアクセス部分を検出する場合は、通常、上記のメモリアクセス部分を検出するための検出条件を用いて、メモリアクセス部分を検出する。
また、例えば、検出情報が並列化可能部分を検出する手順を示すフローチャートである場合、並列化可能部分検出手段151は、当該フローチャートの各ステップで示される処理に従い、入力プログラムから並列化可能部分を検出する。例えば、フローチャートのあるステップにおける処理が「for文のブロックを検出する」である場合、並列化可能部分検出手段151は、入力プログラムから、for文のブロック(for文の開始から終了まで)に該当する部分を検出する。
また、例えば、検出情報が並列化可能な部分を検出する手順を示す擬似的なプログラムコードである場合、並列化可能部分検出手段151は、当該プログラムコードを解釈し、当該解釈に従い、入力プログラムから並列化可能部分を検出する。例えば、擬似的なプログラムコードが「extract loop(for)」であるとする。当該擬似的なプログラムコードは、for文で構成されるループを検出すること、を意味する。この場合、並列化可能部分検出手段151は、入力プログラムから、for文のブロックに該当する部分を検出する。
また、並列化可能部分検出手段151は、並列化可能部分の検出により、当該並列化可能部分や、入力プログラムにおける当該並列化可能部分の位置などを取得する。並列化可能部分の位置を取得する場合、並列化可能部分検出手段151は、通常、1以上の行番号や、範囲を示す2つの行番号の1以上のセットを取得する。
また、入力プログラムから並列化可能部分検出条件に合致する並列化可能部分を検出する具体的な方法や手順などは、公知であるので、詳細な説明を省略する。例えば、入力プログラム中の制御構造部分を検出したり、所定の条件に合致するプログラムコードを検出したりするものには、例えば、いわゆるプログラミング用のエディタや、コンパイラなどがある。
入力プログラム実行手段152は、入力プログラムを実行する。入力プログラムを実行する方法や手順などは、公知であるので、詳細な説明を省略する。そして、入力プログラム実行手段152は、入力プログラムの実行結果を取得する。当該入力プログラムは、通常、計算特性取得手段153により、条件分岐部分における分岐の結果を取得するためのプログラムコードや、メモリアクセス部分におけるアクセスしたメモリアドレスを取得するためのプログラムコードなどが挿入されたプログラムである。また、実行結果とは、入力プログラムが出力する情報である。また、実行結果の出力先は、問わない。実行結果の出力先は、例えば、標準出力や、ファイル、メモリなどである。また、入力プログラム実行手段152は、例えば、プログラムを実行することができるコンピュータに入力プログラムを送信し、当該コンピュータから、入力プログラムが出力する情報を取得してもよい。
計算特性取得手段153は、入力プログラムから計算特性を取得する。計算特性取得手段153は、通常、入力プログラムにおける並列化可能部分から計算特性を取得する。また、計算特性取得手段153は、通常、各並列化可能部分に対応した所定の計算特性を取得する。計算特性取得手段153は、例えば、並列化可能部分検出手段151が並列化可能部分を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報に従い、計算特性を取得する。
例えば、取得計算特性情報が演算特性を取得することを示す「演算特性」である場合、計算特性取得手段153は、並列化可能部分から演算特性を取得する。また、例えば、取得計算特性情報が分岐特性を取得することを示す「分岐特性」である場合、計算特性取得手段153は、並列化可能部分から分岐特性を取得する。また、例えば、取得計算特性情報がメモリアクセス特性を取得することを示す「メモリアクセス特性」である場合、計算特性取得手段153は、並列化可能部分からメモリアクセス特性を取得する。
また、計算特性取得手段153は、例えば、入力プログラムや、入力プログラムから生成した中間表現、入力プログラムを実行した結果である実行結果などから、計算特性を取得する。
演算特性を取得する場合、計算特性取得手段153は、入力プログラムから、演算特性を取得する。具体的に、計算特性取得手段153は、並列化可能部分検出手段151が検出した並列化可能部分に対応する中間表現から、演算特性を取得する。当該並列化可能部分は、通常、ループ部分である。また、計算特性取得手段153は、通常、1種類以上の演算特性を取得する。
また、並列化可能部分に対応する中間表現は、例えば、中間表現生成部14が、並列化可能部分検出手段151が検出した並列化可能部分から生成した中間表現である。また、並列化可能部分に対応する中間表現は、例えば、中間表現生成部14が入力プログラムから生成した中間表現のうち、並列化可能部分検出手段151が検出した並列化可能部分に対応する箇所であってもよい。当該並列化可能部分に対応する箇所は、通常、計算特性取得手段153が検出する。
また、入力プログラムから生成した中間表現から、並列化可能部分に対応する箇所を検出する場合、計算特性取得手段153は、通常、中間表現から並列プログラムを生成するための並列プログラム生成情報を用いる。
また、中間表現から演算特性を取得することとは、通常、演算特性であるインダクションや、同一配列へのアクセスなどの処理を、中間表現から検出することである。また、中間表現から演算特性を取得することは、例えば、当該処理において算出される値を取得することであってもよい。また、中間表現から演算特性を取得することは、例えば、当該処理と、当該処理において算出される値とを置換することであってもよい。
また、演算特性である処理と、当該処理において算出される値とを置換することとは、中間表現における演算特性を、並列プログラムに引き継がれるように書き換えることである。当該書き換えは、中間表現を簡略化することである。
例えば、中間表現からインダクションを検出した場合、計算特性取得手段153は、当該インダクションにおいて算出される値と、当該インダクションとを置換する。また、例えば、中間表現から縮約を検出した場合、計算特性取得手段153は、当該縮約において算出される値と、当該縮約とを置換する。当該置換の例は、例えば、図8から図9への変換である。図8、および図9は、中間表現で示される各処理を、グラフ化したものである。また、図9における「インダクション値」は、図8におけるインダクションにおいて算出される値であり、図8のインダクションを当該値で置換している。また、図9における「縮約値」は、図9における縮約において算出される値であり、図9の縮約を当該値で置換している。
以上より、計算特性取得手段153は、入力プログラムを解析し、演算特性を導出するために必要な情報を中間表現の形で取得する。そして、計算特性取得手段153は、上記の様な処理により中間表現を書き換え、当該書き換えた中間表現を演算特性として取得する。
また、分岐特性を取得する場合、計算特性取得手段153は、入力プログラム実行手段152による入力プログラムの実行結果から、条件分岐部分における分岐の結果である分岐特性を取得する。計算特性取得手段153は、通常、入力プログラムに、条件分岐部分における分岐の結果を取得するためのプログラムコードを挿入する。そして、計算特性取得手段153は、当該プログラムコードが挿入された入力プログラムを、入力プログラム実行手段152が実行することにより、分岐の結果を取得する。例えば、入力プログラムが図6に示すフローチャートの様な処理の場合、計算特性取得手段153は、当該分岐の結果を取得するためのプログラムコードを、「分岐結果記録プログラム追加箇所」に挿入する。
例えば、分岐の結果を取得するためのプログラムコードが、「分岐結果:$分岐結果」の書式にて、分岐の結果を出力するとする。「$分岐結果」は、分岐の結果を示す変数である。この場合、計算特性取得手段153は、入力プログラムの実行結果から、「分岐結果:」を手掛かりに、「分岐結果:$分岐結果」における「$分岐結果」部分の文字列を取得する。また、例えば、分岐の結果を取得するためのプログラムコードが、その他の書式にて分岐の結果を出力する場合、計算特性取得手段153は、当該書式に従い、入力プログラムの実行結果から、分岐特性を取得する。
なお、分岐特性を取得するために挿入するプログラムコードや、当該プログラムコードにより取得される分岐特性は、条件分岐部分における分岐の結果を示すものであれば、その内容や形式などは、問わない。
また、メモリアクセス特性を取得する場合、計算特性取得手段153は、入力プログラム実行手段152による入力プログラムの実行結果から、メモリアクセス部分においてアクセスしたメモリアドレスであるメモリアクセス特性を取得する。計算特性取得手段153は、通常、分岐特性の取得と同様に、入力プログラムに、メモリアクセス部分においてアクセスするメモリアドレスを取得するためのプログラムコードを挿入する。そして、計算特性取得手段153は、当該プログラムコードが挿入された入力プログラムを、入力プログラム実行手段152が実行することにより、メモリアドレスを取得する。例えば、入力プログラムが図7に示すフローチャートの様な処理の場合、計算特性取得手段153は、当該メモリアドレスを取得するためのプログラムコードを、「ランダムアクセスアドレス記録収集プログラム追加箇所」に挿入する。
例えば、メモリアドレスを取得するためのプログラムコードが、「メモリアドレス:$メモリアドレス」の書式にて、メモリアドレスを出力するとする。「$メモリアドレス」は、メモリアドレスを示す変数である。この場合、計算特性取得手段153は、入力プログラムの実行結果から、「メモリアドレス:」を手掛かりに、「メモリアドレス:$メモリアドレス」における「$メモリアドレス」部分の文字列を取得する。また、例えば、メモリアドレスを取得するためのプログラムコードが、その他の書式にてメモリアドレスを出力する場合、計算特性取得手段153は、当該書式に従い、入力プログラムの実行結果から、メモリアクセス特性を取得する。
なお、分岐特性を取得するために挿入するプログラムコードや、当該プログラムコードにより取得される分岐特性は、条件分岐部分における分岐の結果を示すものであれば、その内容や形式などは、問わない。
並列プログラム生成部16は、入力プログラムから並列プログラムを生成する。この場合、並列プログラム生成部16は、通常、並列化可能部分検出部15が並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該検出した並列化可能部分に対応する部分並列プログラムを生成する。そして、並列プログラム生成部16は、例えば、入力プログラムにおける並列化可能部分と、生成した部分並列プログラムとを置換し、並列プログラムを生成する。
また、並列プログラム生成部16は、中間表現から並列プログラムを生成してもよい。この場合、並列プログラム生成部16は、通常、並列プログラム生成情報を用いて、中間表現から並列プログラムを生成する。また、この場合、並列プログラム生成部16は、例えば、中間表現のうち、並列化可能部分検出部15が検出した並列化可能部分に対応する中間表現から部分並列プログラムを生成してもよい。そして、並列プログラム生成部16は、例えば、入力プログラムにおける並列化可能部分と、生成した部分並列プログラムとを置換し、並列プログラムを生成する。
また、並列プログラム生成部16は、通常、並列プログラム生成情報と、計算特性取得手段153が取得した計算特性とを用いて、当該検出した並列化可能部分に対応する部分並列プログラムを生成する。
例えば、並列プログラム生成情報が、並列化可能部分を検出するための検出情報と、生成するプログラムコードの内容を示す生成内容情報である場合、並列化可能部分検出部15は、入力プログラムから1以上の並列化可能部分を検出する。従って、並列プログラム生成部16は、並列化可能部分検出部15が検出した1以上の各並列化可能部分を、当該生成内容情報に従い、並列プログラムが有するプログラムコードに書き換える。
また、例えば、並列プログラム生成情報が、中間表現命令を検出するための検出情報と、生成するプログラムコードの内容を示す生成内容情報との対応表である場合、中間表現生成部14は、入力プログラムから中間表現を生成する。従って、並列プログラム生成部16は、中間表現生成部14が生成した中間表現が有する1以上の各中間表現命令を、当該生成内容情報に従い、並列プログラムが有するプログラムコードに書き換える。
また、例えば、並列プログラム生成情報が、中間表現または入力プログラムから並列プログラムを生成する実行プログラムである場合、並列プログラム生成部16は、通常、当該実行プログラムを実行する。また、例えば、並列プログラム生成情報が、中間表現または入力プログラムから並列プログラムを生成する手順を示すフローチャートである場合、並列プログラム生成部16は、通常、当該フローチャートの各ステップで示される処理に従い、中間表現または入力プログラムから並列プログラムを生成する。
また、並列プログラム生成部16は、並列プログラムを生成する過程において、必要に応じて、計算特性取得手段153が取得した計算特性に応じて、並列プログラムが有するプログラムコードを生成する。
例えば、生成内容情報が、分岐特性を代入することを示す変数を有する場合、並列プログラム生成部16は、計算特性取得手段153が取得した分岐特性と、当該変数とを置換する。そして、並列プログラム生成部16は、当該置換された生成内容情報に従い、並列プログラムを生成する。
また、例えば、生成内容情報が、条件分岐部分において分岐したブロックのプログラムコードを出力することを示す場合、並列プログラム生成部16は、計算特性取得手段153が取得した分岐特性が示す分岐の結果に応じて、当該条件分岐部分におけるthen側、else側のいずれかのブロックに対応するプログラムコードを生成する。
また、例えば、生成内容情報が、メモリアクセス特性を代入することを示す変数を有する場合、並列プログラム生成部16は、計算特性取得手段153が取得したメモリアクセス特性と、当該変数とを置換する。そして、並列プログラム生成部16は、当該置換された生成内容情報に従い、並列プログラムを生成する。
なお、並列化可能部分検出部15が行う処理と、並列プログラム生成部16が行う処理との関係は、次のとおりである。例えば、並列プログラム生成情報が、検出情報と、生成情報との対応表であるとする。すると、並列化可能部分検出部15は、当該検出情報を用いて、入力プログラムから並列化可能部分を検出する。そして、並列化可能部分検出部15が検出情報を用いて並列化可能部分を検出した場合、並列プログラム生成部16は、当該並列化可能部分に対応する部分並列プログラムを、生成情報を用いて生成する。
また、上記において、並列プログラム生成情報が、取得計算特性情報を有している場合、並列化可能部分検出部15(計算特性取得手段153)は、検出した並列化可能部分から、当該取得計算特性情報が示す計算特性を取得する。そして、並列プログラム生成部16は、並列化可能部分検出部15が検出した並列化可能部分に対応する並列プログラムを、当該生成情報と、当該計算特性とを用いて生成する。
並列プログラム実行部17は、並列プログラム生成部16が生成した並列プログラムを実行する。当該実行は、通常、並列実行である。また、並列プログラムを実行する方法や手順などは、公知であるので、説明を省略する。そして、並列プログラム実行部17は、並列プログラムの実行に要した時間に関する情報である実行時間情報を取得する。実行に要した時間とは、つまりは、実行時間のことである。また、実行時間は、実行速度としてもよい。
また、実行時間情報とは、通常、実行に要した時間(秒)を示す情報である。また、実行時間情報は、例えば、入力プログラムを並列化したことにより得られた実行時間の短縮率や、その割合、また、実行速度の向上率や、その割合などを示す情報であってもよい。実行時間を示す場合、実行時間情報は、例えば、「10μsec」や、「0.1秒」などである。また、実行時間の短縮率や、実行速度の向上率などを示す場合、実行時間情報は、例えば、「20%短縮」や、「50%向上」、「1.5倍」などである。また、実行時間情報を取得する方法や手順などは、公知であるので、詳細な説明を省略する。
出力部18は、並列プログラム実行部17が取得した実行時間情報を出力する。出力とは、ディスプレイへの表示、プロジェクターを用いた投影、プリンタでの印字、音出力、外部の装置への送信、記録媒体への蓄積、他の処理装置や他のプログラムなどへの処理結果の引渡しなどを含む概念である。なお、送信や蓄積、処理結果の引渡しについては、出力対象が最終的にユーザに提示されるものとする。
また、出力部18は、ディスプレイやスピーカーなどの出力デバイスを含むと考えてもよいし、含まないと考えてもよい。出力部18は、出力デバイスのドライバーソフトまたは、出力デバイスのドライバーソフトと出力デバイスなどで実現され得る。
なお、並列プログラム生成情報格納部11、中間表現生成情報格納部12は、不揮発性の記録媒体が好適であるが、揮発性の記録媒体でも実現可能である。また、並列プログラム生成情報格納部11などに所定の情報が記憶される過程は、問わない。例えば、当該所定の情報は、記録媒体や、通信回線、入力デバイスなどを介して並列プログラム生成情報格納部11などに記憶されてもよい。
また、中間表現生成部14、並列化可能部分検出部15、並列化可能部分検出手段151、入力プログラム実行手段152、計算特性取得手段153、並列プログラム生成部16、並列プログラム実行部17は、通常、MPUやメモリ等から実現され得る。また、中間表現生成部14などの処理手順は、通常、ソフトウェアで実現され、当該ソフトウェアはROM等の記録媒体に記録されている。なお、中間表現生成部14などは、ハードウェア(専用回路)で実現されてもよい。
次に、実行時間算出装置1の全体動作について、フローチャートを用いて説明する。なお、所定の情報におけるi番目の情報は、「情報[i]」と記載するものとする。図10は、実行時間算出装置1の全体動作を示すフローチャートである。なお、図10のフローチャートにおいて、並列プログラム生成情報は、取得計算特性情報を有するものとする。
(ステップS1001)中間表現生成部14は、受付部13が入力プログラムを受け付けたか否かを判断する。受け付けた場合は、ステップS1002に進み、そうでない場合は、ステップS1001に戻る。
(ステップS1002)中間表現生成部14は、ステップS1001で受け付けた入力プログラムから、中間表現を生成する。この処理の詳細は、図11のフローチャートを用いて説明する。
(ステップS1003)並列化可能部分検出手段151は、並列プログラム生成情報格納部11に格納されている1以上の並列プログラム生成情報を用いて、ステップS1001で受け付けた入力プログラムから、1以上の並列化可能部分を検出する。この処理の詳細は、図12のフローチャートを用いて説明する。また、この処理の結果、並列化可能部分検出手段151は、m個の並列化可能部分を検出したものとする。
(ステップS1004)並列プログラム生成部16は、カウンタiに1をセットする。
(ステップS1005)計算特性取得手段153は、並列化可能部分[i]から、計算特性を取得する。この処理の詳細は、図13のフローチャートを用いて説明する。
(ステップS1006)並列プログラム生成部16は、並列化可能部分[i]を検出した際に用いた並列プログラム生成情報と、ステップS1005で取得した計算特性とを用いて、並列化可能部分[i]に対応する部分並列プログラムを生成する。
(ステップS1007)並列プログラム生成部16は、入力プログラムにおける並列化可能部分[i]と、ステップS1006で生成した部分並列プログラムとを置換する。なお、このとき、並列プログラム生成部16は、例えば、入力プログラムを複製する。そして、並列プログラム生成部16は、当該複製した入力プログラムに対し、順次、置換を行う。
(ステップS1008)並列プログラム生成部16は、iがmであるか否かを判断する。mである場合は、ステップS1010に進み、そうでない場合は、ステップS1009に進む。
(ステップS1009)並列プログラム生成部16は、iを1インクリメントし、ステップS1005に戻る。
(ステップS1010)並列プログラム実行部17は、ステップS1007での置換により生成された並列プログラムを実行し、実行時間関連情報を取得する。
(ステップS1011)出力部18は、ステップS1010で取得した実行時間関連情報を取得する。そして、ステップS1001に戻る。
なお、図10のフローチャートにおいて、電源オフや処理終了の割り込みにより処理を終了してもよい。
また、図10のフローチャートにおいて、ステップS1002の処理は行わなくてもよい。この場合、ステップS1005の処理において、計算特性取得手段153は、中間表現からではなく、入力プログラムから計算特性を取得する。
図11は、図10のフローチャートのステップS1002の中間表現の生成処理を示すフローチャートである。なお、図11のフローチャートにおいて、中間表現生成情報格納部12には、n個の中間表現生成情報が格納されているものとする。また、当該中間表現生成情報は、検出条件と、生成内容情報との対応表であるものとする。
(ステップS1101)中間表現生成部14は、受付部13が受け付けた入力プログラムからアセンブリコードを取得する。ここで、中間表現生成部14は、m行のアセンブリコードが取得できたものとする。
(ステップS1102)中間表現生成部14は、カウンタiに1をセットする。
(ステップS1103)中間表現生成部14は、カウンタjに1をセットする。
(ステップS1104)中間表現生成部14は、アセンブリコードのi行目が、中間表現生成情報[j]が有する検出条件に合致するか否かを判断する。合致する場合は、ステップS1105に進み、そうでない場合は、ステップS1106に進む。
(ステップS1105)中間表現生成部14は、中間表現生成情報[j]が有する生成内容情報に従い、中間表現命令を生成する。ここで、中間表現生成部14は、例えば、生成した中間表現をファイルに出力する場合、当該生成した中間表現命令を、ファイルに書き出す。そして、ステップS1108に進む。
(ステップS1106)中間表現生成部14は、jがnであるか否かを判断する。nである場合は、ステップS1108に進み、そうでない場合は、ステップS1107に進む。
(ステップS1107)中間表現生成部14は、jを1インクリメントし、ステップS1104に戻る。
(ステップS1108)中間表現生成部14は、iがmであるか否かを判断する。mである場合は、上位処理にリターンし、そうでない場合は、ステップS1109に進む。
(ステップS1109)中間表現生成部14は、iを1インクリメントし、ステップS1103に戻る。
なお、図11のフローチャートにおいて、中間表現生成部14は、例えば、所定の単位ごとに、アセンブリコードから中間表現命令を生成してもよい。この場合の所定の単位とは、例えば、2以上の行である。
図12は、図10のフローチャートのステップS1003の並列化可能部分の検出処理を示すフローチャートである。なお、図12のフローチャートにおいて、並列プログラム生成情報格納部11には、m個の並列プログラム生成情報が格納されているものとする。また、当該並列プログラム生成情報は、検出条件を有するものとする。
(ステップS1201)並列化可能部分検出手段151は、変数cに0をセットする。
(ステップS1202)並列化可能部分検出手段151は、カウンタiに1をセットする。
(ステップS1203)並列化可能部分検出手段151は、並列プログラム生成情報[i]が有する検出条件に合致する部分が、入力プログラム中に存在するか否かを判断する。存在する場合は、ステップS1204に進み、そうでない場合は、ステップS1206に進む。
(ステップS1204)並列化可能部分検出手段151は、cを1インクリメントする。
(ステップS1205)並列化可能部分検出手段151は、検出した並列化可能部分を格納するための配列である並列化可能部分[c]に、検出条件[i]に合致する入力プログラムの行番号をセットする。このとき、例えば、検出条件に合致する入力プログラム中のプログラムコードが1行のみであった場合、並列化可能部分検出手段151は、当該1行の行番号をセットする。また、例えば、検出条件に合致する入力プログラム中のプログラムコードが2行以上であった場合、並列化可能部分検出手段151は、例えば、当該2行以上の各行番号をセットしてもよいし、当該2行以上の開始の行番号と、終了の行番号との2つの行番号をセットしてもよい。
(ステップS1206)並列化可能部分検出手段151は、iがmであるか否かを判断する。mである場合は、上位処理にリターンし、そうでない場合は、ステップS1207に進む。
(ステップS1207)並列化可能部分検出手段151は、iを1インクリメントし、ステップS1203に戻る。
図13は、図10のフローチャートのステップS1005の計算特性の取得処理を示すフローチャートである。
(ステップS1301)計算特性取得手段153は、並列化可能部分[i]が演算特性を取得する部分であるか否かを判断する。当該判断は、例えば、並列化可能部分[i]を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報が、演算特性を取得することを示すか否かを判断することにより行う。そして、演算特性を取得する部分である場合は、ステップS1302に進み、そうでない場合は、ステップS1304に進む。
(ステップS1302)計算特性取得手段153は、ステップS1002で生成した中間表現のうち、並列化可能部分[i]に対応する部分から演算特性を取得する。
(ステップS1303)計算特性取得手段153は、取得した演算特性を、当該演算特性において算出される値で置換する。そして、上位処理にリターンする。
(ステップS1304)計算特性取得手段153は、並列化可能部分[i]が分岐特性を取得する部分であるか否かを判断する。当該判断は、例えば、並列化可能部分[i]を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報が、分岐特性を取得することを示すか否かを判断することにより行う。そして、分岐特性を取得する部分である場合は、ステップS1305に進み、そうでない場合は、ステップS1308に進む。
(ステップS1305)計算特性取得手段153は、入力プログラムにおける並列化可能部分[i]に対応する部分に、分岐特性取得用のプログラムコードを挿入する。このとき、計算特性取得手段153は、例えば、分岐特性を取得するたびに、入力プログラムを複製する。そして、計算特性取得手段153は、当該複製した入力プログラムに対し、プログラムコードを挿入する。
(ステップS1306)入力プログラム実行手段152は、ステップS1305でプログラムコードが挿入された入力プログラムを実行する。
(ステップS1307)計算特性取得手段153は、ステップS1306で入力プログラムを実行した結果から、分岐特性を取得する。そして、上位処理にリターンする。
(ステップS1308)計算特性取得手段153は、計算特性取得手段153は、並列化可能部分[i]がメモリアクセス特性を取得する部分であるか否かを判断する。当該判断は、例えば、並列化可能部分[i]を検出した際に用いた並列プログラム生成情報が有する取得計算特性情報が、メモリアクセス特性を取得することを示すか否かを判断することにより行う。そして、メモリアクセス特性を取得する部分である場合は、ステップS1309に進み、そうでない場合は、上位処理にリターンする。
(ステップS1309)計算特性取得手段153は、入力プログラムにおける並列化可能部分[i]に対応する部分に、メモリアクセス特性取得用のプログラムコードを挿入する。このとき、計算特性取得手段153は、例えば、メモリアクセス特性を取得するたびに、入力プログラムを複製する。そして、計算特性取得手段153は、当該複製した入力プログラムに対し、プログラムコードを挿入する。
(ステップS1310)入力プログラム実行手段152は、ステップS1309でプログラムコードが挿入された入力プログラムを実行する。
(ステップS1311)計算特性取得手段153は、ステップS1310で入力プログラムを実行した結果から、メモリアクセス特性を取得する。そして、上位処理にリターンする。
(具体例)
次に、実行時間算出装置1の動作の具体例について説明する。なお、本具体例において、中間表現生成部14は、図14に示す中間表現生成情報を保持しているものとする。当該中間表現生成情報は、レコードを一意に特定するためのID(項目名:ID)と、アセンブリ命令(項目名:x86命令)と、中間表現命令(項目名:中間表現命令)とを有する。また、並列プログラム生成部16は、図15に示す並列プログラム生成情報を保持しているものとする。当該並列プログラム生成情報は、レコードを一意に特定するためのID(項目名:ID)と、中間表現命令(項目名:中間表現命令)と、プログラムコード(項目名:プログラムコード)とを有する。
また、以下の各例における中間表現命令の意味は、以下のとおりである。
・comassoc:プログラム中の演算を、多項式の形式で表現したもの
・store:メモリアクセスのうち、書込みを行うもの
・load:メモリアクセスのうち,読み出しを行うもの
・cond:どの分岐履歴を参照すればよいかを示すもの
・insn:プログラム中の演算を、命令形式で表現したもの
・inductive:ループが回るごとに一定値増加、あるいは減少する変数を示すもの
・constant:定数を示すもの
・carry:あるループ実行回に算出した値を次のループ実行回に使用するもの
・reduction:入力配列からより、小さな配列を算出する処理(縮約)を示すもの
・phi:関連する複数のcondによって、複数の値から1つを選択するもの
・select:関連する1つのcondによって、複数の値から1つを選択するもの
(例1)
本例において、入力プログラムからの中間表現の生成の例について説明する。なお、本例において、入力プログラムは、図16に示すプログラムであるものとする。また、当該入力プログラムに対応するアセンブリプログラムは、図17に示すプログラムであるものとする。また、図17の各命令は、いわゆるx86命令と呼ばれている命令である。また、図16や、図17における左端の数字は、便宜上の行番号であり、入力プログラムや、アセンブリプログラムなどに含まれるものではない。
まず、中間表現生成部14は、入力プログラムから、並列化可能部分であるループ部分を検出する。具体的に、中間表現生成部14は、図17のx86命令列から制御フローグラフを作成する。そして、中間表現生成部14は、当該制御フローグラフから、ループ部分を検出する。図17において、37行目にアドレスが小さくなる方向へのジャンプ命令があるので、このジャンプ先からこのジャンプ命令の範囲がループになることがわかる。これ以外のジャンプ命令は、すべてアドレスが大きくなる方向へのジャンプなので、プログラムに含まれるループはこの1つだけである。また、6行目のjmp命令以外にこのループに入る手段がないので、このループの開始位置は10行目のcmpl命令であることがわかる。
次に、中間表現生成部14は、図17の各命令から中間表現の要素を生成する。中間表現生成部14は、図17において、ループの開始位置から順に、図14の中間表現生成情報を用いて中間表現の要素を生成する。このとき、中間表現生成部14は、通常、生成した中間表現の要素に、「insn0」、「insn1」、「insn2」、・・・の様に、通し番号を付与する。
まず、図17の10行目の命令「cmpl」が、図14の中間表現生成情報の項目「x86命令」に含まれているとする。すると、中間表現生成部14は、図17の10行目のx86命令「cmpl」から、insn0を生成する。なお、以降、中間表現生成部14は、図17から検出したループ部分において、各行が有するx86命令が、図14の中間表現生成情報の項目「x86命令」に含まれているか否かを判断する。そして、含まれている場合に、中間表現生成部14は、当該x86命令に対応する「insn#」(#は通し番号)を生成する。
図17の10行目のx86命令のオペランドは、定数「$0x2710」とメモリ上の値「−0x8(%ebp)」である。そして、x86命令をたどると、メモリの値は、5行目の命令を初期値とし、9行目の命令によってループが回るたびに更新されるものであることがわかる。ここで、5行目の命令は定数0をメモリ格納するので、定数「0」として扱うことができる。また、9行目の命令は、そのオペランドをたどると、8行目の命令の結果をそのままメモリに格納するだけであることがわかる。そこで、中間表現生成部14は、定数はそのまま中間表現のconstant(定数)とする。また、中間表現生成部14は、メモリ上の値については、初期値0で、毎回8行目のx86命令によって更新されるcarry0とし、比較を行う中間表現命令cmp32(insn0)を生成する。carry0を更新する値については、後ほど8行目のx86命令を変換した際に定める。
次に、中間表現生成部14は、13行目のx86命令から、insn1を生成する。このx86命令では、メモリ上の値をレジスタの値に加算している。従って、中間表現生成部14は、加算を行う中間表現命令add32を生成する。また、中間表現生成部14は、加算数はメモリ上の値で、該当するアドレスに対する書込みは解析対象の命令列中では更新されていないので、定数constant3とする。被加算数は、10行目のx86命令の際と同じcarry0である。
次に、中間表現生成部14は、14行目のx86命令から、load0とinsn2を生成する。このx86命令は、8bit符号付き整数を、32bitに拡張するものである。また、14行目のx86命令のオペランドは、レジスタに格納された値と、アドレスのメモリ上の値である。このレジスタには、13行目のx86命令の結果が格納されており、13行目のx86命令はinsn1に変換されている。従って、中間表現生成部14は、まずinsn1からのメモリ読み出しを表す中間表現load0を生成し、これを符号拡張する中間表現命令sx32_8を生成する。
次に、中間表現生成部14は、15行目のx86命令から、insn3を生成する。このx86命令は、14行目のx86命令の結果からCPU内部のフラグを設定するものである。また、14行目のx86命令からはinsn2が生成されている。従って、中間表現生成部14は、insn2から、CPU内部のフラグを再現するための中間表現命令insn3を生成する。
次に、中間表現生成部14は、18行目のx86命令から、insn4を生成する。このx86命令は、メモリ上の値とレジスタ値の加算を行っている。その内容は、13行目のx86命令と同じである。
次に、中間表現生成部14は、24行目のx86命令から、insn5を生成する。このx86命令も、メモリ上の値とレジスタ値の加算を行っており、内容も13行目のx86命令と同じである。
次に、中間表現生成部14は、19行目のx86命令から、insn6を生成する。このx86命令は14行目のx86命令と同様に、8bit符号付き整数を、32bitに拡張するものなので、中間表現も同様のものを生成する。
次に、中間表現生成部14は、20行目のx86命令から、insn7を生成する。このx86命令は、レジスタ値を符号付き整数とみなし、符号反転する命令である。レジスタには19行目の命令の結果が格納されており、このx86命令には中間表現命令insn6が対応しているので、中間表現生成部14は、符号反転を行う中間表現命令neg32を生成し、そのオペランドはinsn6とする。
次に、中間表現生成部14は、25行目のx86命令から、insn8を生成する。このx86命令は14行目のx86命令と同様に、8bit符号付き整数を、32bitに拡張するものなので、中間表現も同様のものを生成する。
次に、中間表現生成部14は、28行目のx86命令から、insn9を生成する。このx86命令は、レジスタに格納された値を定数「2」だけ右シフトするものである。そこで、中間表現生成部14は、右シフトを行う中間表現命令shr32を生成する。レジスタの値は、この命令が実行される前に通ったパスによって、20行目のx86命令か、25行目のx86命令のどちらかの結果が格納されている。そして、これら2つのx86命令は、それぞれinsn7とinsn8が対応している。そこで、中間表現生成部14は、insn7とinsn8のどちらかを選択するphi0を生成して、insn9のオペランドとする。選択される条件は、insn7とinsn8について、それぞれ16行目のx86命令jnl=jgeでの分岐が発生しなかったか否かである。また、このx86命令が用いるフラグはinsn3に対応する15行目のx86命令である。そこで、中間表現生成部14は、phi0の選択条件として、insn3に基づくjnl命令による分岐が発生しなかったこと(not_taken)を表す中間表現cond3と、発生したこと(taken)を表す中間表現cond4を用いる。
次に、中間表現生成部14は、32行目のx86命令から、メモリ読み出しを表す中間表現load3を生成する。また、中間表現生成部14は、load3のアドレスを計算するための、いくつかの中間表現命令も生成する。このx86命令は、レジスタ値に定数「4」を掛けたものに別のレジスタ値を加算したアドレスに格納された値を、レジスタに書き込むものである。x86命令列をたどると、乗算の対象となるレジスタには、28行目のx86命令の結果が、加算だけ行うレジスタには定数(x86命令列の外部でメモリに格納された値)が格納されていることがわかる。そこで、中間表現生成部14は、まず28行目のx86命令に対応するinsn9と、定数との乗算を行う中間表現命令mul32_32(insn10)を生成する。そして、中間表現生成部14は、さらにこの値と定数constant4を加算する中間表現命令add32(insn11)を生成する。最後に、中間表現生成部14は、このinsn11のアドレスからのメモリ読み出しを表す中間表現load3を生成する。
次に、中間表現生成部14は、33行目のx86命令から、insn14を生成する。このx86命令は、レジスタの値に1を加えるものである。レジスタには、32行目のx86命令の結果が格納されているので、中間表現生成部14は、中間表現load3と定数1をオペランドとして持つ中間表現命令add32(insn14)を生成する。
次に、中間表現生成部14は、36行目のx86命令から、メモリ書込みを表す中間表現store0を生成する。また、中間表現生成部14は、store0のアドレスを計算するための、いくつかの中間表現命令も生成する。このx86命令は、32行目のx86命令とは逆に、レジスタの値をメモリに書き込むものである。x86命令列をたどると、書き込む値は33行目のx86命令の結果、アドレスは32行目のx86命令で用いたアドレスと同じものであることがわかる。そこで、中間表現生成部14は、32行目のx86命令の際と同じ2つの中間表現命令(insn12、insn13)を生成し、このinsn13をアドレスとして、33行目のx86命令と対応するinsn14の値を書きこむ中間表現store0を生成する。
次に、中間表現生成部14は、8行目のx86命令から、insn15を生成する。このx86命令は、レジスタの値に1を加えるものである。x86命令列をたどると、このレジスタにはcarry0が格納されていることが判明する。そこで、carry0と定数1をオペランドとして持ち、加算を行う中間表現命令add32(insn15)を生成する。また、carry0は8行目のx86命令によって更新されることが判明しているので、carry0のバックエッジとして、insn15を設定する。バックエッジとは、一のループ部分において、一のループにおいて算出される値のことである。
以上の様な処理により、中間表現生成部14は、図18に示す中間表現を生成する。
(例2)
本例において、図18の中間表現から図19の中間表現への書き換えの例について説明する。当該書き換えは、通常、中間表現の最適化である。また、本例では、当該最適化を大きく次の手順で行う例を取り上げる。なお、以下の処理は、通常、計算特性取得手段153が行う。
(1)comassocの生成・簡略化
(2)carry展開
(3)inductiveの検出
(4)共通配列の検出
(5)特殊命令の変換
(6)条件分岐の簡略化
(7)共通部分式除去
(8)縮約検出
comassocは、中間表現の複数要素の加減算を表すものである。comassocの生成では、計算特性取得手段153は、中間表現命令(insn)を調べ、加算や減算については、加算項と減算項からなるcomassocにまとめることで、これ以降の最適化処理で加減算を取り扱いやすくする。例えば、図18の中間表現のinsn1は、「add32 constant3 carry0」という形をしているので、計算特性取得手段153は、これを「constant3 + carry0」という形のcomassocに変換する。また、計算特性取得手段153は、comassocに複数の定数が含まれている場合はまとめて1つの定数に変換し、入れ子になっている場合は展開して1つのcomassocに置き換える。さらに、この手順で項1つからのみなるcomassocが生成された場合、計算特性取得手段153は、該当するcomassocを削除し、そのcomassocの唯一の項と置き換える。
comassocの生成・簡略化を終えると、carryのバックエッジとして1つの定数を持つものが生じることがある。これらのcarry値は今後の最適化の妨げとなることがあるため、carry展開の最適化では、計算特性取得手段153は、このようなcarryをバックエッジの定数に置き換える。
inductiveの検出では、計算特性取得手段153は、carryのバックエッジをたどり、ループ内で加減乗算のみが行われているcarryをすべて求める。これらのcarryは、ループを実行する前に、各ループ実行回で取る値が判明するため、ループごとの増分が定められたinductiveという値に置き換える。図18の中間表現では、carry0のバックエッジをたどると、ループ内では定数1の加算のみが行われていることがわかるので、計算特性取得手段153は、carry0をinductiveに置き換える。なお、当該inductiveの検出とは、インダクションの検出のことである。
共通配列の検出では、すべてのメモリアクセス(load/store)のアドレスを調べ、大きな差がなければ同一配列へアクセスするものであるとみなす。これにより、入力プログラムで同一配列へのアクセスしている箇所を、並列プログラムでも同一配列へのアクセスを行うよう変換できるようになる。ここで、アドレスのcomassocである場合、そのcomassocに含まれる値のうち即値定数を除いたものが一致した場合、大きな差がないとし、それ以外を大きな差があるとする。アドレスがcomassocでない場合、計算特性取得手段153は、その値1つだけを持つcomassocを作り、同様の比較を行う。
特殊命令の変換では、計算特性取得手段153は、x86特有の命令について、一般的な形に変換する。「x86特有の命令」とは、x86アーキテクチャにおいて特有のアセンブリ命令のことである。「x86特有の命令」は、例えば、FYL2Xや、FSCALE、FLDZ、FLD1などである。また、「x86特有の命令」は、通常、予め決められている。また、「一般的な形」とは、並列プログラムにおいて容易に表現できる形である。また、「一般的な形」は、通常、予め決められている。x86特有の命令は、これ以降の最適化で扱うことが困難であるため、本手順が必要となる。例えば、計算特性取得手段153は、x86には浮動小数点スタックに1.0をプッシュする命令に対応する中間表現命令を、即値定数1に置き換える。
条件分岐の簡略化では、1つの条件だけで表現可能なphiを、selectに置き換える。図18の中間表現では、条件分岐で異なる値が得られる場合、値は必ずphiとして表現される。しかし、phiは複数の条件を持っており、ダミーコード生成の妨げになることがある。そこで、計算特性取得手段153は、条件を1つしか持たないselectに置き換え、適切なダミーコードを生成できるようにする。
共通部分式除去では、中間表現の要素のうち、全く同じ処理を行っているものを1つにまとめ、残りを除去する。これにより、並列プログラム中で全く同じ処理が行われることを防止する。図18の中間表現では、insn1、insn4、insn5が同じ処理を行っているため、計算特性取得手段153は、insn1だけを残して残りを削除する。
縮約検出では、計算特性取得手段153は、入力配列から、より小さな配列を算出する処理(縮約)を検出する。縮約処理は、通常の並列演算とは異なる手順で行わないと、その実行時間を再現することができないので、本手順が必要となる。縮約処理の例としては、配列に格納された値の総和や総乗、最大値や最小値の算出が挙げられる。計算特性取得手段153は、carryのバックエッジをたどり、carryに対する演算が縮約処理にあたるものであった場合、このcarryをreduction(縮約)値に置き換える。
以上の様な処理により、計算特性取得手段153は、図19に示す新たな中間表現を生成する。
(例3)
本例において、分岐特性と、メモリアドレス特性の取得の例について説明する。
まず、計算特性取得手段153は、入力プログラムから、図16の入力プログラムにおける19行目から23行目の様な条件分岐の部分を検出する。当該検出は、例えば、並列化可能部分検出情報によるものであってもよいし、予め決められていてもよい。通常は、計算特性取得手段153が、条件分岐部分を検出すると予め決められている。
次に、計算特性取得手段153は、検出した条件分岐部分において、then側のブロックと、else側のブロックのそれぞれの先頭に、当該いずれかのブロックに分岐したことを標準出力に出力する関数を挿入する。当該挿入の例は、図20である。図20は、図16の入力プログラムの一部である。
次に、入力プログラム実行手段152は、図20の挿入がなされた入力プログラムを実行する。例えば、当該実行の結果、図20のthen側に分岐した場合、入力プログラムは、「branch to then」を標準出力に出力する。また、図20のelse側に分岐した場合、入力プログラムは、「branch to else」を標準出力に出力する。
次に、計算特性取得手段153は、例えば、「branch」をキーに標準出力の内容を検索し、「then」または「else」を分岐特性として取得する。
次に、計算特性取得手段153は、入力プログラムから、図16の入力プログラムにおける44行目から46行目の様なメモリアクセスの部分を検出する。当該検出は、例えば、並列化可能部分検出情報によるものであってもよいし、予め決められていてもよい。通常は、計算特性取得手段153が、メモリアクセス部分を検出すると予め決められている。
次に、計算特性取得手段153は、検出したメモリアクセス部分において、配列にアクセスするプログラムコードの直前に、当該アクセスされる配列のメモリアドレスを出力する関数を挿入する。当該挿入の位置は、当該プログラムコードの直後であってもよい。当該挿入の例は、図21である。図21は、図16の入力プログラムの一部である。
次に、入力プログラム実行手段152は、図21の挿入がなされた入力プログラムを実行する。例えば、当該実行の結果、配列dの1番目の要素、d[i]に対応するメモリアドレスが「0xbffffa80」である場合、入力プログラムは、「address of d[1] = 0xbffffa80」を標準出力に出力する。
次に、計算特性取得手段153は、例えば、「address of」をキーに標準出力の内容を検索し、「0xbffffa80」をメモリアクセス特性として取得する。
(例4)
本例において、書き換えた中間表現からの並列プログラムの生成の例について説明する。また、以下において説明する行番号は、すべて、図22から図24におけるものである。また、生成する並列プログラムは、並列計算アーキテクチャCUDAで使用される並列計算向け言語「CUDA C」で記述されたものであるものとする。なお、CUDAについては、「http://www.nvidia.co.jp/object/cuda-jp.html」を参照されたい。また、以下、「CUDA C」を「CUDA」と表記する場合もある。
並列プログラムの生成にあたり、まず、元のx86命令を実行し、いくつかのパラメタを取得する。必要なパラメタは、ループが実行された回数と、性能評価の対象となるループの実行前にレジスタやメモリに格納されていた値と、中間表現のメモリアクセス(load/store)のうちランダムアクセスであるものについて、対応するx86命令にて実際にアクセスしたアドレスと、x86の分岐命令で、ジャンプが実行されたかどうかの履歴である。
まず、並列プログラム生成部16は、ループが実行された回数(10行目)と、性能評価の対象となるループの実行前にレジスタやメモリに格納されていた値(12〜26行目)を、マクロとして書き出す。
次に、並列プログラム生成部16は、並列プログラムの本体となるカーネル関数(28〜59行目)を書き出す。カーネル関数の仮引数は、中間表現に含まれる配列と、ランダムアクセスと、条件分岐の数だけ用意する(29〜34行目)。
次に、カーネル関数の内容のうち、ダミー変数の定義(36行目)と、ループインデックスに相当する値の導出(37行目)と、ループ回数の設定(38行目)については、どのような入力に対しても必ず行う。
また、内部の処理は、図19の中間表現をグラフとみなし、storeから深さ優先探索を行うことで出力する。当該グラフは、図25である。
並列プログラム生成部16は、まず、x86命令を事前実行した際に得られたアドレスで、store0とload1の処理を出力する。store0、load1、comassoc2のグラフの形は、CUDAのatomicAddに対応するものなので、最初にcomassoc2のload1以外の参照先としてconstant1を出力する(39行目)。そして、並列プログラム生成部16は、store0とload1に共通する配列(array_1)の事前に記録したインデックス(random_load_map_1)の箇所のアドレスと、constant1(v0)を引数として、atomicAdd関数を呼び出す(40行目)。
次に、並列プログラム生成部16は、アクセスするアドレスの計算処理についても出力し、アドレス計算にかかる負荷を再現する。store0とload1の共通するアドレスであるcomassoc1をたどると、まずconstant1に行きつく。そこで、並列プログラム生成部16は、constant1の値を並列プログラムに出力する(41行目)。
comassoc1からグラフを戻ると、inductive0に当たる。inductiveは、ループが回るごとに増加する値であったので、並列プログラム生成部16は、ループインデックスに係数を掛けた値を出力する(42行目)。
グラフを戻って、まだ探索していない方向をたどると、constant3に当たる。constant3は定数なので、並列プログラム生成部16は、使用されていない変数名「v3」で変数を定義し、この変数を、constant3の値で初期化するコード「int v3 = 0;」を出力する。
以上でcomassoc0から先はすべて探索したので、並列プログラム生成部16は、comassoc0を出力する。並列プログラム生成部16は、通常、ある要素(ノード)から先の探索が終われば、その要素(ノード)を出力する。comassocは加減算を表す中間表現なので、並列プログラム生成部16は、単純に子要素の加算を書き出す(44行目)。例では、減算は行っていないので出力する必要はない。
グラフを戻ると、comassoc0はロードアドレスとして使われていることがわかる。そこで、並列プログラム生成部16は、comassoc0をインデックスとした配列アクセスを出力する(45行目)。
さらにグラフを戻ると、insn0にたどりつく。insn0は8bitから32bitへの整数拡張(sx32_8)なので、並列プログラム生成部16は、単純なキャストとして出力する(47行目)。
さらにグラフを戻り、未探索のノードinsn1に進む。その先のinsn0は探索済みなので、並列プログラム生成部16は、ここでinsn1を出力する。insn1は符号反転する命令(neg32)なので、insn0の値に単項マイナス演算を行う(48行目)。
以上で、select0以降の探索が終わったので、並列プログラム生成部16は、select0を出力する。select0に付属するcondを見ると、対応する分岐履歴と分岐方向がわかるので、これに基づいて3項演算子を出力し、insn0とinsn1のうち、適切なものを選択するようにする(49行目)。
グラフを戻り、未探索のノードconstant4に進む。これは定数なので、並列プログラム生成部16は、そのまま出力する(50行目)。
グラフを戻り、並列プログラム生成部16は、insn2を出力する。insn2は右シフトを行う命令(sha32)なので、並列プログラム生成部16は、select0をconstant4だけ右シフトするコードを生成する(51行目)。
グラフを戻り、未探索のノードconstant5に進む。これは定数なので、並列プログラム生成部16は、そのまま出力する(52行目)。
グラフを戻り、並列プログラム生成部16は、insn3を出力する。insn3は乗算を行う命令(mul32_32)なので、並列プログラム生成部16は、insn2とconstant5の乗算を行うコードを生成する(53行目)。
グラフを戻り、未探索のノードconstant6に進む。これは定数なので、並列プログラム生成部16は、そのまま出力する(54行目)。
グラフを戻り、並列プログラム生成部16は、comassoc1を出力する。comassoc0と同様に、並列プログラム生成部16は、単純に子要素の加算を書き出す(55行目)。
次に、並列プログラム生成部16は、comassoc1の結果をvolatile変数に書き出す(56行目)。これは、CUDAコンパイラによりコンパイルを行った際に、最適化の処理により計算特性に含まれる処理がコンパイラによって削除されてしまい、計算特性を再現することができなくなる可能性があるためである。なお、コンパイラがCUDAコンパイラでない場合であっても、何らかの方法にて、当該最適化によるコードの削除を回避することが必要である。当該何らかの方法とは、上記の様なコードを挿入することなどである。また、これ以降は、40行目のatomicAdd関数として出力しているため、以上がカーネル関数の内容となる。
最後に、main関数内の処理について述べる。main関数内では、ランダムアクセスのインデックス(62〜75行目)や、分岐結果(76〜90行目)を記録した配列を用意し、デバイス側領域を確保して転送する(95〜106行目)。また、配列についてもデバイス側領域の確保を行う(91〜94行目)。
以上の領域とデータを引数として、生成したカーネル関数を実行する。この時、ブロック数とスレッド数について、いくつかの組み合わせについて試行する(108〜125行目)。
以上の様な処理により、並列プログラム生成部16は、図22から図24に示す並列プログラムを生成する。
以上、本実施の形態による実行時間算出装置1によれば、並列化の対象となるプログラムと同等の計算特性を持つ並列プログラムを生成することができる。また、その実行時間を算出することができる。これにより、ユーザは、プログラムを並列化することによりどの程度の高速化が図れるかを事前に知ることができる。
また、例えば、入力プログラムのすべてが並列化可能部分である場合、実行時間算出装置1は、当該入力プログラムに対応する並列プログラムを生成する。当該並列プログラムは、つまりは、入力プログラムのすべてを並列実行が可能なプログラムに書き換えたものである。
また、例えば、入力プログラムが1以上の並列化可能部分を有する場合、実行時間算出装置1は、当該1以上の各並列化可能部分を並列化した並列プログラムを生成する。当該並列プログラムは、つまりは、入力プログラムの一部を並列実行が可能なプログラムに書き換えたものである。
また、本実施の形態において、実行時間算出装置1は、例えば、中間表現生成部14を備えていない実行時間算出装置2であってもよい。この場合の実行時間算出装置2のブロック図を、図28に示す。図28において、実行時間算出装置2は、並列プログラム生成情報格納部11と、受付部13と、並列化可能部分検出部15と、並列プログラム生成部16と、並列プログラム実行部17と、出力部18とを備える。また、並列化可能部分検出部15は、並列化可能部分検出手段151と、入力プログラム実行手段152と、計算特性取得手段153を備える。また、この場合、計算特性取得手段153は、受付部13が受け付けた入力プログラムから、上記の3種類のうちの1種類以上の計算特性を取得する。
また、本実施の形態において、実行時間算出装置1は、例えば、並列プログラム実行部17と、出力部18とを備えていなくてもよい。この場合、ユーザは、並列プログラム生成部16が生成した並列プログラムを得る。また、これにより、ユーザは、アーキテクチャの異なる様々な並列コンピュータ上で当該並列プログラムを実行することにより、当該実行時の実行時間を、入力プログラムを当該各アーキテクチャ向けに並列化した際の実行時間の目安とすることができる。
また、本実施の形態において、実行時間算出装置1は、例えば、中間表現生成部14と、並列プログラム実行部17と、出力部18とを備えていなくてもよい。この場合、ユーザは、並列プログラム生成部16が生成した並列プログラムを得る。また、この場合の効果については、上記と同様であるので、説明を省略する。
また、上記各実施の形態において、一の装置に存在する2以上の通信手段は、物理的に一の媒体で実現されてもよいことは言うまでもない。
また、上記各実施の形態における実行時間算出装置は、例えば、スタンドアロンの装置であってもよいし、サーバ・クライアントシステムにおけるサーバ装置であってもよい。後者の場合には、例えば、ASP(Application Service Provider)として実行時間の算出が行われてもよい。
また、上記各実施の形態において、各処理または各機能は、単一の装置または単一のシステムによって集中処理されることによって実現されてもよいし、あるいは、複数の装置または複数のシステムによって分散処理されることによって実現されてもよい。
また、上記各実施の形態において、各構成要素は専用のハードウェアにより構成されてもよいし、あるいは、ソフトウェアにより実現可能な構成要素については、プログラムを実行することによって実現されてもよい。例えば、ハードディスクや半導体メモリ等の記録媒体に記録されたソフトウェア・プログラムをCPU等のプログラム実行部が読み出して実行することによって、各構成要素が実現され得る。
また、上記各実施の形態における実行時間算出装置を実現するソフトウェアは、例えば、以下のようなプログラムである。つまり、このプログラムは、一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である1以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部にアクセス可能なコンピュータを、入力プログラムを受け付ける受付部と、入力プログラムを受け付ける受付部と、前記1以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成部と、前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、前記並列プログラム実行部が取得した実行時間情報を出力する出力部として機能させるためのプログラムである。
なお、上記プログラムにおいて、上記プログラムが実現する機能には、ハードウェアでしか実現できない機能は含まれない。
また、上記プログラムは、サーバなどからダウンロードされることによって実行されてもよいし、所定の記録媒体(例えば、CD−ROMなどの光ディスクや磁気ディスク、半導体メモリなど)に記録されたプログラムが読み出されることによって実行されてもよい。また、このプログラムは、プログラムプロダクトを構成するプログラムとして用いられてもよい。
また、上記プログラムを実行するコンピュータは、単数であってもよいし、複数であってもよい。つまり、集中処理を行ってもよいし、あるいは分散処理を行ってもよい。
また、図27は、前述のプログラムを実行して、前述の実施の形態の実行時間算出装置等を実現するコンピュータシステム9の概観図である。前述の実施の形態は、コンピュータハードウェア及びその上で実行されるコンピュータプログラムで実現され得る。
図27において、コンピュータシステム9は、CD−ROMドライブ9011、FDドライブ9012を含むコンピュータ901と、キーボード902と、マウス903と、モニタ904とを備える。
図28は、コンピュータシステム9のブロック図である。図28において、コンピュータ901は、CD−ROMドライブ9011、FDドライブ9012に加えて、MPU9013と、ブートアッププログラム等のプログラムを記憶するためのROM9014と、MPU9013に接続され、アプリケーションプログラムの命令を一時的に記憶するとともに一時記憶空間を提供するためのRAM9015と、アプリケーションプログラム、システムプログラム、及びデータを記憶するためのハードディスク9016と、CD−ROMドライブ9011、FDドライブ9012、MPU9013等を相互に接続するバス9017とを備える。ここでは図示しないが、コンピュータ901は、さらに、LANへの接続を提供するネットワークカードを備えていてもよい。
コンピュータシステム9に、前述の実施の形態の実行時間算出装置等の機能を実行させるプログラムは、CD−ROM9101、またはFD9102に記憶されて、CD−ROMドライブ9011またはFDドライブ9012に挿入され、さらにハードディスク9016に転送されてもよい。これに代えて、プログラムは、図示しないネットワークを介してコンピュータ901に送信され、ハードディスク9016に記憶されてもよい。プログラムは実行の際にRAM9015にロードされる。プログラムは、CD−ROM9101、FD9102またはネットワークから直接、ロードされてもよい。
プログラムは、コンピュータ901に、前述の実施の形態の実行時間算出装置等の機能を実行させるオペレーティングシステム(OS)、またはサードパーティープログラム等は、必ずしも含まなくてもよい。プログラムは、制御された態様で適切な機能(モジュール)を呼び出し、所望の結果が得られるようにする命令の部分のみを含んでいればよい。コンピュータシステム9がどのように動作するかは周知であり、詳細な説明は省略する。
本発明は、以上の実施の形態に限定されることなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
1 実行時間算出装置
11 並列プログラム生成情報格納部
12 中間表現生成情報格納部
13 受付部
14 中間表現生成部
15 並列化可能部分検出部
16 並列プログラム生成部
17 並列プログラム実行部
18 出力部
151 並列化可能部分検出手段
152 入力プログラム実行手段
153 計算特性取得手段

Claims (10)

  1. 一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である1以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部と、
    入力プログラムを受け付ける受付部と、
    前記1以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、
    前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成部と、
    前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、
    前記並列プログラム実行部が取得した実行時間情報を出力する出力部とを備える実行時間算出装置。
  2. 前記並列化可能部分検出部は、
    前記1以上の並列プログラム生成情報を用いて、前記入力プログラムから1以上の並列化可能部分を検出する並列化可能部分検出手段と、
    前記並列化可能部分において行われる計算の特性である計算特性を、前記並列化可能部分から検出する計算特性取得手段とを備え、
    前記並列プログラム生成部は、
    前記並列化可能部分を検出した際に用いた並列プログラム生成情報と、前記計算特性取得手段が取得した計算特性とを用いて、前記並列化可能部分に対応する部分並列プログラムを生成することにより、前記並列プログラムを、前記入力プログラムから生成する請求項1記載の実行時間算出装置。
  3. 前記並列プログラム生成情報は、前記入力プログラムを擬似的な命令で表現したものである中間表現から、前記部分並列プログラムを生成するための情報であり、
    前記入力プログラムから中間表現を生成するための情報である1以上の中間表現生成情報が格納される中間表現生成情報格納部と、
    前記1以上の中間表現生成情報を用いて、前記入力プログラムから前記中間表現を生成する中間表現生成部とをさらに備え、
    前記並列プログラム生成部は、
    前記1以上の並列プログラム生成情報を用いて、前記中間表現生成部が生成した中間表現における並列化可能部分に対応する部分並列プログラムを生成することにより、前記並列プログラムを、前記入力プログラムから生成する請求項1または請求項2記載の実行時間算出装置。
  4. 前記計算特性取得手段は、
    前記中間表現生成部が生成した中間表現から、所定の並列化可能部分を計算特性として取得する請求項3記載の実行時間算出装置。
  5. 前記並列プログラム生成情報は、ループ部分に対応する部分並列プログラムを生成するための情報であり、
    前記並列化可能部分検出手段は、
    前記並列プログラム生成情報を用いて、前記入力プログラムから1以上のループ部分を検出し、
    前記計算特性取得手段は、
    前記ループ部分において、ループが実行されるごとに一の値に対して一定数加算または減算する処理の部分、同一配列へのアクセスを行う処理の部分、2以上の値から1つの値を選択する処理の部分のうちのいずれか1以上の処理の部分を計算特性として取得する請求項2から請求項4いずれか一項に記載の実行時間算出装置。
  6. 前記並列化可能部分検出部は、
    前記入力プログラムを実行する入力プログラム実行手段をさらに備え、
    前記計算特性取得手段は、
    前記入力プログラム実行手段による入力プログラムの実行結果から、所定の並列化可能部分の実行結果を計算特性として取得する請求項2から請求項5いずれか一項に記載の実行時間算出装置。
  7. 前記並列プログラム生成情報は、条件分岐部分に対応する部分並列プログラムを生成するための情報であり、
    前記並列化可能部分検出手段は、
    前記並列化可能部分検出情報を用いて、前記入力プログラムから1以上の条件分岐部分を検出し、
    前記計算特性取得手段は、
    前記入力プログラム実行手段による入力プログラムの実行結果から、前記条件分岐部分における分岐の結果を計算特性として取得する請求項6記載の実行時間算出装置。
  8. 前記並列プログラム生成情報は、メモリへのアクセスを行うメモリアクセス部分に対応する部分並列プログラムを生成するための情報であり、
    前記並列化可能部分検出手段は、
    前記並列プログラム生成情報を用いて、前記入力プログラムから1以上のメモリアクセス部分を検出し、
    前記計算特性取得手段は、
    前記入力プログラム実行手段による入力プログラムの実行結果から、前記メモリアクセス部分においてアクセスしたメモリアドレスを計算特性として取得する請求項6または請求項7記載の実行時間算出装置。
  9. 一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である1以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部と、
    受付部と、並列化可能部分検出部と、並列プログラム生成部と、並列プログラム実行部と、出力部とを用いて行われる実行時間算出方法であって、
    前記受付部が、
    入力プログラムを受け付ける受付ステップと、
    前記並列化可能部分検出部が、
    前記1以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出ステップと、
    前記並列プログラム生成部が、
    前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成ステップと、
    前記並列プログラム実行部が、
    前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行ステップと、
    前記出力部が、
    前記並列プログラム実行部が取得した実行時間情報を出力する出力ステップとを備える実行時間算出方法。
  10. 一のプログラムである入力プログラムにおいて並列化が可能であると見込まれる部分である並列化可能部分を検出し、当該並列化可能部分から、当該並列化可能部分に対応するプログラムであり、かつ少なくとも並列実行が可能なダミーのプログラムである部分並列プログラムを生成するための情報である1以上の並列プログラム生成情報が格納される並列プログラム生成情報格納部にアクセス可能なコンピュータを、
    入力プログラムを受け付ける受付部と、
    前記1以上の並列プログラム生成情報を用いて、前記入力プログラムにおける並列化可能部分を検出する並列化可能部分検出部と、
    前記並列化可能部分を検出した際に用いた並列プログラム生成情報を用いて、当該並列化可能部分に対応する部分並列プログラムを生成することにより、当該部分並列プログラムを有するプログラムであり、かつ少なくとも並列実行が可能なプログラムである並列プログラムを、前記入力プログラムから生成する並列プログラム生成部と、
    前記並列プログラム生成部が生成した並列プログラムを実行し、当該実行に要した時間に関する情報である実行時間情報を取得する並列プログラム実行部と、
    前記並列プログラム実行部が取得した実行時間情報を出力する出力部として機能させるためのプログラム。
JP2012251560A 2012-11-15 2012-11-15 実行時間算出装置、実行時間算出方法、およびプログラム Pending JP2014099108A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2012251560A JP2014099108A (ja) 2012-11-15 2012-11-15 実行時間算出装置、実行時間算出方法、およびプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012251560A JP2014099108A (ja) 2012-11-15 2012-11-15 実行時間算出装置、実行時間算出方法、およびプログラム

Publications (1)

Publication Number Publication Date
JP2014099108A true JP2014099108A (ja) 2014-05-29

Family

ID=50941054

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012251560A Pending JP2014099108A (ja) 2012-11-15 2012-11-15 実行時間算出装置、実行時間算出方法、およびプログラム

Country Status (1)

Country Link
JP (1) JP2014099108A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11188438B2 (en) 2018-03-08 2021-11-30 Fujitsu Limited Information processing apparatus, computer-readable recording medium storing program, and information processing method
WO2023233630A1 (ja) * 2022-06-02 2023-12-07 日本電気株式会社 演算装置、演算方法、および、記録媒体

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11188438B2 (en) 2018-03-08 2021-11-30 Fujitsu Limited Information processing apparatus, computer-readable recording medium storing program, and information processing method
WO2023233630A1 (ja) * 2022-06-02 2023-12-07 日本電気株式会社 演算装置、演算方法、および、記録媒体

Similar Documents

Publication Publication Date Title
US20180150742A1 (en) Source code bug prediction
JP6164054B2 (ja) 情報処理装置、コンパイル方法およびコンパイラプログラム
US7917899B2 (en) Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus
CN106471476A (zh) 用于对经优化代码的编辑并继续以及增强的经优化调试的技术
US9256437B2 (en) Code generation method, and information processing apparatus
JP2006350686A (ja) 命令セット・シミュレータ生成装置及びシミュレータ生成方法
JP6432450B2 (ja) 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム
JP2015201119A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP5178852B2 (ja) 情報処理装置およびプログラム
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
JP2014099108A (ja) 実行時間算出装置、実行時間算出方法、およびプログラム
WO2012032807A1 (ja) 実行モジュール最適化装置、実行モジュール最適化方法、およびプログラム
JP4719415B2 (ja) 情報処理システム及びコード生成方法
US10108405B2 (en) Compiling apparatus and compiling method
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
JP2018124877A (ja) コード生成装置、コード生成方法、およびコード生成プログラム
JP2017010123A (ja) コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム
US11734003B2 (en) Non-transitory computer-readable recording medium, compilation method, and compiler device
JP6081144B2 (ja) ソースコード解析装置
JP2019067117A (ja) コード生成装置、コード生成方法及びコード生成プログラム
KR101192438B1 (ko) 자바 프로그램 중간 표현 언어 생성 시스템 및 방법
JP7210917B2 (ja) 検証情報生成装置、検証情報生成方法、及び検証情報生成プログラム
US20220405110A1 (en) Non-transitory computer-readable recording medium and compilation method
JP4788902B2 (ja) コンパイル最適化方法およびコンパイラ
JP2023045347A (ja) プログラムおよび情報処理方法