JP5139486B2 - トレース生成装置、システム、およびそのプログラム - Google Patents

トレース生成装置、システム、およびそのプログラム Download PDF

Info

Publication number
JP5139486B2
JP5139486B2 JP2010192735A JP2010192735A JP5139486B2 JP 5139486 B2 JP5139486 B2 JP 5139486B2 JP 2010192735 A JP2010192735 A JP 2010192735A JP 2010192735 A JP2010192735 A JP 2010192735A JP 5139486 B2 JP5139486 B2 JP 5139486B2
Authority
JP
Japan
Prior art keywords
code
thread
execution
processing
recording
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.)
Expired - Fee Related
Application number
JP2010192735A
Other languages
English (en)
Other versions
JP2012048661A (ja
Inventor
進 武田
秀則 松崎
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.)
Toshiba Corp
Original Assignee
Toshiba 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 Toshiba Corp filed Critical Toshiba Corp
Priority to JP2010192735A priority Critical patent/JP5139486B2/ja
Priority to US13/042,553 priority patent/US9152389B2/en
Publication of JP2012048661A publication Critical patent/JP2012048661A/ja
Application granted granted Critical
Publication of JP5139486B2 publication Critical patent/JP5139486B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/314Parallel programming languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3404Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for parallel or distributed programming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • G06F11/3419Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment by assessing time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3457Performance evaluation by simulation
    • G06F11/3461Trace driven simulation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明の実施形態は、トレースの生成に関する。
