(57)【特許請求の範囲】
【請求項１】
逐次プログラムコードを実行することにより、前記逐次プログラムコードを並列化して実行した場合の並列トレース情報を生成するトレース生成装置であって、
前記逐次プログラムコードは、
第１スレッドに割り当てられる１つ以上の処理を規定する第１処理コードと、
第２スレッドに割り当てられる１つ以上の処理を規定する第２処理コードと、
それぞれの処理コードより前に挿入され、前記第１及び第２処理コードごとの実行開始を記録するための第１及び第２処理開始記録コードと、
それぞれの処理コードより後に挿入され、前記第１及び第２処理コードごとの実行終了を記録するための第１及び第２処理終了記録コードと、
前記第１処理コードより前に挿入され、前記第１スレッドの実行開始を記録するための第１スレッド開始記録コードと、
前記第１処理コードより後に挿入され、前記第１スレッドの実行終了を記録するための第１スレッド終了記録コードと、
前記第２処理コードより前に挿入され、前記第２スレッドの実行開始を記録するための第２スレッド開始記録コードと、
前記第２処理コードより後に挿入され、前記第２スレッドの実行終了を記録するための第２スレッド終了記録コードとを含み、
前記並列トレース情報は、
前記第１スレッドの実行開始から実行終了までの間に、前記第１スレッドに割り当てられた前記第１処理コードの実行開始と実行終了との前後関係を示す第１順序情報と、
前記第２スレッドの実行開始から実行終了までの間に、前記第２スレッドに割り当てられた前記第２処理コードの実行開始と実行終了との前後関係を示す第２順序情報と、
前記逐次プログラムコードの実行開始から実行終了までの間に、前記第１スレッドの実行開始と実行終了、及び前記第２スレッドの実行開始と実行終了との前後関係を示す第３順序情報とを含むことを特徴とするトレース生成装置。
【請求項２】
前記逐次プログラムコードは、
前記第１処理コードより前に挿入され、前記第２処理コードの実行が終了するまで、前記第１処理コードの実行開始を待機するための同期待ちコードと、
前記第２処理コードより後に挿入され、前記第１処理コードの実行待ちを解除するための同期待ち解除コードとをさらに含み、
前記第１順序情報は、前記第１スレッドに割り当てられた前記第１処理コードの実行開始と実行終了と、前記同期待ちコードの処理タイミングとの前後関係を示し、
前記第２順序情報は、前記第２スレッドに割り当てられた前記第２処理コードの実行開始と実行終了と、前記同期待ち解除コードの処理タイミングとの前後関係を示すことを特徴とする請求項１に記載のトレース生成装置。
【請求項３】
請求項１又は請求項２に記載のトレース生成装置と、
前記並列トレース情報と、前記第１及び第２処理コードごとの実行時間とを用いて、前記逐次プログラムコードを並列化して実行した場合の並列実行情報を生成する実行情報生成装置とを備えるシステムであって、
前記実行情報生成装置は、
（ａ）前記第３順序情報を用いて、前記第１及び第２スレッドの実行開始のタイミングを定め、
（ｂ）前記第１順序情報と前記第１処理コードの実行時間とを用いて、前記第１スレッドの実行時間と前記第１スレッドの実行終了のタイミングとを定め、
（ｃ）前記第２順序情報と前記第２処理コードの実行時間とを用いて、前記第２スレッドの実行時間と前記第２スレッドの実行終了のタイミングとを定め、
（ｄ）前記第１又は第２処理コードの一方の実行終了のタイミングを用いて、他のスレッドの実行開始のタイミングを定め、
前記並列実行情報は、
前記第１スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングと、
前記第２スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングとを含むことを特徴とするシステム。
【請求項４】
請求項２に記載のトレース生成装置と、
前記並列トレース情報と、前記第１及び第２処理コードごとの実行時間とを用いて、前記逐次プログラムコードを並列化して実行した場合の並列実行情報を生成する実行情報生成装置とを備えるシステムであって、
前記実行情報生成装置は、
（ａ）前記第３順序情報を用いて、前記第１及び第２スレッドの実行開始のタイミングを定め、
（ｂ）前記第１順序情報と前記第２順序情報と前記第１処理コードの実行時間とを用いて、前記第１スレッドの実行時間と前記第１スレッドの実行終了のタイミングとを定め、
（ｃ）前記第２順序情報と前記第２処理コードの実行時間とを用いて、前記第２スレッドの実行時間と前記第２スレッドの実行終了のタイミングとを定め、
（ｄ）前記第１又は第２処理コードの一方の実行終了のタイミングを用いて、他のスレッドの実行開始のタイミングを定め、
前記同期待ちコードの処理のタイミングが、前記同期待ち解除コードの処理のタイミングよりも早い場合には、前記第１スレッドの実行時間には、前記同期待ちコードと前記同期待ち解除コードとの処理のタイミングとの差分に応じた待機時間が含まれ、
前記並列実行情報は、
前記第１スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングと、
前記第２スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングとを含むことを特徴とするシステム。
【請求項５】
逐次プログラムコードを生成するプログラム生成装置と、
請求項１又は請求項２に記載のトレース生成装置とを備えるシステムであって、
前記プログラム生成装置は、
前記第１及び第２処理コードを含み、前記第１処理コードの後に前記第２処理コードが位置するプログラムコードに対して、
（ａ）前記第１処理コードより前に、前記第１スレッド開始記録コードを挿入し、
（ｂ）前記第１スレッド開始記録コードより後であって前記第１処理コードの前に、前記第１処理開始記録コードを挿入し、
（ｃ）前記第１処理コードより後であって前記第２処理コードより前に、前記第１処理終了記録コードを挿入し、
（ｄ）前記第１処理終了記録コードより後に、前記第１スレッド終了記録コードを挿入し、
（ｅ）前記第２処理コードより前に、前記第２スレッド開始記録コードを挿入し、
（ｆ）前記第２スレッド開始記録コードより後であって前記第２処理コードより前に、前記第２処理開始記録コードを挿入し、
（ｇ）前記第２処理コードより後に、前記第２処理終了記録コードを挿入し、
（ｈ）前記第２処理終了記録コードより後に、前記第２スレッド終了記録コードを挿入することによって、前記逐次プログラムコードを生成することを特徴とするシステム。
【請求項６】
前記トレース生成装置は、
（ａ）前記第１処理開始記録コードを実行するタイミングと、前記第１処理終了記録コードを実行するタイミングとの差分から、前記第１処理コードの実行時間を定め、
（ｂ）前記第２処理開始記録コードを実行するタイミングと、前記第２処理終了記録コードを実行するタイミングとの差分から、前記第２処理コードの実行時間を定めることを特徴とする請求項１又は請求項２に記載のトレース生成装置。
【請求項７】
コンピュータに、逐次プログラムコードを実行させることにより、前記逐次プログラムコードを並列化して実行した場合の並列トレース情報を生成する機能を実現させるためのトレース生成プログラムであって、
前記逐次プログラムコードは、
第１スレッドに割り当てられる１つ以上の処理を規定する第１処理コードと、
第２スレッドに割り当てられる１つ以上の処理を規定する第２処理コードと、
それぞれの処理コードより前に挿入され、前記第１及び第２処理コードごとの実行開始を記録するための第１及び第２処理開始記録コードと、
それぞれの処理コードより後に挿入され、前記第１及び第２処理コードごとの実行終了を記録するための第１及び第２処理終了記録コードと、
前記第１処理コードより前に挿入され、前記第１スレッドの実行開始を記録するための第１スレッド開始記録コードと、
前記第１処理コードより後に挿入され、前記第１スレッドの実行終了を記録するための第１スレッド終了記録コードと、
前記第２処理コードより前に挿入され、前記第２スレッドの実行開始を記録するための第２スレッド開始記録コードと、
前記第２処理コードより後に挿入され、前記第２スレッドの実行終了を記録するための第２スレッド終了記録コードとを含み、
前記並列トレース情報は、
前記第１スレッドの実行開始から実行終了までの間に、前記第１スレッドに割り当てられた前記第１処理コードの実行開始と実行終了との前後関係を示す第１順序情報と、
前記第２スレッドの実行開始から実行終了までの間に、前記第２スレッドに割り当てられた前記第２処理コードの実行開始と実行終了との前後関係を示す第２順序情報と、
前記逐次プログラムコードの実行開始から実行終了までの間に、前記第１スレッドの実行開始と実行終了、及び前記第２スレッドの実行開始と実行終了との前後関係を示す第３順序情報とを含むことを特徴とするトレース生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、トレースの生成に関する。
【背景技術】
【０００２】
少なくともプログラムコードの一部が、並列実行が可能な複数の処理単位に分割されたプログラムコード（以下、並列プログラムコード）の開発には、多大なコストが必要である。開発の現場では、逐次的に実行するためのプログラムコード（以下、逐次プログラムコード）を並列化して、並列プログラムコードを作成するケースが多い。
【０００３】
このような並列プログラムコードの性能評価は、プログラマがｐ−ｔｈｒｅａｄ等の並列化ライブラリを用いて並列プログラムコードを実際に作成、実行することで行うことができる。しかし、並列コードの作成には多大なコストが必要である。さらに、並列プログラムコードの性能評価の結果、並列化の方針を変更する場合は、再度並列コードを作成しなければならない。
【０００４】
逐次プログラムコードと並列化情報とを用いて、自動的に並列プログラムコードを作成する技術がある（例えば、特許文献１）。しかし、自動的に作成した並列プログラムコードは、セグメンテーションフォルト等で異常終了する場合がある。また、異常終了しない場合であっても、データレース等のバグが制御文の判定等をとおしてプログラムの実行パスにまで影響し、性能評価を正しく行えない場合がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許公開公報  ＵＳ２００５／０１８８３６４
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の一側面は、並列プログラムコードを作成することなく、逐次プログラムコードを並列化して実行した場合のトレースを生成することを目的とする。
【課題を解決するための手段】
【０００７】
上記目的を達成するために、本発明の実施形態に係るトレース生成装置は、逐次プログラムコードを実行することにより、前記逐次プログラムコードを並列化して実行した場合の並列トレース情報を生成する。逐次プログラムコードは、複数の処理コードと、処理コードごとの実行開始と終了を記録するためのコードと、スレッドごとの実行開始と終了を記録するためのコードと、を含む。並列トレース情報は、スレッドの実行順と、スレッドごとの処理コードの実行順とを含む。
【図面の簡単な説明】
【０００８】
【図１】システムの構成例を示す図。
【図２】原プログラムコードと並列化情報の例を示す図。
【図３】評価用プログラムコードの例を示す図。
【図４】原プログラムコードと並列化情報の例を示す図。
【図５】評価用プログラムコードの例を示す図。
【図６】並列トレースの例を示す図。
【図７】逐次トレースの例を示す図。
【図８】シミュレーションの処理を示すフローチャート図。
【図９】並行実行情報の例を示す図。
【図１０】原プログラムコードと並列化情報の例を示す図。
【図１１】比較例に係る評価用プログラムコードの例を示す図。
【図１２】評価用プログラムコードの例を示す図。
【発明を実施するための形態】
【０００９】
以下、本発明の実施形態について説明する。
【００１０】
（第１の実施形態）
図１は、第１実施形態に係るシステム１０を示す図である。このシステム１０は、逐次プログラムコードを並列化して実行した場合の性能を評価（予測）する。このシステム１０では、逐次プログラムコードを評価するに当たり、逐次プログラムコードから並列プログラムコードを作成する必要はない。このシステム１０は、コード生成装置１０と、トレース生成装置２０と、実行情報生成装置３０とを備える。
【００１１】
コード生成装置１０は、並列化情報を用いて、第１逐次プログラムコード（以下、原プログラムコード）を並列化して実行した場合の性能を評価するための第２逐次プログラムコード（以下、評価用プログラムコード）を生成する。コード生成装置１０には、原プログラムコードと、原プログラムコードを並列化するための並列化情報が入力される。評価用プログラムコードは、並列トレース情報を生成するトレース生成装置２０の仕様や、評価用プログラムコードを実行（解釈）する環境（シミュレータ）等に従って生成される。
【００１２】
トレース生成装置２０は、評価用プログラムコードを、実機上や仮想実行環境で実行することにより、並列トレースと逐次トレースとを生成する。トレース生成装置２０は並列トレースと逐次トレースは、評価用プログラムコードが実行される順序等を示す。
【００１３】
実行情報生成装置３０は、並列トレースと逐次トレースとを用いて、並列実行情報を生成する。並列実行情報とは、原プログラムコードを並列化して実行した場合の実行状況に関する情報である。実行情報生成装置３０は、トレース生成装置２０が生成した並列トレースをそのまま用いても良く、プログラマ（ユーザ）によって作成又は修正された並列トレースを用いても良い。
【００１４】
並列トレース及び並列実行情報は、原プログラムコードを並列化して実行した場合の性能を評価するために用いることができる。
【００１５】
図１に示すシステム１０の例は、コード生成装置１０と、トレース生成装置２０と、実行情報生成装置３０とを備える。しかし、第１実施形態に係るシステム１０は、これらの一部のみを備えていても良い。プログラマが評価用プログラムコードを作成するものとし、システム１０は、トレース生成装置２０と、実行情報生成装置３０とを備えていても良い。原プログラムコードを並列化して実行した場合の性能を評価する場合に、並列トレースがあれば十分である場合には、システム１０は、コード生成装置１０とトレース生成装置２０とを備えていても良く、トレース生成装置２０のみを備えていても良い。
【００１６】
コード生成装置１０と、トレース生成装置２０と、実行情報生成装置３０とは、それぞれが別個独立の装置（あるいはツール）であっても良い。コード生成装置１０と、トレース生成装置２０と、実行情報生成装置３０とは、いずれか２以上をまとめた装置（あるいはツール）であっても良い。コード生成装置１０と、トレース生成装置２０と、実行情報生成装置３０とは、それぞれが複数の装置（またはツール）であっても良い。
【００１７】
以下では、各装置の構成及び動作などの詳細を説明する。
【００１８】
原プログラムコードは、逐次的に実行されるプログラムコードであればどのようなものであってもよい。原プログラムコードは、例えば、Ｃ言語や、Ｊａｖａ（登録商標、以下同じ。）言語などのプログラムのソースコードであってもよく、逐次的に実行されるソフトウェアのバイナリ等であってもよい。
【００１９】
並列プログラムコードは、少なくともプログラムコードの一部が、並列実行が可能な複数の処理単位に分割されたプログラムコードである。並列プログラムコードが複数のコアを有するプロセッサで実行される場合、並列プログラムコードで規定される処理は、スレッド（並列処理の単位）ごとに、コア等の計算資源に割り振られる。スレッドとは、コア等の計算資源に割り振られる処理の単位であれば、どのような単位であっても良い。原プログラムコードを並列化する場合には、原プログラムコードに規定される処理は、機能並列やデータ並列等の方法によって、スレッドに割り振られる。
【００２０】
並列化情報は、原プログラムコードをどのように並列化するかが定められればどのようなものであっても良い。並列化情報は、少なくとも区分情報と、区分ＩＤ（Ｉｄｅｎｔｉｆｉｃａｔｉｏｎ）と、スレッド情報と、スレッドＩＤとを含む。区分情報とは、原プログラムコードを、ある処理単位（１つ以上の処理を規定するコード。以下、処理コードと呼ぶ。）ごとに区分するための情報である。区分情報は、例えば、逐次プログラム上でＣ言語のラベルによって処理コードの区分を定めても良い。区分情報は、例えば、逐次プログラムとは別のファイルに、逐次プログラムの行番号を用いて処理コードの区分を定めても良い。区分ＩＤとは、処理コードを一意に識別するための情報である。スレッド情報とは、各処理コードをいずれのスレッド（並列処理の単位）に割り当てるかを定めるための情報である。スレッド情報は、例えば、区分ＩＤを用いて、各処理コードがいずれのスレッドに割り当てられるかを定めても良い。スレッド情報は、例えば、原プログラムコードの行番号を用いて、各処理コードがいずれのスレッドに割り当てられるかを定めてよい。スレッドＩＤとは、スレッドを一意に識別するための情報である。並列化情報は、さらに、実行時のスレッド間の同期関係を指定するための情報（同期情報）を含んでも良い。同期情報は、例えば、ループのインデックスや、データの転送のタイミング等を用いて、処理コード間又はスレッド間の処理の同期関係を定めても良い。同期情報は、例えば、同期（データ転送や排他制御）のためのコードの挿入位置によって、処理コード間又はスレッド間の処理の同期関係を定めても良い。
【００２１】
並列化情報は、プログラマが作成しても良く、ツールによって自動生成しても良く、一部をプログラマが作成し残りをツールで作成しても良い。並列化情報がプログラマによって作成される場合は、原プログラムコードに追記するなど予め規定された言語等で記述しても良く、ＧＵＩから選択しても良く、これらの方法を組み合わせてもよい。並列化情報がツール等によって自動生成される場合には、原プログラムコードの解析結果などに従って、原プログラムコードに並列化情報が追記されても良く、別ファイルが作成されても良い。並列化情報は、ファイルバイナリなどの１つのまとまりでも良く、複数のファイルやバイナリで構成されていても良い。例えば、ｏｐｅｎＭＰでは、原プログラムコードに並列化情報が記述されるため、原プログラムコードと並列化情報とが一体となっている。
【００２２】
コード生成装置１０は、並列化情報を用いて、原プログラムコードから、評価用プログラムコードを生成する。コード生成装置１０は、原プログラムコード（逐次プログラムコード）から、並列プログラムコードを生成可能であっても良い。
【００２３】
コード生成装置１０は、原プログラムコードを構文解析やバイナリ解析を行う。コード生成装置１０は、原プログラムコードをＡＳＴ（Ａｂｓｔｒａｃｔ  Ｓｙｎｔａｘ  Ｔｒｅｅ）等の内部表現に直しても良い。コード生成装置１０は、並列化情報に従い、原プログラムコードに、並列トレースを生成するためのコード（以下記録コードと呼ぶ。例えば、プロファイルを取得するためのＡＰＩ：Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅなど）を挿入することで、評価用プログラムコードを生成する。コード生成装置１０は、原プログラムコードをＡＳＴ等の内部表現へ変換した上で、記録コードを挿入しても良い。コード生成装置１０は、原プログラムコードを内部表現に変換せず、構文解析を行いながら、原プログラムコードへ記録コードを挿入しても良い。
【００２４】
コード生成装置１０は、原プログラムコードに対して、以下の通り記録コードを挿入する。コード生成装置１０は、スレッドごとに、スレッドに割り当てられる１以上の処理コードのいずれよりも前に、スレッドの実行開始を記録するためのスレッド開始記録コード（又はスレッド開始記録ＡＰＩ）を挿入する。コード生成装置１０は、スレッドごとに、スレッドに割り当てられる１以上の処理コードのいずれよりも後に、スレッドの実行終了を記録するためのスレッド終了記録コード（又はスレッド終了記録ＡＰＩ）を挿入する。
【００２５】
スレッド開始記録コード及びスレッド終了記録コードは、スレッドＩＤを、引数やＡＰＩ名等の形式で保持する。スレッド開始記録コード及びスレッド終了記録コードは、ループイタレーション毎に実行されても良く、１つのループにつき１回だけ実行されても良く、それ以外の様々な方式で実行されても良い。これは、プログラマやツールによって、評価用プログラムコード上に指定する記述が追加されてもよく、並列化情報に指定する記述が追加されても良い。また、プログラマによって、ＧＵＩ等で指定されても良い。
【００２６】
コード生成装置１０は、各処理コードよりも前に、各処理コードの実行開始を記録するための処理開始記録コード（又は処理開始記録ＡＰＩ）を挿入する。コード生成装置１０は、各処理コードよりも後に、各処理コードの実行終了を記録するための処理終了記録コード（又は処理終了記録ＡＰＩ）を挿入する。処理開始記録コード及び処理終了記録コードは、区分ＩＤと、その処理コードが属するスレッドＩＤを、引数やＡＰＩ名等の形式で保持する。
【００２７】
コード生成装置１０は、処理コード間又はスレッド間の処理の同期関係を指定するための同期待ちコード、同期待ち解除コードを挿入しても良い。同期待ちコード及び同期待ち解除コードがコンピュータ等によって実行された場合、同期待ちコード又は同期待ち解除コードが実行されたことが記録される。
【００２８】
図２は、原プログラムコード（Ｓｅｑｕｅｎｔｉａｌ  ｃｏｄｅ）と並列化情報（Ｕｓｅｒ  ｄｉｒｅｃｔｉｖｅｓ）の例を示す図である。
【００２９】
原プログラムコード（Ｓｅｑｕｅｎｔｉａｌ  ｃｏｄｅ）は、ｆｏｒループと、ａｄｄ、ｍｕｌ、ｓｕｂ内の処理コードとを含む。ａｄｄ、ｍｕｌ、ｓｕｂの開始と終了を示す括弧｛｝は、区分情報である。ａｄｄ、ｍｕｌ、ｓｕｂは、区分ＩＤである。ａｄｄ、ｍｕｌ、ｓｕｂの開始と終了を示す括弧｛｝内部のコードは、それぞれ処理コードである。
【００３０】
並列化情報（Ｕｓｅｒ  ｄｉｒｅｃｔｉｖｅｓ）は、スレッド情報（Ｆｕｎｃｔｉｏｎａｌ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ））と、同期情報（Ｄｅｆｉｎｅ  ｓｙｎｃ（１））とを含む。「ｆｕｎｃｔｉｏｎａｌ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ）」との記述は、機能分割を行うことと、並列化を行うループ（コード）がインデックスｎのループであることと、１つのループにつき１つのスレッドを生成することとを指定する。スレッド情報（Ｆｕｎｃｔｉｏｎａｌ＿ｓｐｌｉｔｌｏｏｐ（ｎ））の括弧｛｝の内部は、「Ｄｅｆｉｎｅ  ｔｈｒｅａｄ＿１」と「Ｄｅｆｉｎｅ  ｔｈｒｅａｄ＿２」とによって、スレッドを２つ定義する。スレッド情報（Ｆｕｎｃｔｉｏｎａｌ＿ｓｐｌｉｔｌｏｏｐ（ｎ））は、スレッド１（ｔｈｒｅａｄ１）にａｄｄ、ｍｕｌの処理コードが割り当てられること、及びスレッド２（ｔｈｒｅａｄ２）にｓｕｂの処理コードが割り当てられることを定める。「ｔｈｒｅａｄ１」と「ｔｈｒｅａｄ１」は、スレッドＩＤである。
【００３１】
同期情報「Ｄｅｆｉｎｅ  ｓｙｎｃ（１）：ｔｈｒｅａｄ＿１−＞ｔｈｒｅａｄ＿２」との記述は、「ｔｈｒｅａｄ＿１」から「ｔｈｒｅａｄ＿２」に対しての同期を定義する。「ｓｙｎｃ（）」の引数の“１”は、「ｔｈｒｅａｄ＿１」と「ｔｈｒｅａｄ＿２」とのｆｏｒループのイタレーション距離を“１”とすることを定める。イタレーション距離を“１”とは、「ｔｈｒｅａｄ＿２」のｎ回目のイタレーションの実行は、「ｔｈｒｅａｄ＿１」のｎ回目のイタレーションの実行後でなければならないことを示す。
【００３２】
図３は、図２に示す原プログラムコードに対応する評価用プログラムコードを示す図である。図３では、“Ｉｎｓｅｒｔｅｄ”の矢印により指示されるコード（記録コード）が、コード生成部によって追加されたことを示す。
【００３３】
コード生成部は、「ｔｈｒｅａｄ＿１」に割り当てられるａｄｄ、ｍｕｌの処理コードよりも前に、「ｔｈｒｅａｄ＿１」のスレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿１”））を挿入する。コード生成部は、「ｔｈｒｅａｄ＿１」に割り当てられたａｄｄ、ｍｕｌの処理コードよりも後に、「ｔｈｒｅａｄ＿１」のスレッド終了記録コード（ｔｈｒｅａｄ＿ｊｏｉｎ（“ｔｈｒｅａｄ＿１”））を挿入する。並列化情報によって、１つのループに対して１つのスレッドを生成することが定められているため、コード生成部は、ａｄｄ、ｍｕｌの処理コードを含むループの外に、スレッド開始記録コード及びスレッド終了記録コードを挿入する。
【００３４】
並列化情報によって、ループイタレーションごとにスレッドを生成することが定められる場合には、コード生成部は、「ｔｈｒｅａｄ＿１」に割り当てられたａｄｄ、ｍｕｌの処理コードを含むループの中であってａｄｄ、ｍｕｌの処理コードより前にスレッド開始記録コードを、「ｔｈｒｅａｄ＿１」に割り当てられたａｄｄ、ｍｕｌの処理コードを含むループの中であってａｄｄ、ｍｕｌの処理コードより後にスレッド終了記録コードを、を挿入する。
【００３５】
コード生成部は、「ｔｈｒｅａｄ＿２」に割り当てられるｓｕｂの処理コードよりも前に、「ｔｈｒｅａｄ＿２」のスレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿２”））を挿入する。コード生成部は、「ｔｈｒｅａｄ＿２」に割り当てられたｓｕｂの処理コードよりも後に、「ｔｈｒｅａｄ＿２」のスレッド終了記録コード（ｔｈｒｅａｄ＿ｊｏｉｎ（“ｔｈｒｅａｄ＿２”））を挿入する。並列化情報によって、１つのループに対して１つのスレッドを生成することが定められているため、コード生成部は、ｓｕｂの処理コードを含むループの外に、スレッド開始記録コード及びスレッド終了記録コードを挿入する。
【００３６】
並列化情報によって、ループイタレーションごとにスレッドを生成することが定められる場合には、コード生成部は、「ｔｈｒｅａｄ＿２」に割り当てられたｓｕｂの処理コードを含むループの中であってｓｕｂの処理コードより前にスレッド開始記録コードを、「ｔｈｒｅａｄ＿２」に割り当てられたｓｕｂの処理コードを含むループの中であってｓｕｂの処理コードより後にスレッド終了記録コードを、を挿入する。
【００３７】
コード生成部は、ａｄｄの処理コードの前であって、ａｄｄが属するスレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿１”））の後に、ａｄｄの処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”、“ｔｈｒｅａｄ＿１”））を挿入する。コード生成部は、ａｄｄの処理コードの後であって、同一のスレッド（ｔｈｒｅａｄ＿１）に属する後の処理コード（ｍｕｌ）の処理開始記録コードより前に、ａｄｄの処理終了記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”、“ｔｈｒｅａｄ＿１”））を挿入する。
【００３８】
コード生成部は、ｍｕｌの処理コードの前であって、同一のスレッド（ｔｈｒｅａｄ＿１）に属する前の処理コード（ａｄｄ）の処理終了記録コードより後に、ｍｕｌの処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”、“ｔｈｒｅａｄ＿１”））を挿入する。コード生成部は、ｍｕｌの処理コードの後であって、同一のスレッドに属さない次の処理コード（ｓｕｂ）の前に、ｍｕｌの処理終了記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”、“ｔｈｒｅａｄ＿１”））を挿入する。
【００３９】
コード生成部は、ｓｕｂの処理コードの前であって、同一のスレッドに属さない前の処理コード（ｍｕｌ）の後に、ｓｕｂの処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”、“ｔｈｒｅａｄ＿２”））を挿入する。コード生成部は、ｓｕｂの処理コードの後であって、ｓｕｂが属するスレッド終了記録コード（ｔｈｒｅａｄ＿ｊｏｉｎ（“ｔｈｒｅａｄ＿２”））の前に、ｓｕｂの処理終了記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”、“ｔｈｒｅａｄ＿２”））を挿入する。
【００４０】
コード生成部は、ａｄｄの処理コードの処理終了記録コードの後、ｍｕｌの処理コードの処理開始記録コードの前に、同期待ち解除コード（ｓｙｎｃ＿ｐｕｔ（“ｎ”））を、挿入する。コード生成部は、ｍｕｌの処理コードの処理終了記録コードの後、ｓｕｂの処理コードの処理開始記録コードの前に、同期待ちコード（ｓｙｎｃ＿ｇｅｔ（“ｎ”））を、挿入する。同期待ちコード及び同期待ち解除コードの挿入位置は、プログラマが指定してもよいし、ツールによって決定されてもよい。
【００４１】
図４は、原プログラムコード（Ｓｅｑｕｅｎｔｉａｌ  ｃｏｄｅ）と並列化情報（Ｕｓｅｒ  ｄｉｒｅｃｔｉｖｅｓ）の例を示す図である。
【００４２】
原プログラムコード（Ｓｅｑｕｅｎｔｉａｌ  ｃｏｄｅ）は、ｆｏｒループと、ａｄｄ、ｍｕｌ、ｓｕｂ内の処理コードとを含む。ａｄｄ、ｍｕｌ、ｓｕｂの開始と終了を示す括弧｛｝は、区分情報である。ａｄｄ、ｍｕｌ、ｓｕｂは、区分ＩＤである。ａｄｄ、ｍｕｌ、ｓｕｂの開始と終了を示す括弧｛｝内部のコードは、それぞれ処理コードである。
【００４３】
並列化情報（Ｕｓｅｒ  ｄｉｒｅｃｔｉｖｅｓ）は、スレッド情報（Ｄａｔａ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ））を含む。「Ｄａｔａ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ）」との記述は、データ分割を行うことと、並列化を行うループ（コード）がインデックスｎのループであることと、ループにつき１つのスレッドを生成することを指定する。スレッド情報（Ｄａｔａ＿ｓｐｌｉｔｌｏｏｐ（ｎ））の括弧｛｝の内部は、「Ｄｅｆｉｎｅ  ｔｈｒｅａｄ＿１」と「Ｄｅｆｉｎｅ  ｔｈｒｅａｄ＿２」とによって、スレッドを２つ定義する。スレッド情報（Ｄａｔａ＿ｓｐｌｉｔｌｏｏｐ（ｎ））は、スレッド１（ｔｈｒｅａｄ１）に、ループのイタレーション０から４９回まで（インデックスｎが０以上５０未満）のａｄｄ、ｍｕｌ、ｓｕｂの処理コードが割り当てられること、及びスレッド２（ｔｈｒｅａｄ２）に、ループのイタレーション５０から９９回まで（インデックスｎが５０以上１００未満）のａｄｄ、ｍｕｌ、ｓｕｂの処理コードが割り当てられることを定める。「ｔｈｒｅａｄ１」と「ｔｈｒｅａｄ１」は、スレッドＩＤである。
【００４４】
図５は、図４に示す原プログラムコードに対応する評価用プログラムコードを示す図である。図５では、“Ｉｎｓｅｒｔｅｄ”の矢印により指示されるコード（記録コード）が、コード生成部によって追加されたことを示す。
【００４５】
コード生成部が、スレッド開始記録コード及びスレッド終了記録コードを挿入する方法は、図２、図３の例で説明した方法と同様である。コード生成部が、処理開始記録コード及び処理終了記録コードを挿入する位置については、図２、図３の例で説明した方法と同様である。図4、図5の例では、コード生成部は、処理開始記録コード及び処理終了記録コードを挿入するのに加えて、さらに、ループのイタレーション数に応じた記録コードの実行制御を行うための制御コード（ｉｆ文、ｅｌｓｅ  ｉｆ文など）を以下の通り、挿入する。
【００４６】
コード生成部は、ループのイタレーション０から４９回まで（インデックスｎが０以上５０未満）の場合には、「ｔｈｒｅａｄ＿１」に係る処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”，“ｔｈｒｅａｄ＿１”，ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”，“ｔｈｒｅａｄ＿１”，ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”，“ｔｈｒｅａｄ＿１”））が実行されるようにｉｆ文（ｉｆ（０＜＝ｎ＜５０））を挿入する。
【００４７】
コード生成部は、ループのイタレーション５０から９９回まで（インデックスｎが５０以上１００未満）の場合には、「ｔｈｒｅａｄ＿２」に係る処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”，“ｔｈｒｅａｄ＿２”，ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”，“ｔｈｒｅａｄ＿２”，ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”，“ｔｈｒｅａｄ＿２”））が実行されるようにｅｌｓｅ  ｉｆ文（ｅｌｓｅ  ｉｆ（５０＜＝ｎ＜１００））を挿入する。
【００４８】
コード生成部は、ループのイタレーション０から４９回まで（インデックスｎが０以上５０未満）の場合には、「ｔｈｒｅａｄ＿１」に係る処理開始記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”，“ｔｈｒｅａｄ＿１”，ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”，“ｔｈｒｅａｄ＿１”，ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”，“ｔｈｒｅａｄ＿１”））が実行されるようにＩｆ文（ｉｆ（０＜＝ｎ＜５０））を挿入する。
【００４９】
コード生成部は、ループのイタレーション５０から９９回まで（インデックスｎが５０以上１００未満）の場合には、「ｔｈｒｅａｄ＿２」に係る処理開始記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”，“ｔｈｒｅａｄ＿２”，ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”，“ｔｈｒｅａｄ＿２”，ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”，“ｔｈｒｅａｄ＿２”））が実行されるようにｅｌｓｅ  ｉｆ文（ｅｌｓｅ  ｉｆ（５０＜＝ｎ＜１００））を挿入する。
【００５０】
図５の例では、ループのイタレーション数に応じて記録コードの実行制御を行うための制御コードとしてｉｆ文、ｅｌｓｅ  ｉｆ文を用いた例で説明した。しかし、処理開始・終了記録コード（ＡＰＩ）に実行制御機能が含まれていても良い。また、スレッド間の同期をとる方式としてロックを用いた排他制御を使用する場合は、ロックの獲得を記録（プロファイル）するためのコード（ＡＰＩ）「ｌｏｃｋ（）」や、ロックの解放を記録（プロファイル）するためのコード（ＡＰＩ）「ｕｎｌｏｃｋ（）」などを挿入することができる。このように、機能の拡張を行う場合は、拡張する方式に対応するための様々なコード（ＡＰＩ）を追加することができる。
【００５１】
トレース生成装置２０は、評価用プログラムコードを実行する事によって、スレッドごとに、スレッドの実行開始（ｔｈｒｅａｄ＿ｓｐａｗｎ）から実行終了（ｔｈｒｅａｄ＿ｊｏｉｎ）までの間に、スレッドに割り当てられた処理コードの実行開始（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ）と実行終了（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ）との前後関係を示す並列トレース（順序情報）を生成する。トレース生成装置２０は、並列トレースを生成するに当たって、評価用プログラムコードを、実機上で実行しても良く、シミュレータ等の仮想環境で実行しても良い。評価用プログラムコードをシミュレータ等の仮想環境で実行する場合には、仮想環境に、スレッド開始記録コード、スレッド終了記録コード、処理開始記録コード、及び処理終了記録コードの実行を検知するための仕組みを実装しておくことで、トレース生成装置２０は、並列トレースを記録できる。
【００５２】
図６は、並列トレース（Ｐａｒａｌｌｅｌ  ｔｒａｃｅ）の例を示す図である。
【００５３】
トレース生成装置２０は、スレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿１”））を実行する時に、「ｔｈｒｅａｄ＿１」に割り当てられた処理コードの実行開始と実行終了との前後関係を記載するための第１順序情報（Ｔｈｒｅａｄ＿１  ＡＰＩ  ｃａｌｌ  ｔｒａｃｅ）を生成する。
【００５４】
トレース生成装置２０は、「ｔｈｒｅａｄ＿１」に割り当てられたａｄｄ、ｍｕｌの処理コードについての処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ” ，“ｔｈｒｅａｄ＿１”）、ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ” ，“ｔｈｒｅａｄ＿１”））及び処理終了記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ” ，“ｔｈｒｅａｄ＿１”）、ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ” ，“ｔｈｒｅａｄ＿１”））を実行するたびに、時系列順に、処理コードの開始、終了を第１順序情報に記録する。
【００５５】
トレース生成装置２０は、「ｔｈｒｅａｄ＿１」についての同期待ち解除コード（ｓｙｎｃ＿ｇｅｔ（１）、ｓｙｎｃ＿ｇｅｔ（２））を実行するたびに、時系列順に、同期待ちコードの処理を第１順序情報に記録しても良い。
【００５６】
このようにすることで、トレース生成装置２０は、「ｔｈｒｅａｄ＿１」に割り当てられたａｄｄ、ｍｕｌの処理コードについての開始と終了、並びに、同期待ち解除コードの処理の前後関係を、第１順序情報に記載する。
【００５７】
トレース生成装置２０は、スレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿２”））を実行する時に、「ｔｈｒｅａｄ＿２」に割り当てられた処理コードの実行開始と実行終了との前後関係を記載するための第２順序情報（Ｔｈｒｅａｄ＿２  ＡＰＩ  ｃａｌｌ  ｔｒａｃｅ）を生成する。
【００５８】
トレース生成装置２０は、「ｔｈｒｅａｄ＿２」に割り当てられたｓｕｂの処理コードについての処理開始記録コード（ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ” ，“ｔｈｒｅａｄ＿１”））及び処理終了記録コード（ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ” ，“ｔｈｒｅａｄ＿１”））を実行するたびに、時系列順に、処理コードの開始、終了を第２順序情報に記録する。
【００５９】
トレース生成装置２０は、「ｔｈｒｅａｄ＿２」についての同期待ちコード（ｓｙｎｃ＿ｇｅｔ（１）、ｓｙｎｃ＿ｇｅｔ（２））を実行するたびに、時系列順に、同期待ちコードの処理を第２順序情報に記録する。
【００６０】
このようにすることで、トレース生成装置２０は、「ｔｈｒｅａｄ＿２」に割り当てられたｓｕｂの処理コードについての開始と終了、並びに、同期待ちコードの処理の前後関係を、第２順序情報に記載する。
【００６１】
トレース生成装置２０は、スレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿１”））を実行する時に、各スレッドの実行開始と実行終了との前後関係を記載するための第３順序情報（図示せず）を生成する。
【００６２】
トレース生成装置２０は、スレッド開始記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿１”）、ｔｈｒｅａｄ＿ｓｐａｗｎ（“ｔｈｒｅａｄ＿２”））及び、スレッド終了記録コード（ｔｈｒｅａｄ＿ｊｏｉｎ（“ｔｈｒｅａｄ＿１”）、ｔｈｒｅａｄ＿ｊｏｉｎ（“ｔｈｒｅａｄ＿２”））を実行するたびに、時系列順に、スレッドの開始と終了を第３順序情報に記録する。
【００６３】
トレース生成装置２０は、並列トレースを、テキストファイルやバイナリファイルなどで生成しても良く、記録コードが内部的に論理キューなどをメモリ上に確保し、論理キューに記録コードの実行をエンキューしていくことで生成しても良い。
【００６４】
図７は、逐次トレース（ｓｅｑｕｅｎｃｔｉａｌ  ｔｒａｃｅ）の例を示す図である。トレース生成装置２０は、評価用プログラムコードを実行する事によって、処理コードごとの実行情報を示す逐次トレースを生成する。図７に示す逐次トレースは、ａｄｄ、ｍｕｌ、ｓｕｂの処理コ−ドごとに、実行時間の平均時間１５０、３０、１００を有する。
【００６５】
逐次トレースは、各処理コードの実行情報を示す情報である。逐次トレースは、少なくとも各処理コードの実行時間を含む。逐次トレースは、処理コードごとに、同期待ちコード、同期待ち解除コードの実行タイミングや、同期のための待ち時間、メモリアクセストレース、キャッシュアクセス回数、キャッシュミス回数、バスのアクセス回数、バス使用の衝突回数、その他ハードウェア資源に関する情報を含んでいても良い。
【００６６】
トレース生成装置２０は、例えば、実機上で評価用プログラムコードを実行し、処理コードごとに、処理開始コードが実行されたときの時刻と、処理終了コードが実行されたときの時刻とを、ＯＳのＡＰＩ等を用いて記録することで、各処理コードの実行時間を定める。このように取得された各処理コードの実行時間は、１回（ループのイタレーション１回分）の実行時間である。評価用プログラムコードをすべて実行したときのある処理コードの実行時間の和を、実行回数（ループのイタレーション回数）で除算することで、トレース生成装置２０は、各処理コードの平均実行時間（図７）を定める事ができる。
【００６７】
逐次トレースに含まれる各処理コードの実行時間は、すべての平均であっても良く、処理コードを実行するたびに記録されても良く、処理コードの実行回数をある程度毎の粒度でまとめて記録してもよい。逐次トレースは、例えば、何回目の関数呼び出し後の処理コードの実行であるかについての情報など、より詳細な実行時の情報をふくんでいても良い。
【００６８】
逐次トレースに含まれる各処理コードの実行時間は、評価用プログラムコードを実機上で実行して計測されても良く、シミュレータ等の仮想環境で計測されても良く、プログラマによって予め与えられても良い。逐次トレースに含まれうるキャッシュ情報などは、ＬＳＩが提供するパフォーマンスモニタ機能によっても取得されても良い。
【００６９】
逐次トレースに含まれる各処理コードの実行時間は、原プログラムコードに、処理開始記録コード及び処理終了記録コードが挿入された逐次トレースを取得するためのプログラムコードを実行することで計測されても良い。
【００７０】
実行情報生成装置３０は、並列トレースと逐次トレースを用いて、並列実行情報を生成する。並列実行情報は、原プログラムコードを並列化して実行した場合の実行情報（予測値）である。並列実行情報は、少なくとも、各スレッドの実行時間と、スレッド内の各処理コードの実行時間とを含む。並列実行情報は、スレッド内の同期のための待機時間をさらに含んでも良い。並列実行情報は、スレッドごとに、同期待ちコード、同期待ち解除コードの実行タイミングや、キャッシュアクセス回数、キャッシュミス回数、バスのアクセス回数、バス使用の衝突回数、その他ハードウェア資源情報、データレース検出結果、その他バグ情報、を含んでも良い。並列実行情報は、波形ファイルなどによって視覚的に表示されても良く、テキストファイルで表示されても良い。
【００７１】
実行情報生成装置３０は、並列トレースに記録されたスレッドの開始及び終了や、処理コードの開始及び終了、同期待ちコード及び同期待ち解除コードの処理に応じて、シミュレーションＡＰＩを呼び出して、並列実行情報を生成する。シミュレーションＡＰＩとは、並列実行のシミュレーションを行い、その結果を出力する機能をもったＡＰＩである。
【００７２】
図８は、実行情報生成装置３０の動作を示すフローチャートである。
【００７３】
図９は、並列実行情報の例を示す図である。
【００７４】
以下では、実行情報生成装置３０は、図６に示す並列トレースと図７に示す逐次トレースとを用いて、図８に示す動作に従って、図９に示す並列実行情報を生成することについて説明する。
【００７５】
まず、実行情報生成装置３０は、並列トレース（第１順序情報）から「ｔｈｒｅａｄ＿１」内の記録コード（ｔｈｒｅａｄ＿ｓｐａｗｎ（））を読み出す（ステップＳ１０１、Ｓ１０２）。実行情報生成装置３０は、「ｔｈｒｅａｄ＿１」のローカルな時刻を“０”に設定する（ステップＳ１０４）。実行情報生成装置３０は、第１順序情報から「ｔｈｒｅａｄ＿ｓｐａｗｎ（）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００７６】
次に、実行情報生成装置３０は、第１順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”）」とを読み出す（ステップＳ１０２）。実行情報生成装置３０は、逐次トレースから、ａｄｄの処理コードの実行時間１５０を読み出す。実行情報生成装置３０は、「ｔｈｒｅａｄ＿１」のローカルな時刻を、ａｄｄの処理コードの実行時間１５０だけ進める（ステップＳ１０６）。実行情報生成装置３０は、第１順序情報から「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”）」とを削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００７７】
次に、実行情報生成装置３０は、第１順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”）」とを読み出す（ステップＳ１０２）。実行情報生成装置３０は、逐次トレースから、ｍｕｌの処理コードの実行時間３０を読み出す。実行情報生成装置３０は、「ｔｈｒｅａｄ＿１」のローカルな時刻を、ｍｕｌの処理コードの実行時間３０だけ進める（ステップＳ１０６）。実行情報生成装置３０は、第１順序情報から「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”）」とを削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００７８】
次に、実行情報生成装置３０は、第１順序情報から、同期待ち解除コード「ｓｙｎｃ＿ｐｕｔ（１）」を読み出す（ステップＳ１０２、Ｓ１０３、Ｓ１０７の“いいえ”）。この「ｔｈｒｅａｄ＿１」の同期解除コードは、「ｔｈｒｅａｄ＿２」の同期待ち待ち解除コードに対応するものである。実行情報生成装置３０は、並列トレースの第１順序情報から第２順序情報へ読み出しもとを切り替える（ステップＳ１０１）。実行情報生成装置３０は、第１順序情報から、「ｓｙｎｃ＿ｐｕｔ（１）」を削除する。
【００７９】
次に、実行情報生成装置３０は、並列トレース（第２順序情報）から、「ｔｈｒｅａｄ＿ｓｐａｗｎ（）」を読み出し（ステップＳ１０２）、「ｔｈｒｅａｄ＿２」のローカルな時刻を、“０”に設定する（ステップＳ１０４）。実行情報生成装置３０は、第２順序情報から「ｔｈｒｅａｄ＿ｓｐａｗｎ（）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８０】
次に、実行情報生成装置３０は、第２順序情報から「ｓｙｎｃ＿ｇｅｔ（１）」を読み出す（ステップＳ１０２）。実行情報生成装置３０は、「ｔｈｒｅａｄ＿２」のローカルな時刻を、「ｔｈｒｅａｄ＿１」のローカルな時刻１８０へ進める（ステップＳ１０３、Ｓ１０７の“はい”）。実行情報生成装置３０は、第２順序情報から「ｓｙｎｃ＿ｇｅｔ（１）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８１】
次に、実行情報生成装置３０は、第２順序情報から「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”）」とを読み出す（ステップＳ１０２）。実行情報生成装置３０は、逐次トレースから、ｓｕｂの処理コードの実行時間１００を読み出す。実行情報生成装置３０は、「ｔｈｒｅａｄ＿２」のローカルな時刻を、ｓｕｂの処理コードの実行時間１００だけ進める（ステップＳ１０６）。実行情報生成装置３０は、第２順序情報から「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８２】
次に、実行情報生成装置３０は、第２順序情報から同期待ちコード「ｓｙｎｃ＿ｇｅｔ（２）」を読み出す（ステップＳ１０２、Ｓ１０３、Ｓ１０７の“いいえ”）。この「ｔｈｒｅａｄ＿２」の同期待ちコード「ｓｙｎｃ＿ｇｅｔ（２）」は、「ｔｈｒｅａｄ＿１」の同期待ち解除コード「ｓｙｎｃ＿ｐｕｔ（２）」に対応するものである。「ｔｈｒｅａｄ＿１」の同期待ち解除コード「ｓｙｎｃ＿ｐｕｔ（２）」は、まだ実行されていない。実行情報生成装置３０は、並列トレースの第２順序情報から第１順序情報へ読み出しもとを切り替える（ステップＳ１０１）。ここでは、実行情報生成装置３０は、第２順序情報から、「ｓｙｎｃ＿ｇｅｔ（２）」を削除しない。
【００８３】
次に、実行情報生成装置３０は、第１順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”）」を読み出し（ステップＳ１０２）、同様に、「ｔｈｒｅａｄ＿１」のローカルな時間をａｄｄの処理コードの実行時間１５０だけ進める（ステップＳ１０６）。実行情報生成装置３０は、第１順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ａｄｄ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ａｄｄ”）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８４】
次に、実行情報生成装置３０は、第１順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”）」を読み出し（ステップＳ１０２）、同様に、「ｔｈｒｅａｄ＿１」のローカルな時間をｍｕｌの処理コードの実行時間３０だけ進める（ステップＳ１０６）。実行情報生成装置３０は、第１順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｍｕｌ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｍｕｌ”）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８５】
次に、実行情報生成装置３０は、第１順序情報から、同期待ち解除コード「ｓｙｎｃ＿ｐｕｔ（２）」を読み出す（ステップＳ１０２、Ｓ１０３、Ｓ１０７の“いいえ”）。この「ｔｈｒｅａｄ＿１」の同期解除コードは、「ｔｈｒｅａｄ＿２」の同期待ち待ち解除コードに対応するものである。実行情報生成装置３０は、並列トレースの第１順序情報から第２順序情報へ読み出しもとを切り替える（ステップＳ１０１）。実行情報生成装置３０は、第１順序情報から、「ｓｙｎｃ＿ｐｕｔ（２）」を削除する。
【００８６】
次に、実行情報生成装置３０は、第２順序情報から「ｓｙｎｃ＿ｇｅｔ（２）」を読み出す（ステップＳ１０２）。実行情報生成装置３０は、「ｔｈｒｅａｄ＿２」のローカルな時刻を、「ｔｈｒｅａｄ＿１」のローカルな時刻３６０へ進める（ステップＳ１０３、Ｓ１０７の“はい”）。実行情報生成装置３０は、第２順序情報から「ｓｙｎｃ＿ｇｅｔ（２）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８７】
次に、実行情報生成装置３０は、第２順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”）」を読み出し（ステップＳ１０２）、同様に、「ｔｈｒｅａｄ＿２」のローカルな時間をｓｕｂの処理コードの実行時間１００だけ進める（ステップＳ１０６）。実行情報生成装置３０は、第２順序情報から、「ｓｅｃｔｉｏｎ＿ｅｎｔｅｒ（“ｓｕｂ”）」と「ｓｅｃｔｉｏｎ＿ｌｅａｖｅ（“ｓｕｂ”）」を削除する（ステップＳ１０８、Ｓ１０９の“有り”）。
【００８８】
次に、実行情報生成装置３０は、第２順序情報から、「ｔｈｒｅａｄ＿ｊｏｉｎ（）」を読み出す（ステップＳ１０２、Ｓ１０５）。実行情報生成装置３０は、第２順序情報から、「ｔｈｒｅａｄ＿ｊｏｉｎ（）」を削除する（ステップＳ１０８）。実行情報生成装置３０は、「ｔｈｒｅａｄ＿２」のシミュレーションを終了する（ステップＳ１０９の“無し”）。実行情報生成装置３０は、並列トレースの第２順序情報から第１順序情報へ読み出しもとを切り替える（ステップＳ１１０の“有り”、Ｓ１０１）。
【００８９】
次に、実行情報生成装置３０は、第１順序情報から、「ｔｈｒｅａｄ＿ｊｏｉｎ（）」を読み出す（ステップＳ１０２、Ｓ１０５）。実行情報生成装置３０は、第１順序情報から、「ｔｈｒｅａｄ＿ｊｏｉｎ（）」を削除する（ステップＳ１０８）。実行情報生成装置３０は、「ｔｈｒｅａｄ＿１」のシミュレーションを終了する（ステップＳ１０９の“無し”）。
【００９０】
以上の処理によって、実行情報生成装置３０は、「ｔｈｒｅａｄ＿１」と「ｔｈｒｅａｄ＿２」についてのシミュレーションを終了し（ステップＳ１１０の“無し”）、図９に示す並列実行情報を生成する。なお、上記例は、単純なモデルでのシミュレーション例を示したが、より複雑なモデルでのシミュレーションを行うことができる。例えば、今回の例では「ｔｈｒｅａｄ＿ｊｏｉｎ（）」でのスレッド間の待ち合わせ処理はシミュレーションしなかったため、「ｔｈｒｅａｄ＿ｓｐａｗｎ（）」と「ｔｈｒｅａｄ＿ｊｏｉｎ（）」の呼び出しトレースには情報としての意味がない。しかしながら、より複雑なプログラム(特に、上記記載の処理に続いてスレッドの発行が行われる場合など)では、「ｔｈｒｅａｄ＿ｊｏｉｎ（）」でのスレッド間の待ち合わせ(例えばバリア同期など)もシミュレーションすることができる。このようなシミュレーションを行うために、「ｔｈｒｅａｄ＿ｓｐａｗｎ（）」と「ｔｈｒｅａｄ＿ｊｏｉｎ（）」のトレース情報が必要となる。
【００９１】
第１の実施形態に係るシステム１０によれば、並列プログラムコードを作成することなく、逐次プログラムコード（原プログラムコード）を並列化して実行した場合の並列トレースを取得できる。並列プログラムコードを作成することなく、原プログラムコードを並列化して実行した場合の並列実行情報を取得できる。
【００９２】
並列トレース及び並列実行情報を取得するために、並列プログラムコードの作成を行う必要がなく、並列プログラムコードの開発の負荷、コストを大幅に削減できる。逐次プログラムコード（原プログラムコード）を並列化して実行した場合の性能を早期に予測できるため、逐次プログラムコード及び並列化の方針（並列化情報）の試行錯誤を迅速に行うことができ、高性能な並列プログラムコードを開発できる。
【００９３】
以下では、比較例を用いて、第１の実施形態に係るシステム１０の効果について説明する。
【００９４】
図１０は、問題を発生させうる逐次プログラムコード（ｓｅｑｕｅｎｔｉａｌ  ｃｏｄｅ）と並列化情報（Ｕｓｅｒ  ｄｉｒｅｃｔｉｖｅｓ）の例を示す図である。
【００９５】
逐次プログラムコードは、ｓｅｔとｃａｌに係る処理コ−ドと、区分ＩＤ（ｓｅｔ、ｃａｌ）と、を含む。並列化情報のｆｕｎｃｔｉｏｎａｌ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ）という記述は、機能分割を行うことと、並列化を行うループ（コード）がインデックスｎのループであることと、１つのループにつき１つのスレッドを生成することを指定する。Ｆｕｎｃｔｉｏａｌ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ）の括弧｛｝は、「Ｄｅｆｉｎｅ  ｔｈｒｅａｄ＿１」と「Ｄｅｆｉｎｅ  ｔｈｒｅａｄ＿２」により、２つのスレッドを定義する。スレッドＩＤは、「ｔｈｒｅａｄ＿１」と「ｔｈｒｅａｄ＿２」である。並列化情報（Ｆｕｎｃｔｉｏａｌ＿ｓｐｌｉｔ  ｌｏｏｐ（ｎ））は、「ｔｈｒｅａｄ＿１」にｓｅｔの処理コードを、「ｔｈｒｅａｄ＿２」にｃａｌの処理コードをそれぞれ割り当てる。
【００９６】
図１１は、比較例に係る方法によって、図１０に示す逐次プログラムコードを、図１０に示す並列化情報に従って生成した評価用プログラムコードを示す図である。図１１では、「ｔｈｒｅａｄ＿１」でポインタｐ＿Ｍ［ｉ］に値が代入される。「ｔｈｒｅａｄ＿２」でｐ＿Ｍ［ｉ］のポインタの参照先変数の計算が行われる。
【００９７】
図１０の逐次プログラムコードにおいては、同一のループイタレーションに属するｓｅｔの処理コードとｃａｌの処理コードの計算順序は、ｓｅｔの処理コードが終了してからｃａｌの処理コードの処理がなされることが保証されている。しかしながら、図１１の並列プログラムコードにおいては、「ｔｈｒｅａｄ＿１」と「ｔｈｒｅａｄ＿２」で同期関係が定義されておらず、同一のループイタレーションに属するｓｅｔの処理コードとｃａｌの処理コードの実行順序は保証されていない。
【００９８】
したがって、同一イタレーションに属するｓｅｔの処理コードが実行される前にｃａｌの処理コードが実行されることがある。この場合、ｎｕｌｌポインタアクセスとなり、プログラムが異常終了してしまうため、図１０の逐次プログラムコードを並列化して実行した場合の性能評価が行えない。
【００９９】
図１２は、第１の実施形態に係るシステム１０が、図１０に示す逐次プログラムコードを、図１０に示す並列化情報に従って生成した評価用プログラムコードを示す図である。
【０１００】
図１２の評価用プログラムコードにおいては、図１０に示す変換前の逐次プログラムコードと同様に、同一のループイタレーションのｓｅｔの処理コードとｃａｌの処理コードの実行順序が保証されている。したがって、異常終了することなく実行可能であり、上記に説明した通りの方法で、並列プログラムコードを生成することなく、並列トレース等を取得できる。
【０１０１】
このように、第１の実施形態に係るシステム１０は、いかなる原プログラムコード（逐次プログラムコード）と並列化情報の組み合わせにおいても、これらから評価用プログラムコードを生成し、評価用プログラムコードから並列トレースを取得することができる。
【０１０２】
第１の実施形態に係るシステム１０は、いかなる原プログラムコードと並列化情報の組み合わせにおいても、並列プログラムコードを生成することなく、原プログラムコードを並列化して実行した場合の並列トレース、並列実行情報を取得できる。
【０１０３】
なお、このシステム１０は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、コード生成装置１０、トレース生成装置２０、および実行情報生成装置３０は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。また、このシステム１０は、１）トレース生成装置２０のみ、２）コード生成装置１０とトレース生成装置２０、又は３）トレース生成装置２０と実行情報生成装置３０のいずれかを、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、コード生成装置１０、トレース生成装置２０、および実行情報生成装置３０は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、ＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。また、コード生成装置１０、トレース生成装置２０、および実行情報生成装置３０に内蔵されるメモリは、上記のコンピュータ装置に内蔵あるいは外付けされたメモリ、ハードディスクもしくはＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒなどの記憶媒体などを適宜利用して実現することができる。
【０１０４】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。
【符号の説明】
【０１０５】
１・・・システム
１０・・・コード生成装置
２０・・・トレース生成装置
３０・・・実行情報生成装置
【図１】
0005139486.tif 000002
【図２】
0005139486.tif 000003
【図３】
0005139486.tif 000004
【図４】
0005139486.tif 000005
【図５】
0005139486.tif 000006
【図６】
0005139486.tif 000007
【図７】
0005139486.tif 000008
【図８】
0005139486.tif 000009
【図９】
0005139486.tif 000010
【図１０】
0005139486.tif 000011
【図１１】
0005139486.tif 000012
【図１２】
0005139486.tif 000013