少なくともプログラムコードの一部が、並列実行が可能な複数の処理単位に分割されたプログラムコード(以下、並列プログラムコード)の開発には、多大なコストが必要である。開発の現場では、逐次的に実行するためのプログラムコード(以下、逐次プログラムコード)を並列化して、並列プログラムコードを作成するケースが多い。
このような並列プログラムコードの性能評価は、プログラマがp−thread等の並列化ライブラリを用いて並列プログラムコードを実際に作成、実行することで行うことができる。しかし、並列コードの作成には多大なコストが必要である。さらに、並列プログラムコードの性能評価の結果、並列化の方針を変更する場合は、再度並列コードを作成しなければならない。
逐次プログラムコードと並列化情報とを用いて、自動的に並列プログラムコードを作成する技術がある(例えば、特許文献1)。しかし、自動的に作成した並列プログラムコードは、セグメンテーションフォルト等で異常終了する場合がある。また、異常終了しない場合であっても、データレース等のバグが制御文の判定等をとおしてプログラムの実行パスにまで影響し、性能評価を正しく行えない場合がある。
米国特許公開公報 US2005/0188364
本発明の一側面は、並列プログラムコードを作成することなく、逐次プログラムコードを並列化して実行した場合のトレースを生成することを目的とする。
上記目的を達成するために、本発明の実施形態に係るトレース生成装置は、逐次プログラムコードを実行することにより、前記逐次プログラムコードを並列化して実行した場合の並列トレース情報を生成する。逐次プログラムコードは、複数の処理コードと、処理コードごとの実行開始と終了を記録するためのコードと、スレッドごとの実行開始と終了を記録するためのコードと、を含む。並列トレース情報は、スレッドの実行順と、スレッドごとの処理コードの実行順とを含む。
システムの構成例を示す図。 原プログラムコードと並列化情報の例を示す図。 評価用プログラムコードの例を示す図。 原プログラムコードと並列化情報の例を示す図。 評価用プログラムコードの例を示す図。 並列トレースの例を示す図。 逐次トレースの例を示す図。 シミュレーションの処理を示すフローチャート図。 並行実行情報の例を示す図。 原プログラムコードと並列化情報の例を示す図。 比較例に係る評価用プログラムコードの例を示す図。 評価用プログラムコードの例を示す図。
以下、本発明の実施形態について説明する。
(第1の実施形態)
図1は、第1実施形態に係るシステム10を示す図である。このシステム10は、逐次プログラムコードを並列化して実行した場合の性能を評価(予測)する。このシステム10では、逐次プログラムコードを評価するに当たり、逐次プログラムコードから並列プログラムコードを作成する必要はない。このシステム10は、コード生成装置10と、トレース生成装置20と、実行情報生成装置30とを備える。
コード生成装置10は、並列化情報を用いて、第1逐次プログラムコード(以下、原プログラムコード)を並列化して実行した場合の性能を評価するための第2逐次プログラムコード(以下、評価用プログラムコード)を生成する。コード生成装置10には、原プログラムコードと、原プログラムコードを並列化するための並列化情報が入力される。評価用プログラムコードは、並列トレース情報を生成するトレース生成装置20の仕様や、評価用プログラムコードを実行(解釈)する環境(シミュレータ)等に従って生成される。
トレース生成装置20は、評価用プログラムコードを、実機上や仮想実行環境で実行することにより、並列トレースと逐次トレースとを生成する。トレース生成装置20は並列トレースと逐次トレースは、評価用プログラムコードが実行される順序等を示す。
実行情報生成装置30は、並列トレースと逐次トレースとを用いて、並列実行情報を生成する。並列実行情報とは、原プログラムコードを並列化して実行した場合の実行状況に関する情報である。実行情報生成装置30は、トレース生成装置20が生成した並列トレースをそのまま用いても良く、プログラマ(ユーザ)によって作成又は修正された並列トレースを用いても良い。
並列トレース及び並列実行情報は、原プログラムコードを並列化して実行した場合の性能を評価するために用いることができる。
図1に示すシステム10の例は、コード生成装置10と、トレース生成装置20と、実行情報生成装置30とを備える。しかし、第1実施形態に係るシステム10は、これらの一部のみを備えていても良い。プログラマが評価用プログラムコードを作成するものとし、システム10は、トレース生成装置20と、実行情報生成装置30とを備えていても良い。原プログラムコードを並列化して実行した場合の性能を評価する場合に、並列トレースがあれば十分である場合には、システム10は、コード生成装置10とトレース生成装置20とを備えていても良く、トレース生成装置20のみを備えていても良い。
コード生成装置10と、トレース生成装置20と、実行情報生成装置30とは、それぞれが別個独立の装置(あるいはツール)であっても良い。コード生成装置10と、トレース生成装置20と、実行情報生成装置30とは、いずれか2以上をまとめた装置(あるいはツール)であっても良い。コード生成装置10と、トレース生成装置20と、実行情報生成装置30とは、それぞれが複数の装置(またはツール)であっても良い。
以下では、各装置の構成及び動作などの詳細を説明する。
原プログラムコードは、逐次的に実行されるプログラムコードであればどのようなものであってもよい。原プログラムコードは、例えば、C言語や、Java(登録商標、以下同じ。)言語などのプログラムのソースコードであってもよく、逐次的に実行されるソフトウェアのバイナリ等であってもよい。
並列プログラムコードは、少なくともプログラムコードの一部が、並列実行が可能な複数の処理単位に分割されたプログラムコードである。並列プログラムコードが複数のコアを有するプロセッサで実行される場合、並列プログラムコードで規定される処理は、スレッド(並列処理の単位)ごとに、コア等の計算資源に割り振られる。スレッドとは、コア等の計算資源に割り振られる処理の単位であれば、どのような単位であっても良い。原プログラムコードを並列化する場合には、原プログラムコードに規定される処理は、機能並列やデータ並列等の方法によって、スレッドに割り振られる。
並列化情報は、原プログラムコードをどのように並列化するかが定められればどのようなものであっても良い。並列化情報は、少なくとも区分情報と、区分ID(Identification)と、スレッド情報と、スレッドIDとを含む。区分情報とは、原プログラムコードを、ある処理単位(1つ以上の処理を規定するコード。以下、処理コードと呼ぶ。)ごとに区分するための情報である。区分情報は、例えば、逐次プログラム上でC言語のラベルによって処理コードの区分を定めても良い。区分情報は、例えば、逐次プログラムとは別のファイルに、逐次プログラムの行番号を用いて処理コードの区分を定めても良い。区分IDとは、処理コードを一意に識別するための情報である。スレッド情報とは、各処理コードをいずれのスレッド(並列処理の単位)に割り当てるかを定めるための情報である。スレッド情報は、例えば、区分IDを用いて、各処理コードがいずれのスレッドに割り当てられるかを定めても良い。スレッド情報は、例えば、原プログラムコードの行番号を用いて、各処理コードがいずれのスレッドに割り当てられるかを定めてよい。スレッドIDとは、スレッドを一意に識別するための情報である。並列化情報は、さらに、実行時のスレッド間の同期関係を指定するための情報(同期情報)を含んでも良い。同期情報は、例えば、ループのインデックスや、データの転送のタイミング等を用いて、処理コード間又はスレッド間の処理の同期関係を定めても良い。同期情報は、例えば、同期(データ転送や排他制御)のためのコードの挿入位置によって、処理コード間又はスレッド間の処理の同期関係を定めても良い。
並列化情報は、プログラマが作成しても良く、ツールによって自動生成しても良く、一部をプログラマが作成し残りをツールで作成しても良い。並列化情報がプログラマによって作成される場合は、原プログラムコードに追記するなど予め規定された言語等で記述しても良く、GUIから選択しても良く、これらの方法を組み合わせてもよい。並列化情報がツール等によって自動生成される場合には、原プログラムコードの解析結果などに従って、原プログラムコードに並列化情報が追記されても良く、別ファイルが作成されても良い。並列化情報は、ファイルバイナリなどの1つのまとまりでも良く、複数のファイルやバイナリで構成されていても良い。例えば、openMPでは、原プログラムコードに並列化情報が記述されるため、原プログラムコードと並列化情報とが一体となっている。
コード生成装置10は、並列化情報を用いて、原プログラムコードから、評価用プログラムコードを生成する。コード生成装置10は、原プログラムコード(逐次プログラムコード)から、並列プログラムコードを生成可能であっても良い。
コード生成装置10は、原プログラムコードを構文解析やバイナリ解析を行う。コード生成装置10は、原プログラムコードをAST(Abstract Syntax Tree)等の内部表現に直しても良い。コード生成装置10は、並列化情報に従い、原プログラムコードに、並列トレースを生成するためのコード(以下記録コードと呼ぶ。例えば、プロファイルを取得するためのAPI:Application Program Interfaceなど)を挿入することで、評価用プログラムコードを生成する。コード生成装置10は、原プログラムコードをAST等の内部表現へ変換した上で、記録コードを挿入しても良い。コード生成装置10は、原プログラムコードを内部表現に変換せず、構文解析を行いながら、原プログラムコードへ記録コードを挿入しても良い。
コード生成装置10は、原プログラムコードに対して、以下の通り記録コードを挿入する。コード生成装置10は、スレッドごとに、スレッドに割り当てられる1以上の処理コードのいずれよりも前に、スレッドの実行開始を記録するためのスレッド開始記録コード(又はスレッド開始記録API)を挿入する。コード生成装置10は、スレッドごとに、スレッドに割り当てられる1以上の処理コードのいずれよりも後に、スレッドの実行終了を記録するためのスレッド終了記録コード(又はスレッド終了記録API)を挿入する。
スレッド開始記録コード及びスレッド終了記録コードは、スレッドIDを、引数やAPI名等の形式で保持する。スレッド開始記録コード及びスレッド終了記録コードは、ループイタレーション毎に実行されても良く、1つのループにつき1回だけ実行されても良く、それ以外の様々な方式で実行されても良い。これは、プログラマやツールによって、評価用プログラムコード上に指定する記述が追加されてもよく、並列化情報に指定する記述が追加されても良い。また、プログラマによって、GUI等で指定されても良い。
コード生成装置10は、各処理コードよりも前に、各処理コードの実行開始を記録するための処理開始記録コード(又は処理開始記録API)を挿入する。コード生成装置10は、各処理コードよりも後に、各処理コードの実行終了を記録するための処理終了記録コード(又は処理終了記録API)を挿入する。処理開始記録コード及び処理終了記録コードは、区分IDと、その処理コードが属するスレッドIDを、引数やAPI名等の形式で保持する。
コード生成装置10は、処理コード間又はスレッド間の処理の同期関係を指定するための同期待ちコード、同期待ち解除コードを挿入しても良い。同期待ちコード及び同期待ち解除コードがコンピュータ等によって実行された場合、同期待ちコード又は同期待ち解除コードが実行されたことが記録される。
図2は、原プログラムコード(Sequential code)と並列化情報(User directives)の例を示す図である。
原プログラムコード(Sequential code)は、forループと、add、mul、sub内の処理コードとを含む。add、mul、subの開始と終了を示す括弧{}は、区分情報である。add、mul、subは、区分IDである。add、mul、subの開始と終了を示す括弧{}内部のコードは、それぞれ処理コードである。
並列化情報(User directives)は、スレッド情報(Functional_split loop(n))と、同期情報(Define sync(1))とを含む。「functional_split loop(n)」との記述は、機能分割を行うことと、並列化を行うループ(コード)がインデックスnのループであることと、1つのループにつき1つのスレッドを生成することとを指定する。スレッド情報(Functional_splitloop(n))の括弧{}の内部は、「Define thread_1」と「Define thread_2」とによって、スレッドを2つ定義する。スレッド情報(Functional_splitloop(n))は、スレッド1(thread1)にadd、mulの処理コードが割り当てられること、及びスレッド2(thread2)にsubの処理コードが割り当てられることを定める。「thread1」と「thread1」は、スレッドIDである。
同期情報「Define sync(1):thread_1−>thread_2」との記述は、「thread_1」から「thread_2」に対しての同期を定義する。「sync()」の引数の“1”は、「thread_1」と「thread_2」とのforループのイタレーション距離を“1”とすることを定める。イタレーション距離を“1”とは、「thread_2」のn回目のイタレーションの実行は、「thread_1」のn回目のイタレーションの実行後でなければならないことを示す。
図3は、図2に示す原プログラムコードに対応する評価用プログラムコードを示す図である。図3では、“Inserted”の矢印により指示されるコード(記録コード)が、コード生成部によって追加されたことを示す。
コード生成部は、「thread_1」に割り当てられるadd、mulの処理コードよりも前に、「thread_1」のスレッド開始記録コード(thread_spawn(“thread_1”))を挿入する。コード生成部は、「thread_1」に割り当てられたadd、mulの処理コードよりも後に、「thread_1」のスレッド終了記録コード(thread_join(“thread_1”))を挿入する。並列化情報によって、1つのループに対して1つのスレッドを生成することが定められているため、コード生成部は、add、mulの処理コードを含むループの外に、スレッド開始記録コード及びスレッド終了記録コードを挿入する。
並列化情報によって、ループイタレーションごとにスレッドを生成することが定められる場合には、コード生成部は、「thread_1」に割り当てられたadd、mulの処理コードを含むループの中であってadd、mulの処理コードより前にスレッド開始記録コードを、「thread_1」に割り当てられたadd、mulの処理コードを含むループの中であってadd、mulの処理コードより後にスレッド終了記録コードを、を挿入する。
コード生成部は、「thread_2」に割り当てられるsubの処理コードよりも前に、「thread_2」のスレッド開始記録コード(thread_spawn(“thread_2”))を挿入する。コード生成部は、「thread_2」に割り当てられたsubの処理コードよりも後に、「thread_2」のスレッド終了記録コード(thread_join(“thread_2”))を挿入する。並列化情報によって、1つのループに対して1つのスレッドを生成することが定められているため、コード生成部は、subの処理コードを含むループの外に、スレッド開始記録コード及びスレッド終了記録コードを挿入する。
並列化情報によって、ループイタレーションごとにスレッドを生成することが定められる場合には、コード生成部は、「thread_2」に割り当てられたsubの処理コードを含むループの中であってsubの処理コードより前にスレッド開始記録コードを、「thread_2」に割り当てられたsubの処理コードを含むループの中であってsubの処理コードより後にスレッド終了記録コードを、を挿入する。
コード生成部は、addの処理コードの前であって、addが属するスレッド開始記録コード(thread_spawn(“thread_1”))の後に、addの処理開始記録コード(section_enter(“add”、“thread_1”))を挿入する。コード生成部は、addの処理コードの後であって、同一のスレッド(thread_1)に属する後の処理コード(mul)の処理開始記録コードより前に、addの処理終了記録コード(section_leave(“add”、“thread_1”))を挿入する。
コード生成部は、mulの処理コードの前であって、同一のスレッド(thread_1)に属する前の処理コード(add)の処理終了記録コードより後に、mulの処理開始記録コード(section_enter(“mul”、“thread_1”))を挿入する。コード生成部は、mulの処理コードの後であって、同一のスレッドに属さない次の処理コード(sub)の前に、mulの処理終了記録コード(section_leave(“mul”、“thread_1”))を挿入する。
コード生成部は、subの処理コードの前であって、同一のスレッドに属さない前の処理コード(mul)の後に、subの処理開始記録コード(section_enter(“sub”、“thread_2”))を挿入する。コード生成部は、subの処理コードの後であって、subが属するスレッド終了記録コード(thread_join(“thread_2”))の前に、subの処理終了記録コード(section_leave(“sub”、“thread_2”))を挿入する。
コード生成部は、addの処理コードの処理終了記録コードの後、mulの処理コードの処理開始記録コードの前に、同期待ち解除コード(sync_put(“n”))を、挿入する。コード生成部は、mulの処理コードの処理終了記録コードの後、subの処理コードの処理開始記録コードの前に、同期待ちコード(sync_get(“n”))を、挿入する。同期待ちコード及び同期待ち解除コードの挿入位置は、プログラマが指定してもよいし、ツールによって決定されてもよい。
図4は、原プログラムコード(Sequential code)と並列化情報(User directives)の例を示す図である。
原プログラムコード(Sequential code)は、forループと、add、mul、sub内の処理コードとを含む。add、mul、subの開始と終了を示す括弧{}は、区分情報である。add、mul、subは、区分IDである。add、mul、subの開始と終了を示す括弧{}内部のコードは、それぞれ処理コードである。
並列化情報(User directives)は、スレッド情報(Data_split loop(n))を含む。「Data_split loop(n)」との記述は、データ分割を行うことと、並列化を行うループ(コード)がインデックスnのループであることと、ループにつき1つのスレッドを生成することを指定する。スレッド情報(Data_splitloop(n))の括弧{}の内部は、「Define thread_1」と「Define thread_2」とによって、スレッドを2つ定義する。スレッド情報(Data_splitloop(n))は、スレッド1(thread1)に、ループのイタレーション0から49回まで(インデックスnが0以上50未満)のadd、mul、subの処理コードが割り当てられること、及びスレッド2(thread2)に、ループのイタレーション50から99回まで(インデックスnが50以上100未満)のadd、mul、subの処理コードが割り当てられることを定める。「thread1」と「thread1」は、スレッドIDである。
図5は、図4に示す原プログラムコードに対応する評価用プログラムコードを示す図である。図5では、“Inserted”の矢印により指示されるコード(記録コード)が、コード生成部によって追加されたことを示す。
コード生成部が、スレッド開始記録コード及びスレッド終了記録コードを挿入する方法は、図2、図3の例で説明した方法と同様である。コード生成部が、処理開始記録コード及び処理終了記録コードを挿入する位置については、図2、図3の例で説明した方法と同様である。図4、図5の例では、コード生成部は、処理開始記録コード及び処理終了記録コードを挿入するのに加えて、さらに、ループのイタレーション数に応じた記録コードの実行制御を行うための制御コード(if文、else if文など)を以下の通り、挿入する。
コード生成部は、ループのイタレーション0から49回まで(インデックスnが0以上50未満)の場合には、「thread_1」に係る処理開始記録コード(section_enter(“add”,“thread_1”,section_enter(“mul”,“thread_1”,section_enter(“sub”,“thread_1”))が実行されるようにif文(if(0<=n<50))を挿入する。
コード生成部は、ループのイタレーション50から99回まで(インデックスnが50以上100未満)の場合には、「thread_2」に係る処理開始記録コード(section_enter(“add”,“thread_2”,section_enter(“mul”,“thread_2”,section_enter(“sub”,“thread_2”))が実行されるようにelse if文(else if(50<=n<100))を挿入する。
コード生成部は、ループのイタレーション0から49回まで(インデックスnが0以上50未満)の場合には、「thread_1」に係る処理開始記録コード(section_leave(“add”,“thread_1”,section_leave(“mul”,“thread_1”,section_leave(“sub”,“thread_1”))が実行されるようにIf文(if(0<=n<50))を挿入する。
コード生成部は、ループのイタレーション50から99回まで(インデックスnが50以上100未満)の場合には、「thread_2」に係る処理開始記録コード(section_leave(“add”,“thread_2”,section_leave(“mul”,“thread_2”,section_leave(“sub”,“thread_2”))が実行されるようにelse if文(else if(50<=n<100))を挿入する。
図5の例では、ループのイタレーション数に応じて記録コードの実行制御を行うための制御コードとしてif文、else if文を用いた例で説明した。しかし、処理開始・終了記録コード(API)に実行制御機能が含まれていても良い。また、スレッド間の同期をとる方式としてロックを用いた排他制御を使用する場合は、ロックの獲得を記録(プロファイル)するためのコード(API)「lock()」や、ロックの解放を記録(プロファイル)するためのコード(API)「unlock()」などを挿入することができる。このように、機能の拡張を行う場合は、拡張する方式に対応するための様々なコード(API)を追加することができる。
トレース生成装置20は、評価用プログラムコードを実行する事によって、スレッドごとに、スレッドの実行開始(thread_spawn)から実行終了(thread_join)までの間に、スレッドに割り当てられた処理コードの実行開始(section_enter)と実行終了(section_leave)との前後関係を示す並列トレース(順序情報)を生成する。トレース生成装置20は、並列トレースを生成するに当たって、評価用プログラムコードを、実機上で実行しても良く、シミュレータ等の仮想環境で実行しても良い。評価用プログラムコードをシミュレータ等の仮想環境で実行する場合には、仮想環境に、スレッド開始記録コード、スレッド終了記録コード、処理開始記録コード、及び処理終了記録コードの実行を検知するための仕組みを実装しておくことで、トレース生成装置20は、並列トレースを記録できる。
図6は、並列トレース(Parallel trace)の例を示す図である。
トレース生成装置20は、スレッド開始記録コード(thread_spawn(“thread_1”))を実行する時に、「thread_1」に割り当てられた処理コードの実行開始と実行終了との前後関係を記載するための第1順序情報(Thread_1 API call trace)を生成する。
トレース生成装置20は、「thread_1」に割り当てられたadd、mulの処理コードについての処理開始記録コード(section_enter(“add” ,“thread_1”)、section_enter(“mul” ,“thread_1”))及び処理終了記録コード(section_leave(“add” ,“thread_1”)、section_leave(“mul” ,“thread_1”))を実行するたびに、時系列順に、処理コードの開始、終了を第1順序情報に記録する。
トレース生成装置20は、「thread_1」についての同期待ち解除コード(sync_get(1)、sync_get(2))を実行するたびに、時系列順に、同期待ちコードの処理を第1順序情報に記録しても良い。
このようにすることで、トレース生成装置20は、「thread_1」に割り当てられたadd、mulの処理コードについての開始と終了、並びに、同期待ち解除コードの処理の前後関係を、第1順序情報に記載する。
トレース生成装置20は、スレッド開始記録コード(thread_spawn(“thread_2”))を実行する時に、「thread_2」に割り当てられた処理コードの実行開始と実行終了との前後関係を記載するための第2順序情報(Thread_2 API call trace)を生成する。
トレース生成装置20は、「thread_2」に割り当てられたsubの処理コードについての処理開始記録コード(section_enter(“sub” ,“thread_1”))及び処理終了記録コード(section_leave(“sub” ,“thread_1”))を実行するたびに、時系列順に、処理コードの開始、終了を第2順序情報に記録する。
トレース生成装置20は、「thread_2」についての同期待ちコード(sync_get(1)、sync_get(2))を実行するたびに、時系列順に、同期待ちコードの処理を第2順序情報に記録する。
このようにすることで、トレース生成装置20は、「thread_2」に割り当てられたsubの処理コードについての開始と終了、並びに、同期待ちコードの処理の前後関係を、第2順序情報に記載する。
トレース生成装置20は、スレッド開始記録コード(thread_spawn(“thread_1”))を実行する時に、各スレッドの実行開始と実行終了との前後関係を記載するための第3順序情報(図示せず)を生成する。
トレース生成装置20は、スレッド開始記録コード(thread_spawn(“thread_1”)、thread_spawn(“thread_2”))及び、スレッド終了記録コード(thread_join(“thread_1”)、thread_join(“thread_2”))を実行するたびに、時系列順に、スレッドの開始と終了を第3順序情報に記録する。
トレース生成装置20は、並列トレースを、テキストファイルやバイナリファイルなどで生成しても良く、記録コードが内部的に論理キューなどをメモリ上に確保し、論理キューに記録コードの実行をエンキューしていくことで生成しても良い。
図7は、逐次トレース(sequenctial trace)の例を示す図である。トレース生成装置20は、評価用プログラムコードを実行する事によって、処理コードごとの実行情報を示す逐次トレースを生成する。図7に示す逐次トレースは、add、mul、subの処理コ−ドごとに、実行時間の平均時間150、30、100を有する。
逐次トレースは、各処理コードの実行情報を示す情報である。逐次トレースは、少なくとも各処理コードの実行時間を含む。逐次トレースは、処理コードごとに、同期待ちコード、同期待ち解除コードの実行タイミングや、同期のための待ち時間、メモリアクセストレース、キャッシュアクセス回数、キャッシュミス回数、バスのアクセス回数、バス使用の衝突回数、その他ハードウェア資源に関する情報を含んでいても良い。
トレース生成装置20は、例えば、実機上で評価用プログラムコードを実行し、処理コードごとに、処理開始コードが実行されたときの時刻と、処理終了コードが実行されたときの時刻とを、OSのAPI等を用いて記録することで、各処理コードの実行時間を定める。このように取得された各処理コードの実行時間は、1回(ループのイタレーション1回分)の実行時間である。評価用プログラムコードをすべて実行したときのある処理コードの実行時間の和を、実行回数(ループのイタレーション回数)で除算することで、トレース生成装置20は、各処理コードの平均実行時間(図7)を定める事ができる。
逐次トレースに含まれる各処理コードの実行時間は、すべての平均であっても良く、処理コードを実行するたびに記録されても良く、処理コードの実行回数をある程度毎の粒度でまとめて記録してもよい。逐次トレースは、例えば、何回目の関数呼び出し後の処理コードの実行であるかについての情報など、より詳細な実行時の情報をふくんでいても良い。
逐次トレースに含まれる各処理コードの実行時間は、評価用プログラムコードを実機上で実行して計測されても良く、シミュレータ等の仮想環境で計測されても良く、プログラマによって予め与えられても良い。逐次トレースに含まれうるキャッシュ情報などは、LSIが提供するパフォーマンスモニタ機能によっても取得されても良い。
逐次トレースに含まれる各処理コードの実行時間は、原プログラムコードに、処理開始記録コード及び処理終了記録コードが挿入された逐次トレースを取得するためのプログラムコードを実行することで計測されても良い。
実行情報生成装置30は、並列トレースと逐次トレースを用いて、並列実行情報を生成する。並列実行情報は、原プログラムコードを並列化して実行した場合の実行情報(予測値)である。並列実行情報は、少なくとも、各スレッドの実行時間と、スレッド内の各処理コードの実行時間とを含む。並列実行情報は、スレッド内の同期のための待機時間をさらに含んでも良い。並列実行情報は、スレッドごとに、同期待ちコード、同期待ち解除コードの実行タイミングや、キャッシュアクセス回数、キャッシュミス回数、バスのアクセス回数、バス使用の衝突回数、その他ハードウェア資源情報、データレース検出結果、その他バグ情報、を含んでも良い。並列実行情報は、波形ファイルなどによって視覚的に表示されても良く、テキストファイルで表示されても良い。
実行情報生成装置30は、並列トレースに記録されたスレッドの開始及び終了や、処理コードの開始及び終了、同期待ちコード及び同期待ち解除コードの処理に応じて、シミュレーションAPIを呼び出して、並列実行情報を生成する。シミュレーションAPIとは、並列実行のシミュレーションを行い、その結果を出力する機能をもったAPIである。
図8は、実行情報生成装置30の動作を示すフローチャートである。
図9は、並列実行情報の例を示す図である。
以下では、実行情報生成装置30は、図6に示す並列トレースと図7に示す逐次トレースとを用いて、図8に示す動作に従って、図9に示す並列実行情報を生成することについて説明する。
まず、実行情報生成装置30は、並列トレース(第1順序情報)から「thread_1」内の記録コード(thread_spawn())を読み出す(ステップS101、S102)。実行情報生成装置30は、「thread_1」のローカルな時刻を“0”に設定する(ステップS104)。実行情報生成装置30は、第1順序情報から「thread_spawn()」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第1順序情報から、「section_enter(“add”)」と「section_leave(“add”)」とを読み出す(ステップS102)。実行情報生成装置30は、逐次トレースから、addの処理コードの実行時間150を読み出す。実行情報生成装置30は、「thread_1」のローカルな時刻を、addの処理コードの実行時間150だけ進める(ステップS106)。実行情報生成装置30は、第1順序情報から「section_enter(“add”)」と「section_leave(“add”)」とを削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第1順序情報から、「section_enter(“mul”)」と「section_leave(“mul”)」とを読み出す(ステップS102)。実行情報生成装置30は、逐次トレースから、mulの処理コードの実行時間30を読み出す。実行情報生成装置30は、「thread_1」のローカルな時刻を、mulの処理コードの実行時間30だけ進める(ステップS106)。実行情報生成装置30は、第1順序情報から「section_enter(“mul”)」と「section_leave(“mul”)」とを削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第1順序情報から、同期待ち解除コード「sync_put(1)」を読み出す(ステップS102、S103、S107の“いいえ”)。この「thread_1」の同期解除コードは、「thread_2」の同期待ち待ち解除コードに対応するものである。実行情報生成装置30は、並列トレースの第1順序情報から第2順序情報へ読み出しもとを切り替える(ステップS101)。実行情報生成装置30は、第1順序情報から、「sync_put(1)」を削除する。
次に、実行情報生成装置30は、並列トレース(第2順序情報)から、「thread_spawn()」を読み出し(ステップS102)、「thread_2」のローカルな時刻を、“0”に設定する(ステップS104)。実行情報生成装置30は、第2順序情報から「thread_spawn()」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第2順序情報から「sync_get(1)」を読み出す(ステップS102)。実行情報生成装置30は、「thread_2」のローカルな時刻を、「thread_1」のローカルな時刻180へ進める(ステップS103、S107の“はい”)。実行情報生成装置30は、第2順序情報から「sync_get(1)」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第2順序情報から「section_enter(“sub”)」と「section_leave(“sub”)」とを読み出す(ステップS102)。実行情報生成装置30は、逐次トレースから、subの処理コードの実行時間100を読み出す。実行情報生成装置30は、「thread_2」のローカルな時刻を、subの処理コードの実行時間100だけ進める(ステップS106)。実行情報生成装置30は、第2順序情報から「section_enter(“sub”)」と「section_leave(“sub”)」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第2順序情報から同期待ちコード「sync_get(2)」を読み出す(ステップS102、S103、S107の“いいえ”)。この「thread_2」の同期待ちコード「sync_get(2)」は、「thread_1」の同期待ち解除コード「sync_put(2)」に対応するものである。「thread_1」の同期待ち解除コード「sync_put(2)」は、まだ実行されていない。実行情報生成装置30は、並列トレースの第2順序情報から第1順序情報へ読み出しもとを切り替える(ステップS101)。ここでは、実行情報生成装置30は、第2順序情報から、「sync_get(2)」を削除しない。
次に、実行情報生成装置30は、第1順序情報から、「section_enter(“add”)」と「section_leave(“add”)」を読み出し(ステップS102)、同様に、「thread_1」のローカルな時間をaddの処理コードの実行時間150だけ進める(ステップS106)。実行情報生成装置30は、第1順序情報から、「section_enter(“add”)」と「section_leave(“add”)」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第1順序情報から、「section_enter(“mul”)」と「section_leave(“mul”)」を読み出し(ステップS102)、同様に、「thread_1」のローカルな時間をmulの処理コードの実行時間30だけ進める(ステップS106)。実行情報生成装置30は、第1順序情報から、「section_enter(“mul”)」と「section_leave(“mul”)」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第1順序情報から、同期待ち解除コード「sync_put(2)」を読み出す(ステップS102、S103、S107の“いいえ”)。この「thread_1」の同期解除コードは、「thread_2」の同期待ち待ち解除コードに対応するものである。実行情報生成装置30は、並列トレースの第1順序情報から第2順序情報へ読み出しもとを切り替える(ステップS101)。実行情報生成装置30は、第1順序情報から、「sync_put(2)」を削除する。
次に、実行情報生成装置30は、第2順序情報から「sync_get(2)」を読み出す(ステップS102)。実行情報生成装置30は、「thread_2」のローカルな時刻を、「thread_1」のローカルな時刻360へ進める(ステップS103、S107の“はい”)。実行情報生成装置30は、第2順序情報から「sync_get(2)」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第2順序情報から、「section_enter(“sub”)」と「section_leave(“sub”)」を読み出し(ステップS102)、同様に、「thread_2」のローカルな時間をsubの処理コードの実行時間100だけ進める(ステップS106)。実行情報生成装置30は、第2順序情報から、「section_enter(“sub”)」と「section_leave(“sub”)」を削除する(ステップS108、S109の“有り”)。
次に、実行情報生成装置30は、第2順序情報から、「thread_join()」を読み出す(ステップS102、S105)。実行情報生成装置30は、第2順序情報から、「thread_join()」を削除する(ステップS108)。実行情報生成装置30は、「thread_2」のシミュレーションを終了する(ステップS109の“無し”)。実行情報生成装置30は、並列トレースの第2順序情報から第1順序情報へ読み出しもとを切り替える(ステップS110の“有り”、S101)。
次に、実行情報生成装置30は、第1順序情報から、「thread_join()」を読み出す(ステップS102、S105)。実行情報生成装置30は、第1順序情報から、「thread_join()」を削除する(ステップS108)。実行情報生成装置30は、「thread_1」のシミュレーションを終了する(ステップS109の“無し”)。
以上の処理によって、実行情報生成装置30は、「thread_1」と「thread_2」についてのシミュレーションを終了し(ステップS110の“無し”)、図9に示す並列実行情報を生成する。なお、上記例は、単純なモデルでのシミュレーション例を示したが、より複雑なモデルでのシミュレーションを行うことができる。例えば、今回の例では「thread_join()」でのスレッド間の待ち合わせ処理はシミュレーションしなかったため、「thread_spawn()」と「thread_join()」の呼び出しトレースには情報としての意味がない。しかしながら、より複雑なプログラム(特に、上記記載の処理に続いてスレッドの発行が行われる場合など)では、「thread_join()」でのスレッド間の待ち合わせ(例えばバリア同期など)もシミュレーションすることができる。このようなシミュレーションを行うために、「thread_spawn()」と「thread_join()」のトレース情報が必要となる。
第1の実施形態に係るシステム10によれば、並列プログラムコードを作成することなく、逐次プログラムコード(原プログラムコード)を並列化して実行した場合の並列トレースを取得できる。並列プログラムコードを作成することなく、原プログラムコードを並列化して実行した場合の並列実行情報を取得できる。
並列トレース及び並列実行情報を取得するために、並列プログラムコードの作成を行う必要がなく、並列プログラムコードの開発の負荷、コストを大幅に削減できる。逐次プログラムコード(原プログラムコード)を並列化して実行した場合の性能を早期に予測できるため、逐次プログラムコード及び並列化の方針(並列化情報)の試行錯誤を迅速に行うことができ、高性能な並列プログラムコードを開発できる。
以下では、比較例を用いて、第1の実施形態に係るシステム10の効果について説明する。
図10は、問題を発生させうる逐次プログラムコード(sequential code)と並列化情報(User directives)の例を示す図である。
逐次プログラムコードは、setとcalに係る処理コ−ドと、区分ID(set、cal)と、を含む。並列化情報のfunctional_split loop(n)という記述は、機能分割を行うことと、並列化を行うループ(コード)がインデックスnのループであることと、1つのループにつき1つのスレッドを生成することを指定する。Functioal_split loop(n)の括弧{}は、「Define thread_1」と「Define thread_2」により、2つのスレッドを定義する。スレッドIDは、「thread_1」と「thread_2」である。並列化情報(Functioal_split loop(n))は、「thread_1」にsetの処理コードを、「thread_2」にcalの処理コードをそれぞれ割り当てる。
図11は、比較例に係る方法によって、図10に示す逐次プログラムコードを、図10に示す並列化情報に従って生成した評価用プログラムコードを示す図である。図11では、「thread_1」でポインタp_M[i]に値が代入される。「thread_2」でp_M[i]のポインタの参照先変数の計算が行われる。
図10の逐次プログラムコードにおいては、同一のループイタレーションに属するsetの処理コードとcalの処理コードの計算順序は、setの処理コードが終了してからcalの処理コードの処理がなされることが保証されている。しかしながら、図11の並列プログラムコードにおいては、「thread_1」と「thread_2」で同期関係が定義されておらず、同一のループイタレーションに属するsetの処理コードとcalの処理コードの実行順序は保証されていない。
したがって、同一イタレーションに属するsetの処理コードが実行される前にcalの処理コードが実行されることがある。この場合、nullポインタアクセスとなり、プログラムが異常終了してしまうため、図10の逐次プログラムコードを並列化して実行した場合の性能評価が行えない。
図12は、第1の実施形態に係るシステム10が、図10に示す逐次プログラムコードを、図10に示す並列化情報に従って生成した評価用プログラムコードを示す図である。
図12の評価用プログラムコードにおいては、図10に示す変換前の逐次プログラムコードと同様に、同一のループイタレーションのsetの処理コードとcalの処理コードの実行順序が保証されている。したがって、異常終了することなく実行可能であり、上記に説明した通りの方法で、並列プログラムコードを生成することなく、並列トレース等を取得できる。
このように、第1の実施形態に係るシステム10は、いかなる原プログラムコード(逐次プログラムコード)と並列化情報の組み合わせにおいても、これらから評価用プログラムコードを生成し、評価用プログラムコードから並列トレースを取得することができる。
第1の実施形態に係るシステム10は、いかなる原プログラムコードと並列化情報の組み合わせにおいても、並列プログラムコードを生成することなく、原プログラムコードを並列化して実行した場合の並列トレース、並列実行情報を取得できる。
なお、このシステム10は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、コード生成装置10、トレース生成装置20、および実行情報生成装置30は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。また、このシステム10は、1)トレース生成装置20のみ、2)コード生成装置10とトレース生成装置20、又は3)トレース生成装置20と実行情報生成装置30のいずれかを、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、コード生成装置10、トレース生成装置20、および実行情報生成装置30は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。また、コード生成装置10、トレース生成装置20、および実行情報生成装置30に内蔵されるメモリは、上記のコンピュータ装置に内蔵あるいは外付けされたメモリ、ハードディスクもしくはCD−R、CD−RW、DVD−RAM、DVD−Rなどの記憶媒体などを適宜利用して実現することができる。
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。
1・・・システム
10・・・コード生成装置
20・・・トレース生成装置
30・・・実行情報生成装置

Claims (7)

  1. 逐次プログラムコードを実行することにより、前記逐次プログラムコードを並列化して実行した場合の並列トレース情報を生成するトレース生成装置であって、
    前記逐次プログラムコードは、
    第1スレッドに割り当てられる1つ以上の処理を規定する第1処理コードと、
    第2スレッドに割り当てられる1つ以上の処理を規定する第2処理コードと、
    それぞれの処理コードより前に挿入され、前記第1及び第2処理コードごとの実行開始を記録するための第1及び第2処理開始記録コードと、
    それぞれの処理コードより後に挿入され、前記第1及び第2処理コードごとの実行終了を記録するための第1及び第2処理終了記録コードと、
    前記第1処理コードより前に挿入され、前記第1スレッドの実行開始を記録するための第1スレッド開始記録コードと、
    前記第1処理コードより後に挿入され、前記第1スレッドの実行終了を記録するための第1スレッド終了記録コードと、
    前記第2処理コードより前に挿入され、前記第2スレッドの実行開始を記録するための第2スレッド開始記録コードと、
    前記第2処理コードより後に挿入され、前記第2スレッドの実行終了を記録するための第2スレッド終了記録コードとを含み、
    前記並列トレース情報は、
    前記第1スレッドの実行開始から実行終了までの間に、前記第1スレッドに割り当てられた前記第1処理コードの実行開始と実行終了との前後関係を示す第1順序情報と、
    前記第2スレッドの実行開始から実行終了までの間に、前記第2スレッドに割り当てられた前記第2処理コードの実行開始と実行終了との前後関係を示す第2順序情報と、
    前記逐次プログラムコードの実行開始から実行終了までの間に、前記第1スレッドの実行開始と実行終了、及び前記第2スレッドの実行開始と実行終了との前後関係を示す第3順序情報とを含むことを特徴とするトレース生成装置。
  2. 前記逐次プログラムコードは、
    前記第1処理コードより前に挿入され、前記第2処理コードの実行が終了するまで、前記第1処理コードの実行開始を待機するための同期待ちコードと、
    前記第2処理コードより後に挿入され、前記第1処理コードの実行待ちを解除するための同期待ち解除コードとをさらに含み、
    前記第1順序情報は、前記第1スレッドに割り当てられた前記第1処理コードの実行開始と実行終了と、前記同期待ちコードの処理タイミングとの前後関係を示し、
    前記第2順序情報は、前記第2スレッドに割り当てられた前記第2処理コードの実行開始と実行終了と、前記同期待ち解除コードの処理タイミングとの前後関係を示すことを特徴とする請求項1に記載のトレース生成装置。
  3. 請求項1又は請求項2に記載のトレース生成装置と、
    前記並列トレース情報と、前記第1及び第2処理コードごとの実行時間とを用いて、前記逐次プログラムコードを並列化して実行した場合の並列実行情報を生成する実行情報生成装置とを備えるシステムであって、
    前記実行情報生成装置は、
    (a)前記第3順序情報を用いて、前記第1及び第2スレッドの実行開始のタイミングを定め、
    (b)前記第1順序情報と前記第1処理コードの実行時間とを用いて、前記第1スレッドの実行時間と前記第1スレッドの実行終了のタイミングとを定め、
    (c)前記第2順序情報と前記第2処理コードの実行時間とを用いて、前記第2スレッドの実行時間と前記第2スレッドの実行終了のタイミングとを定め、
    (d)前記第1又は第2処理コードの一方の実行終了のタイミングを用いて、他のスレッドの実行開始のタイミングを定め、
    前記並列実行情報は、
    前記第1スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングと、
    前記第2スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングとを含むことを特徴とするシステム。
  4. 請求項2に記載のトレース生成装置と、
    前記並列トレース情報と、前記第1及び第2処理コードごとの実行時間とを用いて、前記逐次プログラムコードを並列化して実行した場合の並列実行情報を生成する実行情報生成装置とを備えるシステムであって、
    前記実行情報生成装置は、
    (a)前記第3順序情報を用いて、前記第1及び第2スレッドの実行開始のタイミングを定め、
    (b)前記第1順序情報と前記第2順序情報と前記第1処理コードの実行時間とを用いて、前記第1スレッドの実行時間と前記第1スレッドの実行終了のタイミングとを定め、
    (c)前記第2順序情報と前記第2処理コードの実行時間とを用いて、前記第2スレッドの実行時間と前記第2スレッドの実行終了のタイミングとを定め、
    (d)前記第1又は第2処理コードの一方の実行終了のタイミングを用いて、他のスレッドの実行開始のタイミングを定め、
    前記同期待ちコードの処理のタイミングが、前記同期待ち解除コードの処理のタイミングよりも早い場合には、前記第1スレッドの実行時間には、前記同期待ちコードと前記同期待ち解除コードとの処理のタイミングとの差分に応じた待機時間が含まれ、
    前記並列実行情報は、
    前記第1スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングと、
    前記第2スレッドの実行開始のタイミング、実行時間、及び実行終了のタイミングとを含むことを特徴とするシステム。
  5. 次プログラムコードを生成するプログラム生成装置と、
    請求項1又は請求項2に記載のトレース生成装置とを備えるシステムであって、
    前記プログラム生成装置は、
    前記第1及び第2処理コードを含み、前記第1処理コードの後に前記第2処理コードが位置するプログラムコードに対して、
    (a)前記第1処理コードより前に、前記第1スレッド開始記録コードを挿入し、
    (b)前記第1スレッド開始記録コードより後であって前記第1処理コードの前に、前記第1処理開始記録コードを挿入し、
    (c)前記第1処理コードより後であって前記第2処理コードより前に、前記第1処理終了記録コードを挿入し、
    (d)前記第1処理終了記録コードより後に、前記第1スレッド終了記録コードを挿入し、
    (e)前記第2処理コードより前に、前記第2スレッド開始記録コードを挿入し、
    (f)前記第2スレッド開始記録コードより後であって前記第2処理コードより前に、前記第2処理開始記録コードを挿入し、
    (g)前記第2処理コードより後に、前記第2処理終了記録コードを挿入し、
    (h)前記第2処理終了記録コードより後に、前記第2スレッド終了記録コードを挿入することによって、前記逐次プログラムコードを生成することを特徴とするシステム。
  6. 前記トレース生成装置は、
    (a)前記第1処理開始記録コードを実行するタイミングと、前記第1処理終了記録コードを実行するタイミングとの差分から、前記第1処理コードの実行時間を定め、
    (b)前記第2処理開始記録コードを実行するタイミングと、前記第2処理終了記録コードを実行するタイミングとの差分から、前記第2処理コードの実行時間を定めることを特徴とする請求項1又は請求項2に記載のトレース生成装置。
  7. コンピュータに、逐次プログラムコードを実行させることにより、前記逐次プログラムコードを並列化して実行した場合の並列トレース情報を生成する機能を実現させるためのトレース生成プログラムであって、
    前記逐次プログラムコードは、
    第1スレッドに割り当てられる1つ以上の処理を規定する第1処理コードと、
    第2スレッドに割り当てられる1つ以上の処理を規定する第2処理コードと、
    それぞれの処理コードより前に挿入され、前記第1及び第2処理コードごとの実行開始を記録するための第1及び第2処理開始記録コードと、
    それぞれの処理コードより後に挿入され、前記第1及び第2処理コードごとの実行終了を記録するための第1及び第2処理終了記録コードと、
    前記第1処理コードより前に挿入され、前記第1スレッドの実行開始を記録するための第1スレッド開始記録コードと、
    前記第1処理コードより後に挿入され、前記第1スレッドの実行終了を記録するための第1スレッド終了記録コードと、
    前記第2処理コードより前に挿入され、前記第2スレッドの実行開始を記録するための第2スレッド開始記録コードと、
    前記第2処理コードより後に挿入され、前記第2スレッドの実行終了を記録するための第2スレッド終了記録コードとを含み、
    前記並列トレース情報は、
    前記第1スレッドの実行開始から実行終了までの間に、前記第1スレッドに割り当てられた前記第1処理コードの実行開始と実行終了との前後関係を示す第1順序情報と、
    前記第2スレッドの実行開始から実行終了までの間に、前記第2スレッドに割り当てられた前記第2処理コードの実行開始と実行終了との前後関係を示す第2順序情報と、
    前記逐次プログラムコードの実行開始から実行終了までの間に、前記第1スレッドの実行開始と実行終了、及び前記第2スレッドの実行開始と実行終了との前後関係を示す第3順序情報とを含むことを特徴とするトレース生成プログラム。
JP2010192735A 2010-08-30 2010-08-30 トレース生成装置、システム、およびそのプログラム Expired - Fee Related JP5139486B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2010192735A JP5139486B2 (ja) 2010-08-30 2010-08-30 トレース生成装置、システム、およびそのプログラム
US13/042,553 US9152389B2 (en) 2010-08-30 2011-03-08 Trace generating unit, system, and program of the same

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010192735A JP5139486B2 (ja) 2010-08-30 2010-08-30 トレース生成装置、システム、およびそのプログラム

Publications (2)

Publication Number Publication Date
JP2012048661A JP2012048661A (ja) 2012-03-08
JP5139486B2 true JP5139486B2 (ja) 2013-02-06

Family

ID=45698874

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010192735A Expired - Fee Related JP5139486B2 (ja) 2010-08-30 2010-08-30 トレース生成装置、システム、およびそのプログラム

Country Status (2)

Country Link
US (1) US9152389B2 (ja)
JP (1) JP5139486B2 (ja)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013171459A (ja) * 2012-02-21 2013-09-02 Toshiba Corp プログラム解析装置、プログラム解析方法および記録媒体
US9135139B2 (en) * 2012-06-27 2015-09-15 Intel Corporation Methods and systems to identify and reproduce concurrency violations in multi-threaded programs using expressions
US8954546B2 (en) * 2013-01-25 2015-02-10 Concurix Corporation Tracing with a workload distributor
US9250877B2 (en) * 2013-09-20 2016-02-02 Cray Inc. Assisting parallelization of a computer program
JP2015069220A (ja) * 2013-09-26 2015-04-13 富士通株式会社 性能評価プログラム生成装置、方法、及びプログラム
JP6152786B2 (ja) * 2013-11-29 2017-06-28 富士通株式会社 通信制御装置、情報処理装置、並列計算機システム、制御プログラム、及び並列計算機システムの制御方法
US9996354B2 (en) * 2015-01-09 2018-06-12 International Business Machines Corporation Instruction stream tracing of multi-threaded processors
US10002040B2 (en) * 2016-01-04 2018-06-19 International Business Machines Corporation Detection and automatic transfer of standalone system dumps
US20180067729A1 (en) * 2016-09-06 2018-03-08 Jacob Harris Apkon Techniques for modifying execution of a computer program based on user input received through a graphical user interface
JP7095513B2 (ja) * 2018-02-21 2022-07-05 株式会社デンソー マルチコアマイコン、及び車載装置
CN110471670A (zh) * 2019-08-20 2019-11-19 杭州和利时自动化有限公司 一种编译器、编译方法和追踪方法及dcs控制器
JP7243575B2 (ja) * 2019-11-05 2023-03-22 株式会社デンソー 電子制御装置およびその動作方法ならびに制御プログラム
CN110968493A (zh) * 2019-12-24 2020-04-07 上海英方软件股份有限公司 一种基于运行日志分析推演程序运行状态的方法及系统
CN112667511A (zh) * 2020-12-30 2021-04-16 广州凡科互联网科技股份有限公司 一种通过插入代码来追踪java程序内部调用链的方法

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5179672A (en) * 1990-06-19 1993-01-12 International Business Machines Corporation Apparatus and method for modeling parallel processing of instructions using sequential execution hardware
JPH1063550A (ja) * 1996-08-23 1998-03-06 Fujitsu Ltd 実行性能解析表示方法およびその方法を実施するプログラムを記録した媒体
US7137120B2 (en) * 2001-12-17 2006-11-14 International Business Machines Corporation Dynamic diagnostic program for determining thread wait time
JP4042604B2 (ja) * 2003-03-31 2008-02-06 日本電気株式会社 プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
EP1569104A3 (en) 2004-01-09 2006-05-03 Interuniversitair Microelektronica Centrum Vzw An automated method for performing parallelization of sequential code and a computerized system adapted therefore
US7493606B2 (en) * 2004-08-03 2009-02-17 Université du Québec à Chicoutimi (UQAC) Method for compiling and executing a parallel program
JP2006277279A (ja) * 2005-03-29 2006-10-12 Nec Corp プログラム性能情報の採取方法及びその装置並びにプログラムへの性能情報採取機能追加方法及びその装置
JP4937022B2 (ja) * 2007-07-13 2012-05-23 株式会社東芝 順序関係解析装置、方法及びプログラム
US7992045B2 (en) * 2008-12-02 2011-08-02 Computer Associates Think, Inc. Identifying and monitoring asynchronous transactions

Also Published As

Publication number Publication date
JP2012048661A (ja) 2012-03-08
US9152389B2 (en) 2015-10-06
US20120054722A1 (en) 2012-03-01

Similar Documents

Publication Publication Date Title
JP5139486B2 (ja) トレース生成装置、システム、およびそのプログラム
US9208057B2 (en) Efficient model checking technique for finding software defects
US9536027B2 (en) Executing a hardware simulation and verification solution
US8359578B2 (en) Symbolic reduction of dynamic executions of concurrent programs
US20090313600A1 (en) Concurrent code generation
US10943041B2 (en) Electronic system level parallel simulation method with detection of conflicts of access to a shared memory
US20060218543A1 (en) Method and apparatus for analyzing call history data derived from execution of a computer program
JP4201701B2 (ja) 検証言語の合成
EP1918812A1 (en) A software development system
US9880822B2 (en) Method and system for parallelization of sequential computer program codes
US20120131559A1 (en) Automatic Program Partition For Targeted Replay
JP5450840B2 (ja) プログラムの実行性能評価のためのテストデータ生成方法
US9298858B1 (en) System and method for reducing models based on a criterion
KR101745392B1 (ko) 프로그램 분석 장치 및 분석용 프로그램을 기록한 컴퓨터 판독 가능한 저장매체
Huybrechts et al. COBRA-HPA: a block generating tool to perform hybrid program analysis
Schmidt et al. Automatic generation of thread communication graphs from SystemC source code
JP3675623B2 (ja) プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体
Schmitt et al. Scalable critical path analysis for hybrid MPI-CUDA applications
Andersson et al. Extracting simulation models from complex embedded real-time systems
JP6776914B2 (ja) 並列化方法、並列化ツール
Herold et al. Optimizing one-sided communication of parallel applications using critical path methods
JP4264110B2 (ja) 模擬実行装置、方法およびプログラム
Langdal Generating grain graphs using the OpenMP tools API
Yeh et al. Speeding Up MPSoC virtual platform simulation by ultra synchronization checking method
Chen et al. Utilizing the Parallel Simulation Infrastructure

Legal Events

Date Code Title Description
RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20111125

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20111205

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120718

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120803

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120928

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20121019

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20121115

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20151122

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees