(57)【特許請求の範囲】
【請求項１】
複数の演算ユニットと、前記演算ユニットに接続されるメモリと、前記演算ユニット間を接続し、互いにデータを送受信するための通信経路とを備える計算機システムにおける性能分析方法であって、
前記計算機システムは、前記演算ユニットによって実行される複数の処理の実行命令を含む処理プログラムに従って前記複数の演算ユニットが並列して処理を実行する並列処理期間を特定し、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理の性能情報を取得する性能情報取得部を備え、
前記処理プログラムは、前記演算ユニットの各々が非同期に実行する演算処理又は通信処理の少なくともいずれかの非同期処理の実行命令を含み、
前記方法は、
前記複数の演算ユニットが、第１の非同期処理の実行命令と、前記第１の非同期処理以外の他の非同期処理の実行命令とを含む処理プログラムを取得する第１のステップと、
前記複数の演算ユニットの各々が、前記取得された処理プログラムに含まれる複数の処理の実行命令に従って処理を実行する第２のステップと、
前記演算ユニットが前記第１の非同期処理の実行命令を読み出した時に、他の前記演算ユニットが前記他の非同期処理を実行しているか否かを、前記性能情報取得部が判定する第３のステップと、
前記性能情報取得部が、前記第１の非同期処理の実行命令が読み出された時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理の実行命令が読み出された時を前記並列処理期間の開始点として特定する第４のステップと、
前記性能情報取得部が、前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されているか否かを判定する第５のステップと、
前記性能情報取得部が、前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理が完了した時を前記並列処理期間の終了点として特定する第６のステップと、
前記性能情報取得部が、前記特定された並列処理期間における前記開始点から前記終了点まで、前記複数の演算ユニットの各々が実行する処理の性能情報を取得する第７のステップと、
前記性能情報取得部が、前記特定された並列処理期間において取得された前記複数の演算ユニットの各々が実行する処理の性能情報を出力するための出力情報を生成する第８のステップと、
を含むことを特徴とする性能分析方法。
【請求項２】
前記処理プログラムは、さらに、前記第１の非同期処理に対する第１の同期待ち処理の実行命令を含み、
前記第４のステップは、前記演算ユニットによって前記第１の非同期処理の実行命令が読み出された時に、前記第１の非同期処理に対する同期待ちを表す第１の同期フラグを付与するステップを含み、
前記第５のステップは、
前記演算ユニットによって実行される前記第１の同期待ち処理が完了した時に、前記第１の非同期処理が完了したと判定して、前記第１の同期フラグを削除するステップと、
前記第１の同期フラグが削除された後に、前記並列処理期間における全ての前記他の非同期処理の同期フラグが削除されているか否かを判定するステップと、
前記並列処理期間における全ての前記他の非同期処理の同期フラグが削除されている場合に、前記他の非同期処理が実行されていないと判定するステップと、
を含むことを特徴とする請求項１に記載の性能分析方法。
【請求項３】
前記処理プログラムは、さらに、前記演算ユニットの各々が実行する処理が繰り返し実行されるループ処理の実行命令を含み、
前記第１のステップは、
前記演算ユニットが前記取得された処理プログラムを実行する前に、前記性能情報取得部が当該処理プログラムを解析するステップと、
前記性能情報取得部が、前記解析の結果に基づいて、前記演算ユニットによって前記ループ処理の実行命令が読み出されたことを検知するためのループ特定情報を生成するステップと、を含み、
前記第７のステップは、
前記ループ特定情報に基づいて、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理が前記ループ処理に含まれる処理であるか否かを判定するステップと、
前記並列処理期間において前記複数の演算ユニットの各々が実行する処理が前記ループ処理に含まれる処理であると判定された場合に、前記ループ処理毎に前記複数の演算ユニットの各々が実行する処理の性能情報を取得するステップと、
前記ループ処理毎に取得された前記複数の演算ユニットの各々が実行する処理の性能情報に対して統計処理を実行して前記ループ処理における前記複数の演算ユニットの各々が実行する処理の性能情報を算出するステップと、を含むことを特徴とする請求項１に記載の性能分析方法。
【請求項４】
前記第７のステップは、
前記演算ユニットによって前記第１の非同期処理の実行命令が読み出された場合に、前記ループ特定情報に基づいて、前記第１の非同期処理が、前記ループ処理内の処理であるか否かを判定するステップと、
前記第１の非同期処理が前記ループ処理内の処理であると判定された場合には、前記ループ処理毎に、前記第１の非同期処理の性能情報を取得するステップと、
前記ループ処理毎に取得された前記第１の非同期処理の性能情報に対して統計処理を実行することによって前記ループ処理における前記第１の非同期処理の性能情報を算出するするステップと、を含むことを特徴とする請求項３に記載の性能分析方法。
【請求項５】
前記第７のステップでは、前記第１の非同期処理が前記非同期に実行される通信処理である場合に、転送量、転送パターン、及び転送先を前記非同期に実行される通信処理の性能情報として取得し、
前記第８のステップは、
前記取得された転送量、転送パターン、転送先の情報に基づいて、前記演算ユニット間で送受信されたデータの推定転送時間を算出するステップと、
前記算出された推定転送時間が含まれる前記出力情報を生成するステップと、を含むことを特徴とする請求項１に記載の性能分析方法。
【請求項６】
前記計算機システムは、前記非同期処理の性能情報を格納する性能情報格納部を備え、
前記第７のステップは、
前記並列処理期間において前記複数の演算ユニットの各々が実行する前記非同期処理を特定するステップと、
前記性能情報格納部から前記特定された非同期処理の性能情報を取得するステップと、を含むことを特徴とする請求項１に記載の性能分析方法。
【請求項７】
複数の演算ユニットと、前記演算ユニットに接続されるメモリと、前記演算ユニット間を接続し、互いにデータを送受信するための通信経路とを備える計算機システムであって、
前記計算機システムは、前記演算ユニットによって実行される複数の処理の実行命令を含む処理プログラムに従って前記複数の演算ユニットが並列して処理を実行する並列処理期間を特定し、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理の性能情報を取得する性能情報取得部を備え、
前記処理プログラムは、前記演算ユニットの各々が非同期に実行する演算処理又は通信処理の少なくともいずれかの非同期処理の実行命令を含み、
前記複数の演算ユニットは、第１の非同期処理の実行命令と、前記第１の非同期処理以外の他の非同期処理の実行命令とを含む処理プログラムを取得し、
前記複数の演算ユニットの各々は、前記取得された処理プログラムに含まれる複数の処理の実行命令に従って処理を実行し、
前記性能情報取得部は、
前記演算ユニットが前記第１の非同期処理の実行命令を読み出した時に、他の前記演算ユニットが前記他の非同期処理を実行しているか否かを判定し、
前記第１の非同期処理の実行命令が読み出された時に、前記他の非同期処理が実行されていないと判定された場合、前記第１の非同期処理の実行命令が読み出された時を前記並列処理期間の開始点として特定し、
前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されているか否かを判定し、
前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理が完了した時を前記並列処理期間の終了点として特定し、
前記特定された並列処理期間における前記開始点から前記終了点まで、前記複数の演算ユニットの各々が実行する処理の性能情報を取得し、
前記特定された並列処理期間において取得された前記複数の演算ユニットの各々が実行する処理の性能情報を出力するための出力情報を生成することを特徴とする計算機システム。
【請求項８】
前記処理プログラムは、さらに、前記第１の非同期処理に対する第１の同期待ち処理の実行命令を含み、
前記計算機システムは、
前記演算ユニットによって前記第１の非同期処理の実行命令が読み出された時に、前記第１の非同期処理に対する同期待ちを表す第１の同期フラグを付与し、
前記演算ユニットによって実行される前記第１の同期待ち処理が完了した時に、前記第１の非同期処理が完了したと判定して、前記第１の同期フラグを削除し、
前記第１の同期フラグが削除された後に、前記並列処理期間における全ての前記非同期処理の同期フラグが削除されているか否かを判定し、
前記並列処理期間における全ての前記他の非同期処理の同期フラグが削除されている場合に、前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されていないと判定することを特徴とする請求項７に記載の計算機システム。
【請求項９】
前記処理プログラムは、さらに、前記演算ユニットの各々が実行する処理が繰り返し実行されるループ処理の実行命令を含み、
前記計算機システムは、
前記演算ユニットが前記取得された処理プログラムを実行する前に当該処理プログラムを解析し、
前記解析の結果に基づいて、前記演算ユニットによって前記ループ処理の実行命令が読み出されたことを検知するためのループ特定情報を生成し、
前記並列処理期間における前記複数の演算ユニットの各々が実行する処理の性能情報を取得する場合には、前記ループ特定情報に基づいて、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理が前記ループ処理に含まれる処理であるか否かを判定し、
前記並列処理期間において前記複数の演算ユニットの各々が実行する処理が、前記ループ処理に含まれる処理であると判定された場合に、前記ループ処理毎に前記複数の演算ユニットの各々が実行する処理の性能情報を取得し、
前記ループ処理毎に取得された前記複数の演算ユニットの各々が実行する処理の性能情報に対して統計処理を実行して前記ループ処理における前記複数の演算ユニットの各々が実行する処理の性能情報を算出することを特徴とする請求項７に記載の計算機システム。
【請求項１０】
前記演算ユニットによって前記第１の非同期処理の実行命令が読み出された場合に、前記ループ特定情報に基づいて、前記第１の非同期処理が、前記ループ処理内の処理であるか否かを判定し、
前記第１の非同期処理が前記ループ処理内の処理であると判定された場合には、前記ループ処理毎に、前記第１の非同期処理の性能情報を取得し、
前記ループ処理毎に取得された前記第１の非同期処理の性能情報に対して統計処理を実行することによって前記ループ処理における前記第１の非同期処理の性能情報を算出することを特徴とする請求項９に記載の計算機システム。
【請求項１１】
前記第１の非同期処理が前記非同期に実行される通信処理である場合に、転送量、転送パターン、及び転送先を前記非同期に実行される通信処理の性能情報として取得し、
前記取得された転送量、転送パターン、転送先の情報に基づいて、前記演算ユニット間で送受信されたデータの推定転送時間を算出し、
前記算出された推定転送時間が含まれる前記出力情報を生成することを特徴とする請求項７に記載の計算機システム。
【請求項１２】
前記計算機システムは、前記非同期処理の性能情報を格納する性能情報格納部を備え、
前記並列処理期間において前記複数の演算ユニットの各々が実行する前記非同期処理を特定し、
前記性能情報格納部から前記特定された非同期処理の性能情報を取得することを特徴とする請求項７に記載の計算機システム。
【請求項１３】
複数の演算ユニットと、前記演算ユニットに接続されるメモリと、前記演算ユニット間を接続し、互いにデータを送受信するための通信経路とを備える計算機システムが実行する性能分析プログラムであって、
性能分析プログラムは、前記演算ユニットによって実行される複数の処理の実行命令を含む処理プログラムに従って前記複数の演算ユニットが並列して処理を実行する並列処理期間を特定し、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理の性能情報を取得する性能情報取得機能を備え、
前記処理プログラムは、前記演算ユニットの各々が非同期に実行する演算処理又は通信処理の少なくともいずれかの非同期処理の実行命令を含み、
前記性能情報取得機能は、
前記計算機システムに入力され、第１の非同期処理の実行命令と、前記第１の非同期処理以外の他の非同期処理の実行命令とを含む処理プログラムの実行時に当該処理プログラムの実行状況を監視して、前記演算ユニットが前記第１の非同期処理の実行命令を読み出した時に、他の前記演算ユニットが前記他の非同期処理を実行しているか否かを判定する第１の手順と、
前記第１の非同期処理の実行命令が読み出された時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理の実行命令が読み出された時を、前記並列処理期間の開始点として特定する第２の手順と、
前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されているか否かを判定する第３の手順と、
前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理が完了した時を前記並列処理期間の終了点として特定する第４の手順と、
前記特定された並列処理期間における前記開始点から前記終了点まで、前記複数の演算ユニットの各々が実行する処理の性能情報を取得する第５の手順と、
前記特定された並列処理期間において取得された前記複数の演算ユニットの各々が実行する処理の性能情報を出力するための出力情報を生成する第６の手順と、
を前記計算機システムに実行させることを特徴とする性能分析プログラム。
【請求項１４】
前記処理プログラムは、さらに、前記第１の非同期処理に対する第１の同期待ち処理の実行命令を含み、
前記第２の手順は、前記演算ユニットによって前記第１の非同期処理の実行命令が読み出された時に、前記第１の非同期処理に対する同期待ちを表す第１の同期フラグを付与する手順を含み、
前記第３の手順は、
前記演算ユニットによって実行される前記第１の同期待ち処理が完了した時に、前記第１の非同期処理が完了したと判定して、前記第１の同期フラグを削除する手順と、
前記第１の同期フラグが削除された後に、前記並列処理期間における全ての前記他の非同期処理の同期フラグが削除されているか否かを判定する手順と、
前記並列処理期間における全ての前記他の非同期処理の同期フラグが削除されている場合に、前記他の非同期処理が実行されていないと判定する手順と、を含むことを特徴とする請求項１３に記載の性能分析プログラム。
【請求項１５】
前記処理プログラムは、さらに、前記演算ユニットの各々が実行する処理が繰り返し実行されるループ処理の実行命令を含み、
前記第１の手順は、
前記演算ユニットが前記取得された処理プログラムを実行する前に、前記性能情報取得機能が当該処理プログラムを解析する手順と、
前記性能情報取得機能が、前記解析の結果に基づいて、前記演算ユニットによって前記ループ処理の実行命令が読み出されたことを検知するためのループ特定情報を生成する手順と、を含み、
前記第５の手順は、
前記ループ特定情報に基づいて、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理が前記ループ処理に含まれる処理であるか否かを判定する手順と、
前記並列処理期間において前記複数の演算ユニットの各々が実行する処理が前記ループ処理に含まれる処理であると判定された場合に、前記ループ処理毎に前記複数の演算ユニットの各々が実行する処理の性能情報を取得する手順と、
前記ループ処理毎に取得された前記複数の演算ユニットの各々が実行する処理の性能情報に対して統計処理を実行して前記ループ処理における前記複数の演算ユニットの各々が実行する処理の性能情報を算出する手順と、
を含むことを特徴とする請求項１３に記載の性能分析プログラム。
【請求項１６】
前記第５の手順は、前記第１の非同期処理が前記非同期に実行される通信処理である場合に、転送量、転送パターン、及び転送先を前記非同期に実行される通信処理の性能情報として取得する手順を含み、
前記第６の手順は、
前記取得された転送量、転送パターン、転送先の情報に基づいて、前記演算ユニット間で送受信されたデータの推定転送時間を算出する手順と、
前記算出された推定転送時間が含まれる前記出力情報を生成する手順と、を含むことを特徴とする請求項１３に記載の性能分析プログラム。
【請求項１７】
前記計算機システムは、前記非同期処理の性能情報を格納する性能情報格納部を備え、
前記第５の手順は、
前記並列処理期間において前記複数の演算ユニットの各々が実行する前記非同期処理を特定する手順と、
前記性能情報格納部から前記特定された非同期処理の性能情報を取得する手順と、を含むことを特徴とする請求項１３に記載の性能分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
並列処理可能な計算機システムにおける性能分析方法であって、特に、オーバーラップさせて実行する処理の性能分析方法に関する。
【背景技術】
【０００２】
並列処理システムでは、複数の演算装置（例えば、ＣＰＵ、ＧＰＵ等）が非同期に動作するため、その挙動を把握することは難しい。近年では、ＧＰＵアクセラレータを含むヘテロ構成の並列処理システムが台頭しており、ますます各演算装置の挙動を把握することが困難になってきている。
【０００３】
一方、性能最適化された並列処理プログラムでは、演算装置間の処理を細かくオーバーラップさせる場合がある（以下、オーバーラップ最適化ともいう）。これは、演算装置における処理をオーバーラップさせることによって、並列処理をより効率よく実行することが可能となるためである。
【０００４】
例えば、並列ＣＰＵシステムでは、各ＣＰＵの演算処理と、ＣＰＵ間の通信処理とがオーバーラップするように実行される。これによって、ＣＰＵ間の通信処理にかかる処理時間を隠蔽でき、処理の高速化を実現できる。
【０００５】
また、ＧＰＵアクセラレータでは、ＧＰＵ性能とＣＰＵ−ＧＰＵ間のデータ転送能力とに大きな乖離があるため、ＧＰＵの演算処理とＣＰＵ−ＧＰＵ間のデータ転送処理とをオーバーラップさせることによって、処理の大幅な高速化を実現できる。さらに、マルチＧＰＵシステムでは、ＧＰＵの演算処理と、ＣＰＵを経由したＧＰＵ間の通信処理とをオーバーラップさせることによって、処理の大幅な高速化を実現できる。
【０００６】
前述したような並列処理の挙動を把握するための性能分析ツールとしては、ＣＰＵ間の通信処理等の実行時間、及び通信サイズ等を詳細なタイムチャート形式で表示するツールが提供されている（例えば、非特許文献１参照）。また、ＣＰＵ及びＧＰＵのそれぞれの処理内容を詳細なタイムチャート形式で表示するツールが提供されている（例えば、非特許文献２参照）。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】"Vampir - Performance Optimization",［ｏｎｌｉｎｅ］,［平成２２年１１月５日検索］,インターネット＜URL:http://www.vampir.eu/index.html＞
【非特許文献２】NVIDIA,"NVIDIA Parallel Nsight",［ｏｎｌｉｎｅ］,［平成２２年１１月５日検索］,インターネット＜URL:http://developer.nvidia.com/object/nsight.html＞
【発明の概要】
【発明が解決しようとする課題】
【０００８】
並列処理プログラムを作成するプログラマが、複雑なオーバーラップ最適化を実行した場合、非特許文献１及び非特許文献２に記載のツールでは、処理の実行内容をタイムチャート形式で表示するため、実際に意図したとおりにオーバーラップされているか否かを把握することが困難である。
【０００９】
そのため、プログラマは、意図したとおりにオーバーラップされているか否かを把握するため、オーバーラップ最適化を実行する範囲の前後にバリア同期を挿入し、処理時間を測定することによって確かめる必要がある。
【００１０】
しかし、前述した方法では、プログラマの労力が増大する。また、前述した方法では、バリア同期という本来の並列処理プログラムとは異なる処理が実行されるため、本来の並列処理プログラムとは異なる結果が得られる可能性がある。
【００１１】
また、非特許文献１及び非特許文献２に記載のツールでは、ループ処理を含む長大な並列処理プログラムの挙動を把握するためには、プログラマ自身がタイムチャートを最初から最後まで調べて全てのループ処理の情報を解析する必要があり、多大な労力が必要となる。
【００１２】
本発明の目的は、オーバーラップされた区間を自動的に認識し、オーバーラップされた区間ごとに並列処理プログラムの性能情報を出力することである。
【課題を解決するための手段】
【００１３】
本発明の代表的な一例を示せば以下の通りである。すなわち、複数の演算ユニットと、前記演算ユニットに接続されるメモリと、前記演算ユニット間を接続し、互いにデータを送受信するための通信経路とを備える計算機システムにおける性能分析方法であって、前記計算機システムは、前記演算ユニットによって実行される複数の処理の実行命令を含む処理プログラムに従って前記複数の演算ユニットが並列して処理を実行する並列処理期間を特定し、前記並列処理期間において前記複数の演算ユニットの各々が実行する処理の性能情報を取得する性能情報取得部を備え、前記処理プログラムは、前記演算ユニットの各々が非同期に実行する演算処理又は通信処理の少なくともいずれかの非同期処理の実行命令を含み、前記方法は、前記複数の演算ユニットが、第１の非同期処理の実行命令と、前記第１の非同期処理以外の他の非同期処理の実行命令とを含む処理プログラムを取得する第１のステップと、前記複数の演算ユニットの各々が、前記取得された処理プログラムに含まれる複数の処理の実行命令に従って処理を実行する第２のステップと、前記演算ユニットが前記第１の非同期処理の実行命令を読み出した時に、他の前記演算ユニットが前記他の非同期処理を実行しているか否かを前記性能情報取得部が判定する第３のステップと、前記性能情報取得部が、前記第１の非同期処理の実行命令が読み出された時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理の実行命令が読み出された時を前記並列処理期間の開始点として特定する第４のステップと、前記性能情報取得部が、前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されているか否かを判定する第５のステップと、前記性能情報取得部が、前記第１の非同期処理が完了した時に、前記他の非同期処理が実行されていないと判定された場合に、前記第１の非同期処理が完了した時を前記並列処理期間の終了点として特定する第６のステップと、前記性能情報取得部が、前記特定された並列処理期間における前記開始点から前記終了点まで、前記複数の演算ユニットの各々が実行する処理の性能情報を取得する第７のステップと、前記性能情報取得部が、前記特定された並列処理期間において取得された前記複数の演算ユニットの各々が実行する処理の性能情報を出力するための出力情報を生成する第８のステップと、を含むことを特徴とする。
【発明の効果】
【００１４】
本発明の一形態によれば、並列処理期間を特定することができ、かつ、並列処理期間において実行される処理の性能情報を取得することができる。したがって、処理プログラムの性能分析を容易かつ高速に実現することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第１の実施形態の計算機システムの構成例を示す説明図である。
【図２】本発明の第１の実施形態のメモリ上に格納されるプログラム及び情報の一例を示す説明図である。
【図３】本発明の第１の実施形態の計算機システムにおける各構成の論理的接続関係を示す説明図である。
【図４】本発明の第１の実施形態の性能分析モジュールの構成例を示す説明図である。
【図５Ａ】本発明の第１の実施形態のオーバーラップ管理情報の一例を示す説明図である。
【図５Ｂ】本発明の第１の実施形態のオーバーラップ期間性能情報テーブルの一例を示す説明図である。
【図６Ａ】本発明の第１の実施形態におけるＣＰＵ処理情報の個別情報の一例を示す説明図である。
【図６Ｂ】本発明の第１の実施形態におけるＭｅｍｃｐｙ非同期処理情報及びＧＰＵ非同期処理情報の個別情報の一例を示す説明図である。
【図６Ｃ】本発明の第１の実施形態におけるＭＰＩ非同期処理情報の個別情報の一例を示す説明図である。
【図７Ａ】本発明の第１の実施形態の通信時間推定情報の一例を示す説明図である。
【図７Ｂ】本発明の第１の実施形態の通信時間推定情報の一例を示す説明図である。
【図７Ｃ】本発明の第１の実施形態の通信時間推定情報の一例を示す説明図である。
【図８】本発明の第１の実施形態の性能分析モジュールが備える各構成の関係を示す説明図である。
【図９】本発明の第１の実施形態におけるＣＰＵが実行する処理の概要を説明するフローチャートである。
【図１０】本発明の第１の実施形態におけるロードモジュール生成処理の詳細を説明するフローチャートである。
【図１１Ａ】本発明の第１の実施形態の性能分析モジュールが実行する性能分析処理における各モジュールの処理を説明するＰＡＤ図である。
【図１１Ｂ】本発明の第１の実施形態の性能分析モジュールが実行する性能分析処理における各モジュールの処理を説明するＰＡＤ図である。
【図１２】本発明の第１の実施形態における性能分析処理の流れを説明するフローチャートである。
【図１３Ａ】本発明の実施形態の性能分析モジュールが非同期処理開始情報を入力された場合に実行する処理を説明するフローチャートである。
【図１３Ｂ】本発明の実施形態の性能分析モジュールが非同期処理開始情報を入力された場合に実行する処理を説明するフローチャートである。
【図１３Ｃ】本発明の実施形態の性能分析モジュールが非同期処理開始情報を入力された場合に実行する処理を説明するフローチャートである。
【図１４】本発明の第１の実施形態の性能分析モジュールが非同期処理完了情報を入力された場合に実行する処理を説明するフローチャートである。
【図１５】本発明の第１の実施形態の性能分析モジュールが同期処理開始情報を入力された場合に実行する処理を説明するフローチャートである。
【図１６】本発明の第１の実施形態の性能分析モジュールが同期処理完了情報を入力された場合に実行する処理を説明するフローチャートである。
【図１７】本発明の第１の実施形態の性能分析モジュールがＤｏループ情報を入力された場合に実行する処理を説明するフローチャートである。
【図１８】本発明の第１の実施形態におけるＧＰＵ非同期処理が記載されたソースの一例を示す説明図である。
【図１９】本発明の第１の実施形態におけるオーバーラップ計測情報の表示画面の一例を示す説明図である。
【図２０】本発明の第１の実施形態におけるＭＰＩ通信処理が記載されたソースの一例を示す説明図である。
【図２１】本発明の第１の実施形態におけるオーバーラップ計測情報の表示画面の一例を示す説明図である。
【図２２】本発明の変形例におけるメモリ上に格納されるプログラム及び情報の一例を示す説明図である。
【図２３】本発明の変形例における計算機システムにおける各構成の論理的接続関係を示す説明図である。
【図２４Ａ】本発明の第１の実施形態におけるソースの一例を示す説明図である。
【図２４Ｂ】本発明の第１の実施形態におけるオーバーラップ期間性能情報テーブルの一例を示す説明図である。
【発明を実施するための形態】
【００１６】
以下、図を用いて本発明の実施形態について説明する。なお、同一の符号が付されたものは同一の構成であることを示す。
【００１７】
［第１の実施形態］
図１は、本発明の第１の実施形態の計算機システムの構成例を示す説明図である。
【００１８】
本実施形態では、計算機システムは、１つ以上のＣＰＵ１０１、１つ以上のメモリ１０２、１つ以上のＧＰＵ１０５、及び１つ以上のＧＰＵメモリ１０６から構成される。例えば、最小の構成としては、ＣＰＵ１０１、メモリ１０２、ＧＰＵ１０５、及びＧＰＵメモリ１０６をそれぞれ１つずつ備える計算機システムが考えられる。
【００１９】
なお、本実施形態の計算機システムは、１つの物理計算機によって実現してもよいし、２つ以上の計算機を並列に接続することによって実現してもよい。
【００２０】
図１では、ＣＰＵ１０１、メモリ１０２、ＧＰＵ１０５、及びＧＰＵメモリ１０６を２ずつ備える計算機システムの構成例を示す。また、計算機システムは、ユーザが情報を入力し、また、ユーザに情報を表示するための入出力インタフェース（図示省略）を備える。
【００２１】
ＣＰＵ１０１は、メモリ１０２に格納されるプログラムを実行する。ＣＰＵ１０１は、１つ以上のＣＰＵコア（図示省略）を備える。
【００２２】
メモリ１０２は、ＣＰＵ１０１によって実行されるプログラム及び当該プログラムを実行するために必要な情報を格納する。
【００２３】
ＧＰＵ１０５は、ＣＰＵ１０１からの指示に従って、ＧＰＵメモリ１０６に格納されるプログラム及び情報を用いて処理を実行する。ＧＰＵ１０５は、複数の演算コア（図示省略）を備える。
【００２４】
ＧＰＵメモリ１０６は、ＧＰＵ１０５によって実行される処理に必要な情報を格納する。
【００２５】
ＣＰＵ１０１とＧＰＵ１０５とは、ＰＣＩｅ等のインタフェース１１１を介して接続される。また、ＣＰＵ１０１間は、インタフェース１１１、及びインフィニバンド、ギガビットイーサネット（イーサネットは登録商標、以下同じ）等のインタフェース１１０を介して接続される。なお、ＣＰＵ１０１とＧＰＵ１０５との間の接続形態及びＣＰＵ１０１間の接続形態はこれに限定されない。
【００２６】
ＣＰＵ１０１は、所定の処理を実行し、また、ＣＰＵ１０１間のデータ通信処理も同時に実行する。本実施形態ではＣＰＵ１０１間のデータ通信にはＭＰＩ通信を用いるが、本発明はこれに限定されない。すなわち、ＣＰＵ１０１間でデータ通信できればよく、ソケット通信等を用いてもよい。
【００２７】
また、ＣＰＵ１０１は、ＧＰＵ１０５との間のデータ通信処理を実行する。本実施形態では、ＣＵＤＡに準処したプログラムを用いてＣＰＵ１０１とＧＰＵ１０５との間の通信が実現されるが、本発明はこれに限定されない。例えば、ＯｐｅｎＣＬ等に準拠したプログラムを用いてもよい。
【００２８】
本実施形態におけるＧＰＵ１０５が処理を実行する手順は、以下の通りである。
【００２９】
まず、ＣＰＵ１０１は、メモリ１０２に格納された情報をＧＰＵメモリ１０６にコピーする。その後、ＣＰＵ１０１は、ＧＰＵ１０５に処理実行を命令する。
【００３０】
当該処理実行の命令を受信したＧＰＵ１０５は、ＧＰＵメモリ１０６に格納されるプログラム及び情報に基づいて、処理を実行する。
【００３１】
その後、ＧＰＵ１０５は、ＣＰＵ１０１に処理結果を転送する。すなわち、処理結果がメモリ１０２に格納される。
【００３２】
本実施形態では、ＣＰＵ１０１とＧＰＵ１０５との間の通信処理と、ＣＰＵ１０１自身が実行する演算処理と、ＧＰＵ１０５が実行する演算処理とが非同期に実行される。
【００３３】
以下、ＣＰＵ１０１自身が処理を行う演算処理をＣＰＵ処理と記載し、ＣＰＵ１０１間の通信処理をＭＰＩ通信処理と記載する。また、ＣＰＵ１０１とＧＰＵ１０５との間のデータ転送処理をコピー処理と記載し、また、ＧＰＵ１０５自身が処理を行う演算処理をカーネル実行処理と記載する。
【００３４】
図２は、本発明の第１の実施形態のメモリ１０２上に格納されるプログラム及び情報の一例を示す説明図である。
【００３５】
メモリ１０２は、コンパイラ２０１、トラップ埋め込みロードモジュール２０３、リンカ２０４、オーバーラップ管理情報２１０、通信時間推定情報２０７、ＧＰＵプロファイラ２０８、及びＧＰＵ非同期処理情報２０９を格納する。
【００３６】
コンパイラ２０１は、プログラマが入力したソースに基づいて、ＣＰＵ１０１及びＧＰＵ１０５が実行可能な形式のロードモジュールを生成する。また、コンパイラ２０１は、ソースを解析して、ループ処理を特定するためのトラップをロードモジュールに埋め込む。
【００３７】
本実施形態では、コンパイラ２０１によってソースからトラップ埋め込みロードモジュール２０３が生成される。
【００３８】
また、コンパイラ２０１は、性能分析モジュール２０２を含む。性能分析モジュール２０２は、トラップ埋め込みロードモジュール２０３に埋め込まれたトラップに基づいて、複数の非同期処理が実行されている区間の性能情報を取得する。以下、複数の非同期処理が実行される区間をオーバーラップ区間と記載する。
【００３９】
なお、オーバーラップ区間では、非同期処理以外に、起動した非同期処理の完了を待ってＣＰＵ処理との同期をとる処理も実行される。以下、起動した非同期処理の完了を待ってＣＰＵ処理との同期をとる処理を同期処理と記載する。
【００４０】
リンカ２０４は、複数のモジュールをリンクすることによって実行モジュールを生成する。
【００４１】
オーバーラップ管理情報２１０は、性能分析モジュール２０２が取得したオーバーラップ期間における各処理の性能情報を格納する。オーバーラップ管理情報２１０の詳細については、図５Ａ及び図５Ｂを用いて後述する。
【００４２】
通信時間推定情報２０７は、ＣＰＵ１０１間の通信（ＭＰＩ通信）処理の実行時間、すなわち、ＣＰＵ１０１間の通信時間を推定するための情報を格納する。
【００４３】
これは、ＣＰＵ１０１からＭＰＩ通信処理の実行命令を受信したインタフェース１１０は、ネットワークの負荷に応じて通信タイミングを制御するためである。したがって、ＣＰＵ１０１からは、実際のＭＰＩ通信処理の実行時間を把握できない場合がある。
【００４４】
本実施形態では、ＭＰＩ通信処理の実行時間を取得するために通信時間推定情報２０７が用いられる。通信時間推定情報２０７の詳細については、図７Ａ〜図７Ｃを用いて後述する。
【００４５】
ＧＰＵプロファイラ２０８は、ＧＰＵ１０５が実行する処理の性能情報を取得する。本実施形態では、取得すべき性能情報の種別、取得した非同期処理情報を格納すべきメモリ１０２のアドレス等をＧＰＵ１０５に送信する。ＧＰＵ１０５は、受信した情報に基づいて、ＧＰＵ１０５が実行する処理の性能情報を取得し、取得された性能情報をＣＰＵ１０１に送信する。
【００４６】
ＧＰＵ非同期処理情報２０９は、ＧＰＵ１０５から送信された性能情報を格納する。ＧＰＵ非同期処理情報は、少なくとも各ＧＰＵ非同期処理の実行時間を含む。
【００４７】
図３は、本発明の第１の実施形態の計算機システムにおける各構成の論理的接続関係を示す説明図である。
【００４８】
コンパイラ２０１は、ソース３０１を解析し、プログラムの実行開始と実行終了時に性能分析モジュール２０２を呼び出すトラップを埋め込む。また、コンパイラ２０１は、ソース３０１中のループ処理開始直前とループ処理終了直後に、性能分析モジュール２０２を呼び出して、当該ループ処理の識別子を取得するためのトラップを埋め込む。
【００４９】
前述したトラップの埋め込み処理が終了した後、コンパイラ２０１は、トラップが埋め込まれたソースから、トラップ埋め込みロードモジュール２０３を生成する。
【００５０】
なお、ソース３０１は、ユーザが入出力インタフェース（図示省略）を用いて入力した実行プログラム群である。ソース３０１はメモリ１０２に格納される。
【００５１】
リンカ２０４は、トラップ埋め込みロードモジュール２０３と性能分析モジュール２０２とをリンクさせて実行モジュール３０２を生成する。
【００５２】
ＣＰＵ１０１は、生成された実行モジュール３０２を実行する。実行モジュール３０２が実行されると、ソース３０１に基づく処理が実行される。このとき、性能分析モジュール２０２も実行され、オーバーラップ区間における性能情報が取得される。
【００５３】
図４は、本発明の第１の実施形態の性能分析モジュール２０２の構成例を示す説明図である。
【００５４】
性能分析モジュール２０２は、オーバーラップ期間判定モジュール４０１、ＣＰＵ情報取得モジュール４０２、ＭＰＩ情報取得モジュール４０３、ＧＰＵ情報取得モジュール４０４、同期処理情報取得モジュール４０５、及び分析結果出力モジュール４０６を含む。
【００５５】
オーバーラップ期間判定モジュール４０１は、オーバーラップ区間を特定する。具体的には、オーバーラップ期間判定モジュール４０１は、ソース３０１上のオーバーラップ区間の開始点と、終了点とを特定する。
【００５６】
例えば、ループ内にオーバーラップ区間の開始点と終了点とが含まれる場合、一つのループ処理に対して一つのオーバーラップ区間とみなす。すなわち、ループ処理が繰り返し実行されても、新たなオーバーラップ区間として扱われない。
【００５７】
本実施形態では、実行モジュール３０２を実行しながら時系列にオーバーラップ区間が特定されるため、以下、オーバーラップ区間をオーバーラップ期間とも記載する。すなわち、本実施形態では、オーバーラップ期間における最初の処理が開始された時間と、オーバーラップ期間における最後の処理が終了した時間とによってオーバーラップ期間が特定される。
【００５８】
オーバーラップ期間の開始時間が特定されると、性能分析モジュール２０２は、ＣＰＵ情報取得モジュール４０２、ＭＰＩ情報取得モジュール４０３、ＧＰＵ情報取得モジュール４０４、同期処理情報取得モジュール４０５、及び分析結果出力モジュール４０６を呼び出す。すなわち、オーバーラップ期間が特定されると他のモジュールが実行される。
【００５９】
ＣＰＵ情報取得モジュール４０２は、オーバーラップ期間におけるＣＰＵ１０１処理の性能情報を取得する。
【００６０】
ＭＰＩ情報取得モジュール４０３は、オーバーラップ期間におけるＭＰＩ通信処理の性能情報を取得する。
【００６１】
ＧＰＵ情報取得モジュール４０４は、オーバーラップ期間におけるコピー処理及びカーネル実行処理の性能情報を取得する。以下、コピー処理及びカーネル実行処理を区別しない場合には、ＧＰＵ非同期処理と記載する。
【００６２】
同期処理情報取得モジュール４０５は、オーバーラップ期間における同期処理の性能情報を取得する。
【００６３】
分析結果出力モジュール４０６は、取得された各性能情報から分析結果を生成し、生成された分析結果を出力する。
【００６４】
図５Ａは、本発明の第１の実施形態のオーバーラップ管理情報２１０の一例を示す説明図である。
【００６５】
本実施形態では、オーバーラップ管理情報２１０は、オーバーラップ期間性能情報テーブル２０５、オーバーラップフラグ２１１、テーブル識別子２１２、及びシーケンシャル番号２１３を含む。
【００６６】
オーバーラップ期間性能情報テーブル２０５は、取得対象であるオーバーラップ期間における性能情報に関する情報を格納する。
【００６７】
本実施形態では、一つのオーバーラップ期間毎に一つのオーバーラップ期間性能情報テーブル２０５が生成される。すなわち、ソース３０１に複数のオーバーラップ期間が含まれる場合、一つのオーバーラップ期間毎に一つのオーバーラップ期間性能情報テーブル２０５が生成される。
【００６８】
また、本実施形態では、ループ処理内に含まれるオーバーラップ期間については、ループ処理が実行される度に、同一のオーバーラップ期間性能情報テーブル２０５の情報が更新される。
【００６９】
これは、１回のループ処理毎にオーバーラップ期間性能情報テーブル２０５を生成する場合、データ量が膨大となり、記憶容量の大きいＨＤＤ等の記憶媒体にデータを格納する必要があるためである。すなわち、ＨＤＤ等の記憶媒体に格納するとデータへのアクセスが遅くなり、高速な性能分析を実現できないためである。
【００７０】
そこで、本実施形態では、ループ処理内のオーバーラップ期間については、オーバーラップ期間性能情報テーブル２０５が一度生成されると、ループ処理が繰り返し実行されても、新たなオーバーラップ期間性能情報テーブル２０５は生成されず、既存のオーバーラップ期間性能情報テーブル２０５が更新される。したがって、データ量が小さくなり、メモリ１０２上でデータを処理することが可能となるため、性能分析処理を高速に行える。
【００７１】
さらに、本実施形態では、ループ処理における性能情報に対して統計処理を実行して統計的な情報を算出することによって、出力される分析結果の量を削減し、プログラマが並列処理プログラムの挙動を理解するための労力を削減する。
【００７２】
また、オーバーラップ期間に含まれるループ処理についても同様に、ループ処理内に含まれる処理の性能情報については、新たなエントリ（図５Ｂ参照）が生成されず、既存のエントリの情報が更新される。また、ループ処理内に含まれる処理の性能情報に対して統計処理を実行して統計的な性能情報が算出される。これによって、前述した効果と同様の効果が奏される。
【００７３】
オーバーラップフラグ２１１は、オーバーラップ期間中であるか否かを示す情報を格納する。
【００７４】
テーブル識別子２１２は、現在性能情報が取得されているオーバーラップ期間性能情報テーブル２０５を識別するための識別子を格納する。すなわち、更新対象となるオーバーラップ期間性能情報テーブル２０５を識別するための識別子が格納される。
【００７５】
シーケンシャル番号２１３は、ＧＰＵ非同期処理の実行順番を表す識別番号を格納する。
【００７６】
図５Ｂは、本発明の第１の実施形態のオーバーラップ期間性能情報テーブル２０５の一例を示す説明図である。
【００７７】
オーバーラップ期間性能情報テーブル２０５には、エントリとして、オーバーラップ期間情報５００、ＣＰＵ処理情報５０１、Ｍｅｍｃｐｙ非同期処理情報５０２、ＧＰＵ非同期処理情報５０３、ＭＰＩ非同期処理情報５０４、ＧＰＵ同期処理情報５０５、及びＭＰＩ同期処理情報５０６が含まれる。
【００７８】
オーバーラップ期間情報５００は、特定されたオーバーラップ期間に関する情報を格納する。
【００７９】
ＣＰＵ処理情報５０１は、オーバーラップ期間におけるＣＰＵ処理の性能情報を格納する。
【００８０】
Ｍｅｍｃｐｙ非同期処理情報５０２は、オーバーラップ期間において非同期に実行されるコピー処理の性能情報を格納する。
【００８１】
ＧＰＵ非同期処理情報５０３は、オーバーラップ期間において非同期に実行されるカーネル実行処理の性能情報を格納する。
【００８２】
ＭＰＩ非同期処理情報５０４は、オーバーラップ期間において非同期に実行されるＭＰＩ通信処理の性能情報を格納する。
【００８３】
ＧＰＵ同期処理情報５０５は、オーバーラップ期間における、ＧＰＵ非同期処理に対応する同期処理の性能情報を格納する。ここで、ＧＰＵ非同期処理に対応する同期処理は、ＧＰＵ非同期処理（コピー処理又はカーネル実行処理）の完了を待ってＣＰＵ処理と同期をとるための処理を表す。
【００８４】
ＭＰＩ同期処理情報５０６は、オーバーラップ期間における、ＭＰＩ通信処理に対応する同期処理の性能情報を格納する。ここで、ＭＰＩ通信処理に対応する同期処理は、ＭＰＩ通信処理の完了を待ってＣＰＵ処理と同期を取るための処理を表す。
【００８５】
本実施形態では、一つのオーバーラップ期間性能情報テーブル２０５に、一つのオーバーラップ期間情報５００が含まれる。他のエントリについては、オーバーラップ期間内の一つの処理について一つのエントリが生成される。例えば、一つのオーバーラップ期間において複数のＣＰＵ処理が実行される場合、オーバーラップ期間性能情報テーブル２０５には、各ＣＰＵ処理のエントリ（ＣＰＵ処理情報５０１）が生成される。他の処理についても同様である。
【００８６】
また、本実施形態では、オーバーラップ期間内のループ処理に含まれる処理については、対応するエントリに情報が蓄積される。すなわち、ループ処理が実行される毎に対応するエントリの情報が更新される。また、ループ処理に含まれる処理の性能情報に対して統計処理を実行して統計的な性能情報を算出することによって、データ量を小さくできる。したがって、メモリ１０２上で高速に処理が行え、また、プログラマが並列処理プログラムの挙動を理解するための労力を削減できる。
【００８７】
前述したように、本実施形態では、ループ処理内にオーバーラップ期間が含まれる場合（以下、ケース１とも記載する）と、オーバーラップ期間にループ処理が含まれる場合（以下、ケース２とも記載する）との二つのケースが考えられる。
【００８８】
ケース１の場合、オーバーラップ期間性能情報テーブル２０５の各エントリが更新される。すなわち、ループ処理が繰り返し実行された場合、新たなオーバーラップ期間性能情報テーブル２０５は生成されず、既存のオーバーラップ期間性能情報テーブル２０５に情報が蓄積される。
【００８９】
ケース２の場合、オーバーラップ期間性能情報テーブル２０５のうち、ループ処理に含まれる処理に対応するエントリが更新される。すなわち、ループ処理が繰り返し実行された場合、当該ループ処理内に含まれる処理に対応するエントリは新たに生成されず、既存のエントリの情報が更新される。
【００９０】
なお、ループ処理内のオーバーラップ期間に、さらにループ処理が含まれる場合、ケース１及びケース２の更新方法を組み合わせればよい。
【００９１】
本実施形態では、各処理のエントリについて以下のような情報が取得される。すなわち、オーバーラップ期間性能情報テーブル２０５は、性能情報の項目（カラム）として、開始ｌｉｎｅ５１１、終了ｌｉｎｅ５１２、Ｄｏ−ｉｄ５１３、開始時刻５１４、終了時刻５１５、実行時間５１６、期間回数５１７、同期ｉｄ５１８、終了フラグ５１９、及び個別情報５２０を含む。
【００９２】
開始ｌｉｎｅ５１１は、ソース３０１における、所定の処理の開始を表す命令列のライン番号を格納する。具体的には、オーバーラップ期間情報５００の開始ｌｉｎｅ５１１には、オーバーラップ期間の開始点を表す命令列が記載されたソース３０１のライン番号が格納される。また、他のエントリの開始ｌｉｎｅ５１１には、対応する処理の起動を表す命令列が記載されたソース３０１のライン番号が格納される。
【００９３】
終了ｌｉｎｅ５１２は、ソース３０１における、所定の処理の終了を表す命令列のライン番号を格納する。具体的には、オーバーラップ期間情報５００の終了ｌｉｎｅ５１２には、オーバーラップ期間の終了点を表す命令列が記載されたソース３０１のライン番号が格納される。また、他のエントリの終了ｌｉｎｅ５１２には、対応する処理の終了を表す命令列が記載されたソース３０１のライン番号が格納される。
【００９４】
Ｄｏ−ｉｄ５１３は、ループ処理を識別するための識別子を格納する。具体的には、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３には、現在実行されるループ処理の識別子が格納される。また、他のエントリのＤｏ−ｉｄ５１３には、オーバーラップ期間に含まれるループ処理のうち、エントリに対応する処理が含まれるループ処理の識別子が格納される。
【００９５】
本実施形態では、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３によって、ソース３０１に含まれる、どのループ処理が現在実行されているかを把握することができる。これによって、更新すべきエントリを把握できる。
【００９６】
開始時刻５１４は、エントリに対応する処理が開始された時刻を格納する。終了時刻５１５は、エントリに対応する処理が終了した時刻を格納する。なお、格納される時刻は、計算機の内部時間又は計算機システム全体で共通の時間等を用いる方法が考えられる。
【００９７】
なお、Ｍｅｍｃｐｙ非同期処理情報５０２、ＧＰＵ非同期処理情報５０３、及びＭＰＩ非同期処理情報５０４については、開始時刻５１４及び終了時刻５１５は格納されない。これは性能分析モジュール２０２を実行するＣＰＵ１０１側では、非同期に実行されるＭＰＩ通信処理、コピー処理及びカーネル実行処理の実行状況を把握できないためである。
【００９８】
例えば、ＭＰＩ通信処理では、ＣＰＵ１０１がＭＰＩ通信処理の起動を命令したタイミングと、インタフェース１１０が情報を送信したタイミングとが異なる。これは、インタフェース１１０が、ネットワーク使用状況に応じて送信タイミングを制御するためである。また、Ｍｅｍｃｐｙ非同期処理は、ＣＰＵ１０１がコピー処理の起動を命令したタイミングとＧＰＵメモリ１０６にメモリ内容がコピーされたタイミングとが異なる。また、ＧＰＵ非同期処理では、ＣＰＵ１０１がＧＰＵ１０５に対してカーネル実行処理の起動を命令したタイミングと、ＧＰＵ１０５がカーネル実行処理を開始したタイミングとが異なる。
【００９９】
なお、エントリに対応する処理がループ内の処理である場合、開始時刻５１４及び終了時刻５１５は、１回のループ処理が実行される度に更新される。
【０１００】
実行時間５１６は、エントリに対応する処理の実行時間を格納する。
【０１０１】
例えば、ＣＰＵ処理の実行時間は、終了時刻５１５から開始時刻５１４を減算することによって算出できる。なお、Ｍｅｍｃｐｙ非同期処理情報５０２、ＧＰＵ非同期処理情報５０３、及びＭＰＩ非同期処理情報５０４の実行時間５１６については別途取得される。
【０１０２】
また、エントリに対応する処理がループ内の処理である場合、実行時間５１６にはループ毎の実行時間の合計値が格納される。例えば、ループ処理が２回実行された場合に、１回目のループ処理における実行時間と、２回目のループ処理における実行時間とが加算された値が実行時間５１６に格納される。
【０１０３】
期間回数５１７は、ループ処理の実行回数を格納する。
【０１０４】
具体的には、オーバーラップ期間情報５００の期間回数５１７には、オーバーラップ期間がループ処理に含まれる処理の場合、当該ループ処理の実行回数が格納される。なお、ループ内のオーバーラップ期間でない場合には、期間回数５１７には「１」が格納され、この値は更新されない。
【０１０５】
また、他のエントリの期間回数５１７には、オーバーラップ期間に含まれるループ処理のうち、エントリに対応する処理が含まれるループ処理の実行回数を格納する。さらに、ループ内のオーバーラップ期間である場合、期間回数５１７には、さらに、オーバーラップ期間が含まれるループ処理の実行回数と、エントリに対応する処理が含まれるループ処理の実行回数とを乗算した値が格納される。
【０１０６】
例えば、オーバーラップ期間内の所定の処理を含むループ処理が「３」回実行され、オーバーラップ期間が含まれるループ処理が「４」回実行された場合には、所定の処理のエントリの期間回数５１７には、「１２」が格納される。
【０１０７】
なお、性能分析モジュール２０２は、実行時間５１６を期間回数５１７で除算することによって、ループ処理１回あたりの平均実行時間を算出できる。
【０１０８】
同期ｉｄ５１８は、同期をとるべき非同期処理、すなわち、同期処理に対応する非同期処理を識別するための識別子を格納する。
【０１０９】
例えば、ＧＰＵ非同期処理及びＧＰＵ同期処理の場合、同期ｉｄ５１８には、オーバーラップを実現するために用いられるＣＵＤＡストリームを識別するための識別子が格納される。また、ＭＰＩ通信処理及びＭＰＩ同期処理の場合、同期ｉｄ５１８には、ＭＰＩ通信処理の送信要求又は受信要求を識別するための識別子が格納される。
【０１１０】
終了フラグ５１９は、各非同期処理がＣＰＵ処理との同期を完了したか否かを表すフラグを格納する。例えば、同期が完了していない場合には「０」が、同期が完了した場合には「１」が格納される。
【０１１１】
具体的な処理としては、任意の非同期処理が起動された場合、性能分析モジュール２０２が、対応するエントリの終了フラグに「０」を設定する。当該非同期処理に対応する同期処理が完了した場合、性能分析モジュール２０２が、当該同期処理の同期ｉｄ５１８と同一の同期ｉｄが格納される非同期処理のエントリの終了フラグに「１」を設定する。
【０１１２】
個別情報５２０は、各処理固有の情報を格納する。個別情報５２０の詳細については、図６Ａ〜図６Ｃを用いて後述する。
【０１１３】
ここで、オーバーラップ期間性能情報テーブル２０５の更新例について説明する。
【０１１４】
図２４Ａは、本発明の第１の実施形態におけるソース３０１の一例を示す説明図である。図２４Ｂは、本発明の第１の実施形態におけるオーバーラップ期間性能情報テーブル２０５の一例を示す説明図である。なお、図２４Ａでは、ソース３０１の概念的な図を表す。
【０１１５】
図２４Ａに示すソース３０１は、オーバーラップ期間がループ処理１に含まれる。また、当該オーバーラップ期間には、ループ処理２及びループ処理３が含まれる。すなわち、図２４Ａに示すソース３０１は、ケース１とケース２とが組み合わさったオーバーラップ期間のソースを示す。
【０１１６】
また、ループ処理２にはＣＰＵ処理１が含まれ、ループ処理３にはＣＰＵ処理２が含まれる。
【０１１７】
図２４Ａのソース３０１に対するオーバーラップ期間性能情報テーブル２０５は、図２４Ｂのようになる。
【０１１８】
図２４Ｂは、ループ処理３の処理が実行中である場合のオーバーラップ期間性能情報テーブル２０５を表す。
【０１１９】
オーバーラップ期間情報５００のＤｏ−ｉｄ５１３にはループ処理３の識別子が格納される。これによって、性能分析モジュール２０２は、Ｄｏ−ｉｄ５１３にループ処理３の識別子が格納されたエントリが更新対象であることを把握できる。なお、ループ処理２の処理が実行中である場合、当該Ｄｏ−ｉｄ５１３にはループ処理２の識別子が格納される。また、オーバーラップ期間情報５００の期間回数５１７には、ループ処理１の実行回数が格納される。
【０１２０】
ＣＰＵ処理１のＣＰＵ処理情報５０１のＤｏ−ｉｄ５１３には、ループ処理２の識別子が格納される。また、ＣＰＵ処理１のＣＰＵ処理情報５０１の期間回数５１７には、ループ処理１の実行回数とループ処理２の実行回数との積が格納される。
【０１２１】
ＣＰＵ処理２のＣＰＵ処理情報５０１のＤｏ−ｉｄ５１３には、ループ処理３の識別子が格納される。また、ＣＰＵ処理２のＣＰＵ処理情報５０１の期間回数５１７には、ループ処理１の実行回数とループ処理３の実行回数との積が格納される。
【０１２２】
図６Ａは、本発明の第１の実施形態におけるＣＰＵ処理情報５０１の個別情報５２０の一例を示す説明図である。
【０１２３】
ＣＰＵ処理情報５０１の個別情報５２０は、開始命令カウンタ６０１、終了命令カウンタ６０２、開始ＦＬＯＰカウンタ６０３、終了ＦＬＯＰカウンタ６０４、命令数６０５、及びＦＬＯＰ数６０６を含む。
【０１２４】
開始命令カウンタ６０１は、開始ｌｉｎｅ５１１に対応する処理起動時までに実行された命令数を格納する。
【０１２５】
終了命令カウンタ６０２は、終了ｌｉｎｅ５１２に対応する処理起動時までに実行された命令数を格納する。
【０１２６】
なお、ループ処理の場合、開始命令カウンタ６０１及び終了命令カウンタ６０２には、ループ処理毎に値が格納される。すなわち、１回のループ処理が終了する度に値が削除される。
【０１２７】
開始ＦＬＯＰカウンタ６０３は、開始ｌｉｎｅ５１１に対応する処理起動時における浮動小数点数演算（Ｆｌｏａｔｉｎｇ―ｐｏｉｎｔ  Ｏｐｅｒａｔｉｏｎ）の実行回数を格納する。
【０１２８】
終了ＦＬＯＰカウンタ６０４は、終了ｌｉｎｅ５１２に対応する処理起動時における浮動小数点数演算（Ｆｌｏａｔｉｎｇ―ｐｏｉｎｔ  Ｏｐｅｒａｔｉｏｎ）の実行回数を格納する。
【０１２９】
なお、ループ処理の場合、開始ＦＬＯＰカウンタ６０３及び終了ＦＬＯＰカウンタ６０４には、ループ処理毎に値が格納される。すなわち、１回のループ処理が終了する度に値が削除される。
【０１３０】
命令数６０５は、オーバーラップ期間における、対応するＣＰＵ処理情報５０１に関する実行命令数を格納する。命令数６０５は、例えば、終了命令カウンタ６０２から開始命令カウンタ６０１を減算することによって算出できる。
【０１３１】
なお、ループ処理の場合、ループ処理毎に命令数が算出され、命令数６０５には、ループ毎の命令数の合計値が格納される。すなわち、累積的な値が格納される。
【０１３２】
ＦＬＯＰ数６０６は、オーバーラップ期間における、対応するＣＰＵ処理情報５０１に関する浮動小数点数演算の実行回数を格納する。ＦＬＯＰ数６０６は、例えば、終了ＦＬＯＰカウンタ６０４から開始ＦＬＯＰカウンタ６０３を差分することによって算出できる。
【０１３３】
なお、ループ処理の場合、ループ処理毎にＦＬＯＰ数が算出され、ＦＬＯＰ数６０６には、ループ毎のＦＬＯＰ数の合計値が格納される。すなわち、累積的な値が格納される。
【０１３４】
開始命令カウンタ６０１、終了命令カウンタ６０２、開始ＦＬＯＰカウンタ６０３、終了ＦＬＯＰカウンタ６０４は、ハードウェアモニタ（図示省略）から取得可能な情報である。例えば、ＣＰＵ処理情報５０１の開始ｌｉｎｅ５１１にライン番号が格納された後に、性能分析モジュール２０２が、ハードウェアモニタ（図示省略）に各情報の取得命令を送信する方法が考えられる。
【０１３５】
図６Ｂは、本発明の第１の実施形態におけるＭｅｍｃｐｙ非同期処理情報５０２及びＧＰＵ非同期処理情報５０３の個別情報５２０の一例を示す説明図である。
【０１３６】
Ｍｅｍｃｐｙ非同期処理情報５０２及びＧＰＵ非同期処理情報５０３の個別情報５２０は、シーケンシャル番号６１１を含む。
【０１３７】
Ｍｅｍｃｐｙ非同期処理情報５０２におけるシーケンシャル番号６１１は、実行モジュール３０２の実行中、何番目に実行されたＧＰＵ非同期処理であるかを表す識別子を格納する。
【０１３８】
ＧＰＵ非同期処理情報５０３におけるシーケンシャル番号６１１は、実行モジュール３０２の実行中、何番目に実行されたＧＰＵ非同期処理であるかを表す識別子を格納する。
【０１３９】
性能分析モジュール２０２は、シーケンシャル番号６１１に基づいてＧＰＵ非同期処理情報２０９を参照することによって、Ｍｅｍｃｐｙ非同期処理情報５０２及びＧＰＵ非同期処理情報５０３の実行時間５１６を取得できる。すなわち、ＣＰＵ１０１が把握できない非同期処理の実行時間を取得できる。
【０１４０】
図６Ｃは、本発明の第１の実施形態におけるＭＰＩ非同期処理情報５０４の個別情報５２０の一例を示す説明図である。
【０１４１】
ＭＰＩ非同期処理情報５０４の個別情報５２０は、ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３を含む。
【０１４２】
ＭＰＩ種別６２１は、ＭＰＩ通信処理の種別を格納する。通信サイズ６２２は、ＭＰＩ通信処理において送信又は受信した情報の大きさを格納する。宛先ｎｏｄｅ数６２３は、ＭＰＩ通信の通信先ノードの数を格納する。
【０１４３】
ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３は、例えば、ＰＭＰＩを用いることによって取得できる。
【０１４４】
ここで、ＰＭＰＩとは、ＭＰＩで規定されているプログラミングインターフェースであり、ＭＰＩ関数に、プログラマが定義した機能を追加することができる。ＰＭＰＩを用いて、ＭＰＩ関数実行時に、ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３を取得し、性能分析モジュール２０２に渡す機能を追加する方法が考えられる。
【０１４５】
性能分析モジュール２０２は、取得されたＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３に基づいて、通信時間推定情報２０７を参照することによってＭＰＩ通信処理の実行時間を算出できる。すなわち、ＣＰＵ１０１が把握できないＭＰＩ通信処理の実行時間を取得できる。
【０１４６】
図７Ａ〜図７Ｃは、本発明の第１の実施形態の通信時間推定情報２０７の一例を示す説明図である。
【０１４７】
通信時間推定情報２０７は、ＭＰＩ通信処理の種別毎に図７Ａ〜図７Ｃに示すような情報を格納する。
【０１４８】
図７Ａは、ＭＰＩ通信処理の種別が「ＭＰＩ＿Ｉｓｅｎｄ」である場合の通信時間推定情報２０７である。ここで、「ＭＰＩ＿Ｉｓｅｎｄ」は、データの送信を命令する命令列である。なお、「ＭＰＩ＿Ｉｓｅｎｄ」はノンブロッキング通信であるため、ＣＰＵ１０１は、ＭＰＩ通信処理を起動後した後、送信が完了しているか否かに関わらず別の処理を実行できる。
【０１４９】
図７Ｂは、ＭＰＩ通信処理の種別が「ＭＰＩ＿Ｉｒｅｃｖ」である場合の通信時間推定情報２０７である。ここで、「ＭＰＩ＿Ｉｒｅｃｖ」は、データの受信を命令する命令列である。なお、「ＭＰＩ＿Ｉｒｅｃｖ」はノンブロッキング通信であるため、ＣＰＵ１０１は、ＭＰＩ通信処理を起動した後、受信が完了しているか否かに関わらず別の処理を実行できる。
【０１５０】
図７Ｃは、ＭＰＩ通信処理の種別が「ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ」である場合の通信時間推定情報２０７である。ここで、「ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ」は、指定された全てのプロセスに所定の演算結果の送信を命令する命令列である。本実施形態の計算機システムは２つのＣＰＵを有することから、図７Ｃには宛先ノード数が「１」である場合及び「２」である場合の通信時間推定情報が記載される。なお、「ＭＰＩ＿Ｉａｌｌｒｅｄｕｃｅ」はノンブロッキング通信であるため、ＣＰＵ１０１は、ＭＰＩ通信処理を起動した後、送信が完了しているか否かに関わらず別の処理を実行できる。
【０１５１】
通信時間推定情報２０７は、宛先ｎｏｄｅ数７０１、通信サイズ７０２、及び通信時間７０３を含む。
【０１５２】
宛先ｎｏｄｅ数７０１は、通信先のノード数を格納する。通信サイズ７０２は、ＭＰＩ通信処理において送信又は受信した情報の大きさを格納する。通信時間７０３は、ＭＰＩ通信処理の実行時間を格納する。
【０１５３】
本実施形態では、性能分析モジュール２０２が、個別情報５２０に含まれるＭＰＩ種別６２１に基づいて、当該ＭＰＩ種別６２１に対応する通信時間推定情報２０７を特定する。さらに、性能分析モジュール２０２は、個別情報５２０に含まれる通信サイズ６２２及び宛先ｎｏｄｅ数６２３に基づいて、特定された通信時間推定情報２０７を参照する。性能分析モジュール２０２は、通信サイズ６２２及び宛先ｎｏｄｅ数６２３と、宛先ｎｏｄｅ数７０１及び通信サイズ７０２とが一致するエントリを検索する。性能分析モジュール２０２は、検索結果に基づいて通信時間７０３を取得し、取得された通信時間７０３の値を実行時間５１６に格納する。
【０１５４】
なお、通信時間推定情報２０７は、図７Ａ〜図７Ｃに示すようなテーブルに限定されない。例えば、通信時間推定情報２０７は、データ量等から通信時間を算出するための計算式であってもよい。
【０１５５】
図８は、本発明の第１の実施形態の性能分析モジュール２０２が備える各構成の関係を示す説明図である。
【０１５６】
計測開始情報８０１、非同期処理開始情報８０２、非同期処理完了情報８０３、同期処理開始情報８０４、同期処理完了情報８０５、Ｄｏループ情報８０６、及び計測終了情報８０７は、性能分析モジュール２０２が取得する情報である。
【０１５７】
ＣＰＵ１０１が実行モジュール３０２の実行を開始すると、性能分析モジュール２０２は、コンパイラ２０１によって予め埋め込まれたトラップに基づいて実行モジュール３０２の実行が開始されたことを通知する計測開始情報８０１を取得する。性能分析モジュール２０２は、取得された計測開始情報８０１をオーバーラップ期間判定モジュール４０１に出力する。
【０１５８】
オーバーラップ期間判定モジュール４０１は、入力された計測開始情報８０１に基づいて、オーバーラップ管理情報２１０の初期化処理を実行する。
【０１５９】
また、ＣＰＵ１０１が実行モジュール３０２の実行を終了すると、性能分析モジュール２０２は、コンパイラ２０１によって予め埋め込まれたトラップに基づいて実行モジュール３０２の実行が終了したことを通知する計測終了情報８０７を取得する。性能分析モジュール２０２は、取得された計測終了情報８０７を分析結果出力モジュール４０６に出力する。分析結果出力モジュール４０６は、入力されたオーバーラップ管理情報２１０に基づいて、オーバーラップ計測情報８１０を出力する。
【０１６０】
性能分析モジュール２０２は、前述したＰＭＰＩなどの方法を用いて、非同期処理開始情報８０２、非同期処理完了情報８０３、同期処理開始情報８０４、及び同期処理完了情報８０５を取得する。
【０１６１】
また、性能分析モジュール２０２は、コンパイラ２０１によって埋め込まれたトラップに基づいてＤｏループ情報８０６を取得する。
【０１６２】
性能分析モジュール２０２が前述した各情報を取得すると、各モジュールは、それぞれ、対応する性能情報を取得する。
【０１６３】
オーバーラップ期間判定モジュール４０１は、入力された非同期処理開始情報８０２に基づいて、オーバーラップ期間であるか否かを判定する。なお、入力される非同期処理開始情報８０２には、少なくとも、命令列のライン番号が含まれる。
【０１６４】
また、オーバーラップ期間判定モジュール４０１は、Ｄｏループ情報８０６が入力されると、現在ループ処理が実行されているか否かを判定する。なお、入力されるＤｏループ情報８０６には、少なくとも、ループ処理の識別子が含まれる。
【０１６５】
ＣＰＵ情報取得モジュール４０２は、非同期処理開始情報８０２又は同期処理開始情報８０４が入力されると、ＣＰＵ１０１の性能情報を取得する。なお、入力される非同期処理開始情報８０２及び同期処理開始情報８０４には、少なくとも、命令列のライン番号と開始時刻とが含まれる。
【０１６６】
ＣＰＵ情報取得モジュール４０２は、非同期処理完了情報８０３又は同期処理完了情報８０５が入力されると、ＣＰＵ１０１の性能情報を取得する。なお、入力される非同期処理完了情報８０３及び同期処理完了情報８０５には、少なくとも、命令列のライン番号及び終了時刻が含まれる。
【０１６７】
ＭＰＩ情報取得モジュール４０３は、非同期処理開始情報８０２が入力されると、ＭＰＩ通信処理の性能情報を取得する。なお、入力される非同期処理開始情報８０２には、少なくとも、命令列のライン番号、ＭＰＩ通信処理の種別、通信サイズ、及び宛先ノード数が含まれる。
【０１６８】
なお、ＭＰＩ情報取得モジュール４０３は、実行時間を取得するときには、通信時間推定情報２０７を参照して、ＭＰＩ通信処理の実行時間を取得する。
【０１６９】
ＭＰＩ情報取得モジュール４０３は、非同期処理完了情報８０３が入力されると、ＭＰＩ通信処理の性能情報を取得する。なお、入力される非同期処理完了情報８０３には、少なくとも、命令列のライン番号が含まれる。
【０１７０】
ＧＰＵ情報取得モジュール４０４は、非同期処理開始情報８０２が入力されると、ＧＰＵ非同期処理（コピー処理又はカーネル実行処理）の性能情報を取得する。なお、入力される非同期処理開始情報８０２には、少なくとも、命令列のライン番号が含まれる。
【０１７１】
ＧＰＵ情報取得モジュール４０４は、ＧＰＵ非同期処理情報２０９を参照して、ＧＰＵ非同期処理（コピー処理又はカーネル実行処理）の性能情報の取得処理を実行する。
【０１７２】
ＧＰＵ情報取得モジュール４０４は、非同期処理完了情報８０３が入力されると、ＧＰＵ非同期処理（コピー処理又はカーネル実行処理）の性能情報を取得する。なお、入力される非同期処理完了情報８０３には、少なくとも、命令列のライン番号が含まれる。
【０１７３】
同期処理情報取得モジュール４０５は、同期処理開始情報８０４が入力されると、ＧＰＵ同期処理又はＭＰＩ同期処理の性能情報を取得する。なお、入力される同期処理開始情報８０４には、命令列のライン番号、及び、非同期処理の起動開始を表す命令列に含まれる識別情報が含まれる。
【０１７４】
例えば、カーネル実行処理では、ＣＵＤＡストリームの識別子が同期処理開始情報８０４に含まれる。また、ＭＰＩ通信処理では、送信処理の識別子又は受信処理の識別子が同期処理開始情報８０４に含まれる。また、先行する全ての非同期処理、又は一部の複数の非同期処理の完了を待つ同期処理の場合、同期処理開始情報８０４には、「全て」又は「複数識別子」を示す識別情報が含まれる。
【０１７５】
同期処理情報取得モジュール４０５は、同期処理完了情報８０５が入力されると、ＧＰＵ同期処理又はＭＰＩ同期処理の性能情報を取得する。なお、入力される同期処理完了情報８０５には、少なくとも、命令列のライン番号が含まれる。
【０１７６】
図９は、本発明の第１の実施形態におけるＣＰＵ１０１が実行する処理の概要を説明するフローチャートである。
【０１７７】
ＣＰＵ１０１は、ユーザからソース３０１の入力を受け付けると（ステップ９０１）、ロードモジュール生成処理を実行する（ステップ９０２）。具体的には、ＣＰＵ１０１は、メモリ上に読み出されたコンパイラ２０１を実行する。これによって、コンパイラ２０１が、ソース３０１からトラップ埋め込みロードモジュール２０３を生成する。
【０１７８】
なお、ロードモジュール生成処理の詳細については、図１０を用いて後述する。
【０１７９】
ＣＰＵ１０１は、リンカ２０４を実行することによって、生成されたトラップ埋め込みロードモジュール２０３と性能分析モジュール２０２とから実行モジュール３０２を生成する（ステップ９０３）。
【０１８０】
ＣＰＵ１０１は、生成された実行モジュール３０２を実行し（ステップ９０４）、また、性能分析処理を実行する（ステップ９０５）。なお、性能分析処理の詳細については後述する。
【０１８１】
ＣＰＵ１０１は、性能分析処理の結果を出力し（ステップ９０６）、処理を終了する。
【０１８２】
図１０は、本発明の第１の実施形態におけるロードモジュール生成処理の詳細を説明するフローチャートである。
【０１８３】
コンパイラ２０１は、入力されたソース３０１を解析する（ステップ１００１）。
【０１８４】
コンパイラ２０１は、解析結果に基づいて、ソース３０１にトラップを埋め込む（ステップ１００２）。
【０１８５】
具体的には、コンパイラ２０１は、解析結果に基づいて、ソース３０１におけるプログラム（実行モジュール３０２）の実行開始及び終了位置、並びに、ループ処理の位置を特定する。さらに、コンパイラ２０１は、特定されたプログラムの実行開始時、プログラムの実行終了時、ループ開始直前、及びループ終了直後に、性能分析モジュール２０２を呼び出すトラップを埋め込む。
【０１８６】
コンパイラ２０１は、トラップが埋め込まれたソース３０１をコンパイルしてトラップ埋め込みロードモジュール２０３を生成し（ステップ１００３）、処理を終了する。
【０１８７】
以下、性能分析処理について説明する。
【０１８８】
図１１Ａ及び図１１Ｂは、本発明の第１の実施形態の性能分析モジュール２０２が実行する性能分析処理における各モジュールの処理を説明するＰＡＤ図である。
【０１８９】
なお、図１１Ａ及び図１１Ｂは、各モジュールの処理内容を、そのモジュールが起動される順序に合わせて説明するものである。非同期処理開始情報８０２、非同期処理完了情報８０３、同期処理開始情報８０４、同期処理完了情報８０５、Ｄｏループ情報８０６が入力されたときの各処理の流れについては、図１２〜図１７を用いて後述する。
【０１９０】
計測開始情報８０１が入力されると、以下のような処理が実行される。
【０１９１】
オーバーラップ期間判定モジュール４０１は、初期化処理を実行する（１１０１）。
【０１９２】
具体的には、オーバーラップ期間判定モジュール４０１は、オーバーラップフラグ２１１に対応する変数Ｏｖｅｒｗｒａｐに「０」を設定し、また、テーブル識別子２１２に「０」を設定する。
【０１９３】
ここで、変数Ｏｖｅｒｗｒａｐに「０」が設定される場合、すなわち、オーバーラップフラグ２１１が「０」の場合、オーバーラップ期間でないことを表す。また、変数Ｏｖｅｒｗｒａｐに「１」が設定される場合、すなわち、オーバーラップフラグ２１１が「１」である場合、オーバーラップ期間であることを表す。
【０１９４】
また、オーバーラップフラグ２１１が「１」の場合、テーブル識別子２１２には、現在、性能情報が取得されているオーバーラップ期間性能情報テーブル２０５の識別子が格納される。これによって、性能分析モジュール２０２は、取得された性能情報を格納するオーバーラップ期間性能情報テーブル２０５を把握することができる。
【０１９５】
一方、ＧＰＵ情報取得モジュール４０４は、ＧＰＵ非同期処理についての初期化処理を実行する（１１０２）。
【０１９６】
具体的には、ＧＰＵ情報取得モジュール４０４は、ＧＰＵ非同期処理情報２０９のシーケンシャル番号２１３に「０」を設定し、ＧＰＵプロファイラ２０８を起動する。
【０１９７】
本実施形態では、起動されたＧＰＵプロファイラ２０８は、実行モジュール３０２の実行中、ＧＰＵ非同期処理（カーネル実行処理又はコピー処理）が起動される度に、シーケンシャル番号２１３を更新する。また、ＧＰＵプロファイラ２０８は、シーケンシャル番号とＧＰＵ非同期処理の性能情報とを対応づけてＧＰＵ非同期処理情報２０９に格納する。なお、シーケンシャル番号２１３は、ＧＰＵ非同期処理情報２０９に格納されたＧＰＵ非同期処理の性能情報を取得するために使用される。
【０１９８】
前述した二つの初期化処理が終了すると、性能分析モジュール２０２は、非同期処理、同期処理、及びループ処理の性能情報の取得処理を開始する。
【０１９９】
非同期処理開始情報８０２が入力された場合、以下のような処理が実行される。なお、オーバーラップ期間判定モジュール４０１及びＣＰＵ情報取得モジュール４０２は、非同期処理開始情報８０２がＭＰＩ通信処理及びＧＰＵ非同期処理（コピー処理又はカーネル実行処理）の何れでも同一の処理を実行する。一方、非同期処理開始情報８０２がＭＰＩ通信処理を示す場合、ＭＰＩ情報取得モジュール４０３が処理を実行し、非同期処理開始情報８０２がＧＰＵ非同期処理を示す場合、ＧＰＵ情報取得モジュール４０４が処理を実行する。
【０２００】
オーバーラップ期間判定モジュール４０１は、オーバーラップ期間が開始されたか否かを判定する（１１０３）。
【０２０１】
本実施形態では、ＭＰＩ通信処理及びＧＰＵ非同期処理等の任意の非同期処理の起動された時に、当該非同期処理の他に実行中の非同期処理が存在しない場合に、当該任意の非同期処理が起動された時がオーバーラップ期間の開始点として特定される。
【０２０２】
具体的には、オーバーラップフラグ２１１が「０」である場合に、非同期処理開始情報８０２が入力されると、オーバーラップ期間判定モジュール４０１は、オーバーラップ期間の開始と判定する。すなわち、オーバーラップフラグ２１１が「０」であるため先行するオーバーラップ期間が完了しており、かつ、最初の非同期処理が開始された時が、オーバーラップ期間の開始点と判定される。
【０２０３】
オーバーラップ期間の開始と判定された場合、オーバーラップ期間判定モジュール４０１は、当該オーバーラップ期間がループ処理内のオーバーラップ期間であるか否かを判定する（１１３５）。
【０２０４】
具体的には、オーバーラップ期間判定モジュール４０１は、オーバーラップ管理情報２１０に格納されるオーバーラップ期間性能情報テーブル２０５を参照して、オーバーラップ期間情報５００の開始ｌｉｎｅ５１１が、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するオーバーラップ期間性能情報テーブル２０５が存在するか否かを判定する。これは、ループ処理内に含まれるオーバーラップ期間である場合、既存のオーバーラップ期間性能情報テーブル２０５に情報を蓄積するためである。
【０２０５】
オーバーラップ期間情報５００の開始ｌｉｎｅ５１１が、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するオーバーラップ期間性能情報テーブル２０５が存在する場合には、ループ処理内のオーバーラップ期間であると判定される。
【０２０６】
ループ処理内のオーバーラップ期間であると判定された場合、オーバーラップ期間判定モジュール４０１は、既存のオーバーラップ期間性能情報テーブル２０５を表す識別子をテーブル識別子２１２に格納し、当該オーバーラップ期間性能情報テーブル２０５のオーバーラップ期間情報５００の期間回数５１７を更新する（１１０４）。
【０２０７】
具体的には、オーバーラップ期間判定モジュール４０１は、非同期処理開始情報８０２に含まれる命令列のライン番号を当該オーバーラップ期間性能情報テーブル２０５の識別子としてテーブル識別子２１２に格納する。また、オーバーラップ期間判定モジュール４０１は、オーバーラップ期間情報５００の期間回数５１７の値を「１」加算する。
【０２０８】
ループ処理内のオーバーラップ期間でないと判定された場合、オーバーラップ期間判定モジュール４０１は、新たにオーバーラップ期間性能情報テーブル２０５を生成する（１１０５）。
【０２０９】
具体的には、オーバーラップ期間判定モジュール４０１は、テーブル識別子２１２に非同期処理開始情報８０２に含まれる命令列のライン番号を格納する。また、オーバーラップ期間判定モジュール４０１は、生成されたオーバーラップ期間性能情報テーブル２０５のオーバーラップ期間情報５００の開始ｌｉｎｅ５１１に、非同期処理開始情報８０２に含まれる命令列のライン番号を格納する。また、オーバーラップ期間判定モジュール４０１は、当該オーバーラップ期間性能情報テーブル２０５のオーバーラップ期間情報５００の期間回数５１７に「１」を格納する。
【０２１０】
一方、ＣＰＵ情報取得モジュール４０２は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１０６）。すなわち、オーバーラップ期間であるか否かが判定される。
【０２１１】
オーバーラップフラグ２１１が「１」でないと判定された場合には、ＣＰＵ処理の性能情報は取得されない。
【０２１２】
オーバーラップフラグ２１１が「１」であると判定された場合、ＣＰＵ情報取得モジュール４０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５のＣＰＵ処理情報５０１を更新する（１１０７）。
【０２１３】
これは、オーバーラップ期間におけるＣＰＵ１０１自身の処理（ＣＰＵ処理）が終了したことを意味するためである。すなわち、オーバーラップ期間において、非同期処理が起動された場合、ＣＰＵ処理から非同期処理に切り替わるためである。
【０２１４】
なお、オーバーラップ期間が開始された直後は、オーバーラップフラグ２１１はまだ「０」であるため、ＣＰＵ処理情報５０１は更新されない。後述する手順１１０９においてオーバーラップフラグ２１１が「１」に設定され、さらに、新たな非同期処理開始情報８０２が入力された場合に、当該取得処理が実行される。したがって、更新対象となるエントリは、オーバーラップ期間において、非同期処理が開始される直前まで実行されていたＣＰＵ処理のＣＰＵ処理情報５０１である。
【０２１５】
更新処理では、ＣＰＵ情報取得モジュール４０２は、非同期処理開始情報８０２に含まれる命令列のライン番号から「１」減算した値をＣＰＵ処理情報５０１の終了ｌｉｎｅ５１２に格納し、ＣＰＵ処理情報５０１の終了時刻５１５に非同期処理が起動された時間を格納する。また、ＣＰＵ情報取得モジュール４０２は、ＣＰＵ処理の実行時間を実行時間５１６に格納する。
【０２１６】
また、ＣＰＵ情報取得モジュール４０２は、ハードウェアモニタ（図示省略）を実行することによって、終了命令カウンタ及び終了ＦＬＯＰカウンタの値を取得して、取得されたそれぞれの値を終了命令カウンタ６０２及び終了ＦＬＯＰカウンタ６０４に格納する。さらに、ＣＰＵ情報取得モジュール４０２は、実行された命令の数を命令数６０５に格納し、また、実行された演算の数をＦＬＯＰ数６０６に格納する。
【０２１７】
なお、ループ内のＣＰＵ処理の場合には、既存のＣＰＵ処理情報５０１が更新される。具体的には、実行時間５１６には各ループの実行時間の合計値が格納され、命令数６０５、ＦＬＯＰ数６０６にはそれぞれ、各ループの命令数、ＦＬＯＰ数の合計値が格納される。また、期間回数５１７には「１」加算された値が格納される。ループ内のＣＰＵ処理に対応するＣＰＵ処理情報５０１の更新方法は、図１４を用いて後述する。
【０２１８】
一方、オーバーラップ期間判定モジュール４０１は、オーバーラップフラグ２１１が「０」であるか否かを判定する（１１０８）。
【０２１９】
オーバーラップフラグ２１１が「０」でないと判定された場合、処理は実行されない。
【０２２０】
オーバーラップフラグ２１１が「０」であると判定された場合、オーバーラップ期間判定モジュール４０１は、オーバーラップフラグ２１１を「１」に設定する（１１０９）。
【０２２１】
一方、非同期処理開始情報８０２がＭＰＩ通信処理を示す場合、ＭＰＩ情報取得モジュール４０３は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１１０）。
【０２２２】
オーバーラップフラグ２１１が「１」でないと判定された場合、ＭＰＩ通信処理の性能情報は取得されない。
【０２２３】
オーバーラップフラグ２１１が「１」であると判定された場合、ＭＰＩ情報取得モジュール４０３は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５にＭＰＩ非同期処理情報５０４のエントリを生成し、生成されたＭＰＩ非同期処理情報５０４に性能情報を格納する（１１１１）。
【０２２４】
具体的には、ＭＰＩ情報取得モジュール４０３は、ＭＰＩ非同期処理情報５０４の開始ｌｉｎｅ５１１に、非同期処理開始情報８０２に含まれる命令列のライン番号を格納し、ＭＰＩ非同期処理情報５０４の同期ｉｄ５１８にＭＰＩ通信処理を識別するための識別子を格納する。また、ＭＰＩ情報取得モジュール４０３は、期間回数５１７に「１」を設定する。また、ＭＰＩ情報取得モジュール４０３は、終了フラグ５１９に「０」を設定する。
【０２２５】
また、ＭＰＩ情報取得モジュール４０３は、個別情報５２０のＭＰＩ種別６２１、通信サイズ６２２及び宛先ｎｏｄｅ数６２３のそれぞれに対応する値を格納する。
【０２２６】
さらに、ＭＰＩ情報取得モジュール４０３は、個別情報５２０に基づいて、通信時間推定情報２０７を参照することによって通信時間を算出し、算出された通信時間を推定実行時間として実行時間５１６に格納する。
【０２２７】
なお、ループ内のＭＰＩ通信処理の場合には、既存のＭＰＩ非同期処理情報５０４が更新される。具体的には、実行時間５１６にはループ毎の実行時間の合計値が格納され、期間回数５１７には「１」加算された値が格納される。ループ内のＭＰＩ通信処理に対応するＭＰＩ非同期処理情報５０４の更新方法は、図１３Ｂを用いて後述する。
【０２２８】
一方、非同期処理開始情報８０２がＧＰＵ非同期処理（カーネル実行処理又はコピー処理）を示す場合、ＧＰＵ情報取得モジュール４０４は、オーバーラップフラグ２１１が「１」であるか否かにかかわらず、シーケンシャル番号２１３の値に「１」を加算する（１１１２）。
【０２２９】
当該値は、非同期処理開始情報８０２に対応するＧＰＵ非同期処理（コピー処理又はカーネル実行処理）のＧＰＵ非同期処理情報２０９内の実行順番を表す値となる。
【０２３０】
また、ＧＰＵ情報取得モジュール４０４は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１１３）。
【０２３１】
オーバーラップフラグ２１１が「１」でないと判定された場合には、ＧＰＵ非同期処理の性能情報は取得されない。
【０２３２】
オーバーラップフラグ２１１が「１」であると判定された場合、ＧＰＵ情報取得モジュール４０４は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５にＭｅｍｃｐｙ非同期処理情報５０２又はＧＰＵ非同期処理情報５０３のエントリを生成し、生成されたＭｅｍｃｐｙ非同期処理情報５０２又はＧＰＵ非同期処理情報５０３に性能情報を格納する（１１１４）。
【０２３３】
具体的には、ＧＰＵ情報取得モジュール４０４は、Ｍｅｍｃｐｙ非同期処理情報５０２（又はＧＰＵ非同期処理情報５０３）の開始ｌｉｎｅ５１１に、非同期処理開始情報８０２に含まれる命令列のライン番号を格納し、Ｍｅｍｃｐｙ非同期処理情報５０２（又はＧＰＵ非同期処理情報５０３）の同期ｉｄ５１８にＧＰＵ非同期処理を識別するための識別子を格納する。また、ＧＰＵ情報取得モジュール４０４は、期間回数５１７に「１」を設定し、終了フラグ５１９に「０」を設定する。
【０２３４】
さらに、ＧＰＵ情報取得モジュール４０４は、Ｍｅｍｃｐｙ非同期処理情報５０２（又はＧＰＵ非同期処理情報５０３）のシーケンシャル番号６１１に、シーケンシャル番号２１３の値を格納する。
【０２３５】
なお、ループ内のＧＰＵ非同期処理の場合には、既存のＭｅｍｃｐｙ非同期処理情報５０２又はＧＰＵ非同期処理情報５０３が更新される。具体的には、実行時間５１６にはループ毎の実行時間の合計値が格納され、期間回数５１７には「１」加算された値が格納される。また、シーケンシャル番号６１１には、新たなシーケンシャル番号が追加される。例えば、１回目のループ処理におけるシーケンシャル番号２１３が「２０」、２回目のループ処理におけるシーケンシャル番号２１３が「５５」である場合、シーケンシャル番号６１１には「２０」及び「５５」が格納される。
【０２３６】
ループ処理におけるＧＰＵ非同期処理に対応するエントリ（Ｍｅｍｃｐｙ非同期処理情報５０２及びＧＰＵ非同期処理情報５０３）の更新方法は、図１３Ｃを用いて後述する。
【０２３７】
非同期処理完了情報８０３が入力された場合、以下のような処理が実行される。
【０２３８】
ＣＰＵ情報取得モジュール４０２は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１１５）。
【０２３９】
オーバーラップフラグ２１１が「１」でないと判定された場合、ＣＰＵ処理の性能情報は取得されない。
【０２４０】
オーバーラップフラグ２１１が「１」であると判定された場合、ＣＰＵ情報取得モジュール４０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５にＣＰＵ処理情報５０１のエントリを生成し、生成されたＣＰＵ処理情報５０１に性能情報を格納する（１１１６）。これは、オーバーラップ期間においてＣＰＵ処理が開始したことを意味するためである。すなわち、非同期処理が終了した場合、非同期処理からＣＰＵ処理に切り替わるためである。
【０２４１】
具体的には、ＣＰＵ情報取得モジュール４０２は、非同期処理完了情報８０３に含まれる命令列のライン番号に「１」加算した値をＣＰＵ処理情報５０１の開始ｌｉｎｅ５１１に格納し、開始時刻５１４に非同期処理が完了した時間を格納する。また、ＣＰＵ情報取得モジュール４０２は、ハードウェアモニタを呼び出し、開始命令カウンタ及び開始ＦＬＯＰカウンタの値を取得し、取得された値を開始命令カウンタ６０１及び開始ＦＬＯＰカウンタ６０３のそれぞれに格納する。
【０２４２】
なお、ループ内のＣＰＵ処理の場合には、既存のＣＰＵ処理情報５０１が更新される。具体的には、命令数６０５、ＦＬＯＰ数６０６には、ループ毎の値が格納される。実行時間５１６にはループ毎の実行時間の合計値が格納される。ループ処理におけるＣＰＵ処理に対応するＣＰＵ処理情報５０１の更新方法は、図１４を用いて後述する。
【０２４３】
同期処理開始情報８０４が入力された場合、以下のような処理が実行される。
【０２４４】
ＣＰＵ情報取得モジュール４０２は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１１７）。
【０２４５】
オーバーラップフラグ２１１が「１」でないと判定された場合、ＣＰＵ処理の性能情報は取得されない。
【０２４６】
オーバーラップフラグ２１１が「１」であると判定された場合、ＣＰＵ情報取得モジュール４０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５のＣＰＵ処理情報５０１を更新する（１１１８）。これは、ＣＰＵ１０１は同期処理が完了するまで他の処理を実行しないため、ＣＰＵ情報取得モジュール４０２は、ＣＰＵ処理の終了に関する情報を格納する。
【０２４７】
更新対象となるエントリは、同期処理開始情報８０４に対応する同期処理が起動される直前まで実行されていたＣＰＵ処理のＣＰＵ処理情報５０１である。
【０２４８】
更新処理では、ＣＰＵ情報取得モジュール４０２は、同期処理開始情報８０４に含まれる命令列のライン番号から「１」減算した値をＣＰＵ処理情報５０１の終了ｌｉｎｅ５１２に格納し、同期処理が起動された時間を終了時刻５１５に格納する。また、ＣＰＵ情報取得モジュール４０２は、期間回数５１７に「１」を設定する。
【０２４９】
さらに、ＣＰＵ情報取得モジュール４０２は、ハードウェアモニタから終了カウンタ及び終了ＦＬＯＰカウンタの値を取得し、取得された値を終了命令カウンタ６０２及び終了ＦＬＯＰカウンタ６０４のそれぞれに格納する。また、ＣＰＵ情報取得モジュール４０２は、実行時間５１６、命令数６０５及びＦＬＯＰ数６０６に格納する値を算出し、算出された値を格納する。
【０２５０】
なお、ループ内のＣＰＵ処理の場合、期間回数５１７には「１」加算された値が格納される。
【０２５１】
一方、同期処理情報取得モジュール４０５は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１１９）。
【０２５２】
オーバーラップフラグ２１１が「１」でないと判定された場合、同期処理の性能情報は取得されない。
【０２５３】
オーバーラップフラグ２１１が「１」であると判定された場合、同期処理情報取得モジュール４０５は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、同期処理のエントリ（ＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６）を生成し、生成されたエントリに性能情報を格納する（１１２０）。
【０２５４】
具体的には、ＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６の開始ｌｉｎｅ５１１、及び開始時刻５１４にそれぞれの値が格納される。
【０２５５】
なお、ループ内の同期処理である場合には、既存のＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６が更新される。ループ処理における同期処理に対応するＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６の更新方法は、図１５を用いて後述する。
【０２５６】
同期処理完了情報８０５が入力された場合、以下のような処理が実行される。
【０２５７】
同期処理情報取得モジュール４０５は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１２１）。
【０２５８】
オーバーラップフラグ２１１が「１」でないと判定された場合、同期処理の性能情報は取得されない。
【０２５９】
オーバーラップフラグ２１１が「１」であると判定された場合、同期処理情報取得モジュール４０５は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５において、対応する同期処理のエントリを更新する（１１２２）。
【０２６０】
具体的には、同期ｉｄ５１８が同期処理完了情報８０５に含まれる同期ｉｄと一致するエントリ（ＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６）の終了時刻５１５、実行時間５１６、及び期間回数５１７にそれぞれの値が格納される。
【０２６１】
なお、ループ内の同期処理である場合には、既存のＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６が更新される。ループ処理における同期処理に対応するＧＰＵ同期処理情報５０５又はＭＰＩ同期処理情報５０６の更新方法は、図１６を用いて後述する。
【０２６２】
さらに、同期処理情報取得モジュール４０５は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、同期処理完了情報８０５に対応する非同期処理が存在するか否かを判定する（１１２３）。
【０２６３】
具体的には、以下のような処理が実行される。
【０２６４】
ＧＰＵ同期処理情報５０５の場合、当該エントリの同期ｉｄ５１８と同一の同期ｉｄ５１８であるＧＰＵ非同期処理（カーネル実行処理又はコピー処理）のエントリが存在するか否かが判定する。また、ＭＰＩ同期処理情報５０６の場合、当該エントリの同期ｉｄ５１８と同一の同期ｉｄ５１８であるＭＰＩ非同期処理情報５０４が存在するか否かが判定される。
【０２６５】
ＧＰＵ同期処理情報５０５の同期ｉｄ５１８と同一の同期ｉｄ５１８であるＧＰＵ非同期処理のエントリが存在する場合、又は、ＭＰＩ同期処理情報５０６の同期ｉｄ５１８と同一の同期ｉｄ５１８であるＭＰＩ非同期処理情報５０４が存在する場合、対応する非同期処理があると判定される。
【０２６６】
対応する非同期処理があると判定された場合、同期処理情報取得モジュール４０５は、対応する非同期処理のエントリに終了フラグを付与する（１１２４）。
【０２６７】
具体的には、同期処理情報取得モジュール４０５は、対応するＭｅｍｃｐｙ非同期処理情報５０２、ＧＰＵ非同期処理情報５０３又はＭＰＩ非同期処理情報５０４の終了フラグ５１９に「１」を設定する。
【０２６８】
なお、同期処理情報エントリの同期ｉｄ５１８が、先行する「全て」又は「複数」の非同期処理を示している場合、対応する全ての非同期処理のエントリの終了フラグ５１９が「１」に設定される。
【０２６９】
一方、オーバーラップ期間判定モジュール４０１は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１２５）。
【０２７０】
オーバーラップフラグ２１１が「１」でないと判定された場合、処理は実行されない。
【０２７１】
オーバーラップフラグ２１１が「１」であると判定された場合、オーバーラップ期間判定モジュール４０１は、オーバーラップ期間内の全ての非同期処理が終了したか否かを判定する（１１２６）。
【０２７２】
本実施形態では、性能分析モジュール２０２は、任意の同期処理が終了することによって、対応する非同期処理の終了を検知する。さらに、終了した当該非同期処理の他に実行中の非同期処理が存在しない場合に、当該任意の非同期処理が終了した時がオーバーラップ期間の終了点として特定される。
【０２７３】
具体的には、オーバーラップ期間判定モジュール４０１は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、同期ｉｄ５１８に識別子が格納される全てのエントリの終了フラグ５１９が「１」であるか否かを判定する。
【０２７４】
テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５において、同期ｉｄ５１８に識別子が格納される全てのエントリの終了フラグ５１９が「１」である場合には、オーバーラップ期間内の全ての非同期処理が終了したと判定される。
【０２７５】
オーバーラップ期間内の全ての非同期処理が終了していないと判定された場合、性能情報の取得処理が継続される。
【０２７６】
オーバーラップ期間内の全ての非同期処理が終了したと判定された場合、オーバーラップ期間判定モジュール４０１は、オーバーラップ期間の終了と判定し、オーバーラップフラグ２１１を「０」に設定し、さらに、テーブル識別子２１２を「０」に設定する（１１２７）。これによって、性能分析モジュール２０２は、現在オーバーラップ期間内の処理が実行されていないことを把握できる。
【０２７７】
一方、ＣＰＵ情報取得モジュール４０２は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１２８）。
【０２７８】
オーバーラップフラグ２１１が「１」でないと判定された場合、ＣＰＵ処理の性能情報は取得されない。
【０２７９】
オーバーラップフラグ２１１が「１」であると判定された場合、ＣＰＵ情報取得モジュール４０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５にＣＰＵ処理情報５０１のエントリを生成し、生成されたＣＰＵ処理情報５０１に性能情報を格納する（１１２９）。これは、同期処理が完了した後、新たにＣＰＵ処理が起動されるためである。
【０２８０】
具体的には、ＣＰＵ情報取得モジュール４０２は、同期処理完了情報８０５に含まれる命令列のライン番号に「１」加算した値をＣＰＵ処理情報５０１の開始ｌｉｎｅ５１１に格納し、同期処理完了情報８０５に対応する同期処理が完了した時刻を開始時刻５１４に格納する。また、ＣＰＵ情報取得モジュール４０２は、ハードウェアモニタを呼び出し、開始命令カウンタ及び開始ＦＬＯＰカウンタの値を取得し、取得された値を開始命令カウンタ６０１及び開始ＦＬＯＰカウンタ６０３のそれぞれに格納する。
【０２８１】
なお、ループ内のＣＰＵ処理の場合には、既存のＣＰＵ処理情報５０１が更新される。当該処理は、手順１１１６と同一の処理である。
【０２８２】
Ｄｏループ情報８０６が入力された場合、以下のような処理が実行される。
【０２８３】
オーバーラップ期間判定モジュール４０１は、オーバーラップフラグ２１１が「１」であるか否かを判定する（１１３０）。
【０２８４】
オーバーラップフラグ２１１が「１」でないと判定された場合、処理は実行されない。
【０２８５】
オーバーラップフラグ２１１が「１」であると判定された場合、オーバーラップ期間判定モジュール４０１は、Ｄｏループ情報８０６がループ処理の入口処理命令又はループ処理の出口処理命令の何れであるか判定する（１１３１）。
【０２８６】
Ｄｏループ情報８０６がループ処理の入口処理命令であると判定された場合、オーバーラップ期間判定モジュール４０１は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５において、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３にループ処理の識別子を格納する（１１３２）。
【０２８７】
Ｄｏループ情報８０６がループ処理の出口処理命令であると判定された場合、オーバーラップ期間判定モジュール４０１は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５において、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３からループ処理の識別子を削除して、さらに「０」を格納する（１１３３）。
【０２８８】
計測終了情報８０７が入力されると、分析結果出力モジュール４０６は、ＧＰＵプロファイラ２０８を停止し、ＧＰＵ非同期処理の実行時間５１６を更新する（１１３６）。
【０２８９】
具体的には、ＧＰＵ非同期処理情報２０９に格納される性能情報がシーケンシャル番号順に読み出され、Ｍｅｍｃｐｙ非同期処理情報５０２及びＧＰＵ非同期処理情報５０３のシーケンシャル番号６１１に対応するＧＰＵ非同期処理の実行時間が実行時間５１６に格納される。シーケンシャル番号６１１に複数のシーケンシャル番号が格納されている場合は、対応するＧＰＵ非同期処理の実行時間の合計が実行時間５１６に格納される。
【０２９０】
さらに分析結果出力モジュール４０６は、オーバーラップ管理情報２１０からオーバーラップ期間性能情報テーブル２０５を読み出し、分析結果をオーバーラップ計測情報８１０として出力する（１１３４）。
【０２９１】
図１２は、本発明の第１の実施形態における性能分析処理の流れを説明するフローチャートである。
【０２９２】
性能分析モジュール２０２は、計測開始情報８０１が入力されるとオーバーラップ期間の性能情報の取得処理を開始する（ステップ１２０１）。
【０２９３】
具体的には、性能分析モジュール２０２は、オーバーラップフラグ２１１に「０」を設定し、テーブル識別子２１２に「０」を設定し、また、シーケンシャル番号２１３に「０」を設定する。また、性能分析モジュール２０２は、ＧＰＵプロファイラ２０８を起動する。
【０２９４】
実行モジュール３０２の実行中に非同期処理が起動されると、性能分析モジュール２０２は、非同期処理開始情報８０２を取得し、オーバーラップ期間内であるか否かを判定する（ステップ１２０２）。すなわち、起動された非同期処理が最初に起動された非同期処理であるか否かが判定される。
【０２９５】
具体的には、性能分析モジュール２０２は、オーバーラップフラグ２１１が「０」であるか否かを判定する。オーバーラップフラグ２１１が「０」である場合、最初に起動された非同期処理であるため、オーバーラップの開始と判定される。
【０２９６】
オーバーラップ期間内であると判定された場合、性能分析モジュール２０２は、ステップ１２０４に進む。これは、すでに、オーバーラップ期間の性能情報の取得処理が実行されていることを表すためである。
【０２９７】
オーバーラップ期間内でないと判定された場合、性能分析モジュール２０２は、オーバーラップ管理情報２１０を参照して、対応するオーバーラップ期間性能情報テーブル２０５が存在するか否かを判定する（ステップ１２０３）。すなわち、ループ処理内のオーバーラップ期間であるか否かが判定される。
【０２９８】
具体的には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号と、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５におけるオーバーラップ期間情報５００の開始ｌｉｎｅ５１１とが一致するか否かを判定する。
【０２９９】
非同期処理開始情報８０２に含まれる命令列のライン番号と、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５におけるオーバーラップ期間情報５００の開始ｌｉｎｅ５１１とが一致する場合には、既存のオーバーラップ期間性能情報テーブル２０５が存在すると判定される。
【０３００】
対応するオーバーラップ期間性能情報テーブル２０５が存在すると判定された場合、性能分析モジュール２０２は、ステップ１２０４に進む。このとき、既存のオーバーラップ期間性能情報テーブル２０５を表す識別子がテーブル識別子２１２に格納され、当該オーバーラップ期間性能情報テーブル２０５におけるオーバーラップ期間情報５００の期間回数５１７が更新される。また、オーバーラップフラグ２１１に「１」が設定される。以下、既存のオーバーラップ期間性能情報テーブル２０５の情報が更新されることとなる。
【０３０１】
既存のオーバーラップ期間性能情報テーブル２０５が存在しないと判定された場合、性能分析モジュール２０２は、新たなオーバーラップ期間性能情報テーブル２０５を生成する（ステップ１２０５）。
【０３０２】
具体的には、以下の処理が実行される。
【０３０３】
性能分析モジュール２０２は、まず、非同期処理開始情報８０２に含まれる命令列のライン番号をテーブル識別子２１２に格納する。
【０３０４】
また、性能分析モジュール２０２は、オーバーラップ期間性能情報テーブル２０５を生成して、当該テーブルのオーバーラップ期間情報５００の開始ｌｉｎｅ５１１に、非同期処理開始情報８０２に含まれる命令列のライン番号を格納する。さらに、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、非同期処理開始情報８０２に対応する非同期処理のエントリを生成し、当該エントリに必要な情報を格納する。その後、性能分析モジュール２０２は、オーバーラップフラグ２１１に「１」を設定する。
【０３０５】
なお、非同期処理開始情報８０２が入力された場合の処理については、図１３Ａ〜図１３Ｃを用いて後述する。
【０３０６】
次に、性能分析モジュール２０２は、非同期処理、同期処理、及びループ処理の性能情報を取得する（ステップ１２０４）。
【０３０７】
性能分析モジュール２０２は、同期処理完了情報８０５が入力されると、オーバーラップ期間の終了であるか否かを判定する（ステップ１２０６）。すなわち、オーバーラップ期間内の全ての非同期処理が終了したが否かが判定される。
【０３０８】
具体的には、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、同期ｉｄ５１８に値が格納されたエントリの終了フラグ５１９が全て「１」であるか否かを判定する。同期ｉｄ５１８に値が格納されたエントリの終了フラグ５１９が全て「１」である場合には、オーバーラップ期間の終了と判定される。
【０３０９】
オーバーラップ期間の終了でないと判定された場合、性能分析モジュール２０２は、ステップ１２０４に戻り、オーバーラップ期間の終了まで、性能情報の取得処理を継続する。
【０３１０】
オーバーラップ期間の終了であると判定された場合、性能分析モジュール２０２は、オーバーラップフラグ２１１を「０」及びテーブル識別子２１２を「０」に更新して、出力情報を生成する（ステップ１２０７）。
【０３１１】
具体的には、性能分析モジュール２０２は、オーバーラップ管理情報２１０からオーバーラップ期間性能情報テーブル２０５を読み出し、読み出されたオーバーラップ期間性能情報テーブル２０５に基づいて、オーバーラップ計測情報８１０を生成する。
【０３１２】
なお、このとき、性能分析モジュール２０２は、ＧＰＵプロファイラ２０８を呼び出して、ＧＰＵ非同期処理情報２０９からＧＰＵ非同期処理の実行時間を取得する。
【０３１３】
次に、性能分析モジュール２０２は、実行モジュール３０２が終了したか否かを判定する（ステップ１２０８）。
【０３１４】
実行モジュール３０２が終了していないと判定された場合、性能分析モジュール２０２は、ステップ１２０２に戻り同様の処理を実行する。
【０３１５】
実行モジュール３０２が終了したと判定された場合、性能分析モジュール２０２は、処理を終了する。
【０３１６】
図１３Ａ〜図１３Ｃは、本発明の実施形態の性能分析モジュール２０２が非同期処理開始情報８０２を入力された場合に実行する処理を説明するフローチャートである。
【０３１７】
図１３Ａは、ＭＰＩ通信処理及びＧＰＵ非同期処理に共通の処理を示す。
【０３１８】
性能分析モジュール２０２は、非同期処理開始情報８０２が入力されると、オーバーラップフラグ２１１が「０」であるか否かを判定する（ステップ１３０１）。すなわち、非同期処理開始情報８０２に対応する非同期処理以外に他の非同期処理が実行されていないか否かが判定される。
【０３１９】
オーバーラップフラグ２１１が「０」でないと判定された場合、性能分析モジュール２０２は、ステップ１３０５に進む。
【０３２０】
オーバーラップフラグ２１１が「０」であると判定された場合、性能分析モジュール２０２は、ループ内のオーバーラップ期間であるか否かを判定する（ステップ１３０２）。すなわち、オーバーラップ管理情報２１０に、すでに対応するオーバーラップ期間性能情報テーブル２０５が存在するか否かが判定される。
【０３２１】
具体的には、性能分析モジュール２０２は、オーバーラップ期間性能情報テーブル２０５のオーバーラップ期間情報５００の開始ｌｉｎｅ５１１が、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するオーバーラップ期間性能情報テーブル２０５がオーバーラップ管理情報２１０に存在するか否かを判定する。
【０３２２】
ループ内のオーバーラップ期間であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に既存のオーバーラップ期間性能情報テーブル２０５の識別子を格納し、既存のオーバーラップ期間性能情報テーブル２０５を更新する（ステップ１３０３）。その後、性能分析モジュール２０２はステップ１３０５に進む。
【０３２３】
具体的には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号をテーブル識別子２１２に格納する。また、性能分析モジュール２０２は、既存のオーバーラップ期間性能情報テーブル２０５におけるオーバーラップ期間情報５００の期間回数５１７の値を「１」加算する。
【０３２４】
ループ内のオーバーラップ期間でないと判定された場合、性能分析モジュール２０２は、新たにオーバーラップ期間性能情報テーブル２０５を生成し、生成されたテーブルの識別子をテーブル識別子に格納する（ステップ１３０４）。その後、性能分析モジュール２０２はステップ１３０５に進む。
【０３２５】
具体的には、性能分析モジュール２０２は、テーブル識別子２１２に非同期処理開始情報８０２に含まれる命令列のライン番号を格納する。また、性能分析モジュール２０２は、生成されたオーバーラップ期間性能情報テーブル２０５におけるオーバーラップ期間情報５００の開始ｌｉｎｅ５１１に、非同期処理開始情報８０２に含まれる命令列のライン番号を格納する。さらに、性能分析モジュール２０２は、当該オーバーラップ期間性能情報テーブル２０５のオーバーラップ期間情報５００の期間回数５１７に「１」を格納する。
【０３２６】
次に、性能分析モジュール２０２は、オーバーラップフラグ２１１が「１」であるか否かを判定する（ステップ１３０５）。
【０３２７】
オーバーラップフラグ２１１が「１」であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５のＣＰＵ処理情報５１０にＣＰＵ処理の終了に関する情報を格納する（ステップ１３０６）。
【０３２８】
これは、すでにオーバーラップ期間における性能情報の取得処理が開始されおり、非同期処理の起動によってＣＰＵ処理が終了したことを表すためである。
【０３２９】
なお、終了したＣＰＵ処理に対応するＣＰＵ処理情報５１０のＤｏ−ｉｄ５１３に識別子が格納されている場合、すなわち、ループ内のＣＰＵ処理である場合には、当該ＣＰＵ処理情報５１０に情報が蓄積される。
【０３３０】
オーバーラップフラグ２１１が「１」でないと判定された場合、性能分析モジュール２０２は、オーバーラップ期間の開始であると判定して、オーバーラップフラグ２１１に「１」を設定し（ステップ１３０７）、ステップ１３０８に進む。これは、まだ、オーバーラップ期間とは判定されていないためである。
【０３３１】
次に、性能分析モジュール２０２は、非同期処理開始情報８０２がＭＰＩ通信処理、又はＧＰＵ非同期処理（カーネル実行処理又はコピー処理）の何れであるかを判定する（ステップ１３０８）。
【０３３２】
性能分析モジュール２０２は、起動された非同期処理に対応する命令列に基づいて、ＭＰＩ通信処理、又はＧＰＵ非同期処理（カーネル実行処理又はコピー処理）の何れであるかを判定できる。
【０３３３】
図１３Ｂは、非同期処理開始情報８０２がＭＰＩ通信処理である場合の処理を示す。
【０３３４】
ステップ１３０８において、非同期処理開始情報８０２がＭＰＩ通信処理であると判定された場合、性能分析モジュール２０２は、ＭＰＩ通信処理に関する性能情報の取得処理を開始する。
【０３３５】
まず、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、ループ内のＭＰＩ通信処理であるか否かを判定する（ステップ１３１０）。
【０３３６】
具体的には、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に値が設定されているか否かを判定する。オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されている場合、ループ内のＭＰＩ通信処理であると判定される。
【０３３７】
ループ内のＭＰＩ通信処理でないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＭＰＩ非同期処理情報５０４を生成し、必要な情報を格納する（ステップ１３１１）。
【０３３８】
具体的には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、非同期処理開始情報８０２に基づいて、同期ｉｄ５１８、ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３のそれぞれに値を格納する。また、性能分析モジュール２０２は、通信時間推定情報２０７を参照して、ＭＰＩ通信処理の推定時間を算出し、算出された推定時間を実行時間５１６に格納する。さらに、性能分析モジュール２０２は、終了フラグ５１９に「０」を格納する。
【０３３９】
ループ内のＭＰＩ通信処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、対応するＭＰＩ非同期処理情報５０４が存在するか否かを判定する（ステップ１３１２）。すなわち、起動されたＭＰＩ通信処理に対応するＭＰＩ非同期処理情報５０４がすでに存在するか否かが判定される。
【０３４０】
具体的には、以下のような処理が実行される。
【０３４１】
性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５の開始ｌｉｎｅ５１１を参照して、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するＭＰＩ非同期処理情報５０４を検索する。
【０３４２】
前述した検索の結果、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するＭＰＩ非同期処理情報５０４が存在する場合、性能分析モジュール２０２は、さらに、当該ＭＰＩ非同期処理情報５０４のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致するか否かを判定する。
【０３４３】
ＭＰＩ非同期処理情報５０４のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致すると判定された場合、対応するＭＰＩ非同期処理情報５０４が存在すると判定される。
【０３４４】
対応するＭＰＩ非同期処理情報５０４が存在しないと判定された場合、性能分析モジュール２０２は、新たにＭＰＩ非同期処理情報５０４を生成する（ステップ１３１１）。
【０３４５】
具体的には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、非同期処理開始情報８０２に基づいて、同期ｉｄ５１８、ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３のそれぞれに値を格納する。また、性能分析モジュール２０２は、通信時間推定情報２０７を参照して、ＭＰＩ通信処理の推定時間を算出し、算出された推定時間を実行時間５１６に格納する。
【０３４６】
さらに、性能分析モジュール２０２は、終了フラグ５１９に「０」を格納する。また、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０３４７】
対応するＭＰＩ非同期処理情報５０４が存在すると判定された場合、性能分析モジュール２０２は、既存のＭＰＩ非同期処理情報５０４の情報を更新する（ステップ１３１３）。
【０３４８】
具体的には、開始ｌｉｎｅ５１１、Ｄｏ−ｉｄ５１３、実行時間５１６、期間回数５１７、同期ｉｄ５１８、ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３が更新される。
【０３４９】
より詳細には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納する。また、性能分析モジュール２０２は、非同期処理開始情報８０２に基づいて、同期ｉｄ５１８、ＭＰＩ種別６２１、通信サイズ６２２、及び宛先ｎｏｄｅ数６２３のそれぞれの値を格納する。
【０３５０】
さらに、性能分析モジュール２０２は、終了フラグ５１９に「０」を格納する。また、性能分析モジュール２０２は、通信時間推定情報２０７を参照して、ＭＰＩ通信処理の推定時間を算出し、実行時間５１６に格納される値に算出された推定時間を加算する。すなわち、ループ毎の実行時間の合計値が格納される。また、性能分析モジュール２０２は、期間回数５１７の値を「１」加算し、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０３５１】
図１３Ｃは、非同期処理開始情報８０２がＧＰＵ非同期処理である場合の処理を示す。
【０３５２】
ステップ１３０８において、非同期処理開始情報８０２がＧＰＵ非同期処理（カーネル実行処理又はコピー処理）であると判定された場合、性能分析モジュール２０２は、ＧＰＵ非同期処理（カーネル実行処理又はコピー処理）に関する性能情報の取得処理を開始する。なお、カーネル実行処理及びコピー処理の何れでも実行される処理は同一であるため、以下では、カーネル実行処理を例に説明する。
【０３５３】
まず、性能分析モジュール２０２は、シーケンシャル番号２１３を更新する（ステップ１３２０）。具体的には、性能分析モジュール２０２は、シーケンシャル番号２１３に格納された値に「１」を加算する。
【０３５４】
次に、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、ループ内のカーネル実行処理であるか否かを判定する（ステップ１３２１）。
【０３５５】
具体的には、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に値が設定されているか否かを判定する。オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されている場合、ループ内のカーネル実行処理であると判定される。
【０３５６】
ループ内のカーネル実行処理でないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＧＰＵ非同期処理情報５０３を生成し、必要な情報を格納する（ステップ１３２２）。
【０３５７】
具体的には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、また、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、非同期処理開始情報８０２に基づいて同期ｉｄ５１８に値を格納する。また、性能分析モジュール２０２は、ステップ１３２０における更新処理後のシーケンシャル番号２１３の値をシーケンシャル番号６１１に格納する。さらに、性能分析モジュール２０２は、終了フラグ５１９に「０」を格納する。
【０３５８】
性能分析モジュール２０２は、実行モジュール３０２の終了後、シーケンシャル番号６１１に基づいて、ＧＰＵプロファイラ２０８に問い合わせを行い、ＧＰＵ非同期処理情報２０９からカーネル実行処理の実行時間を取得する。性能分析モジュール２０２は、実行時間５１６に取得した実行時間を格納する。
【０３５９】
ループ内のカーネル実行処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、対応するＧＰＵ非同期処理情報５０３が存在するか否かを判定する（ステップ１３２３）。すなわち、起動されたカーネル実行処理に対応するＧＰＵ非同期処理情報５０３がすでに存在するか否かが判定される。
【０３６０】
具体的には、以下のような処理が実行される。
【０３６１】
性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５の開始ｌｉｎｅ５１１を参照して、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するＧＰＵ非同期処理情報５０３を検索する。
【０３６２】
前述した検索の結果、非同期処理開始情報８０２に含まれる命令列のライン番号と一致するＧＰＵ非同期処理情報５０３が存在する場合、性能分析モジュール２０２は、さらに、当該ＧＰＵ非同期処理情報５０３のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致するか否かを判定する。ＧＰＵ非同期処理情報５０３のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致すると判定された場合、対応するＧＰＵ非同期処理情報５０３が存在すると判定される。
【０３６３】
対応するＧＰＵ非同期処理情報５０３が存在しないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＧＰＵ非同期処理情報５０３を生成し、必要な情報を格納する（ステップ１３２１）。
【０３６４】
具体的には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、また、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、非同期処理開始情報８０２に基づいて同期ｉｄ５１８に値を格納する。また、性能分析モジュール２０２は、ステップ１３２０における更新処理後のシーケンシャル番号２１３の値をシーケンシャル番号６１１に格納する。
【０３６５】
さらに、性能分析モジュール２０２は、終了フラグ５１９に「０」を格納する。また、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０３６６】
さらに、性能分析モジュール２０２は、実行モジュール３０２の終了後、シーケンシャル番号６１１に基づいて、ＧＰＵプロファイラ２０８に問い合わせを行い、ＧＰＵ非同期処理情報２０９からカーネル実行処理の実行時間を取得する。性能分析モジュール２０２は、実行時間５１６に取得した実行時間を格納する。
【０３６７】
対応するＧＰＵ非同期処理情報５０３が存在すると判定された場合、性能分析モジュール２０２は、既存のＧＰＵ非同期処理情報５０３を更新する（ステップ１３２４）。
【０３６８】
具体的には、開始ｌｉｎｅ５１１、Ｄｏ−ｉｄ５１３、期間回数５１７、同期ｉｄ５１８、終了フラグ５１９、及びシーケンシャル番号６１１が更新される。
【０３６９】
より詳細には、性能分析モジュール２０２は、非同期処理開始情報８０２に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納する。また、性能分析モジュール２０２は、非同期処理開始情報８０２に基づいて同期ｉｄ５１８に値を格納する。
【０３７０】
さらに、性能分析モジュール２０２は、終了フラグ５１９に「０」を格納する。また、性能分析モジュール２０２は、期間回数５１７を「１」加算し、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。また、性能分析モジュール２０２は、更新後のシーケンシャル番号２１３の値をシーケンシャル番号６１１に格納する。なお、ループ毎にシーケンシャル番号２１３は異なるため、シーケンシャル番号６１１には、ループ毎のシーケンシャル番号２１３が複数格納される。
【０３７１】
さらに、性能分析モジュール２０２は、実行モジュール３０２の終了後、シーケンシャル番号６１１に基づいて、ＧＰＵプロファイラ２０８に問い合わせを行い、ＧＰＵ非同期処理情報２０９からカーネル実行処理の実行時間を取得する。性能分析モジュール２０２は、実行時間５１６に取得した実行時間を格納する。このとき、シーケンシャル番号６１１には複数のシーケンシャル番号が格納されるため、実行時間５１６には、各シーケンシャル番号に対応する処理の実行時間の合計値が格納される。
【０３７２】
図１４は、本発明の第１の実施形態の性能分析モジュール２０２が非同期処理完了情報８０３を入力された場合に実行する処理を説明するフローチャートである。
【０３７３】
図１４に示す処理は、オーバーラップフラグ２１１が「１」である場合に実行される処理である。したがって、オーバーラップフラグ２１１が「０」である場合には、図１４に示す処理は実行されない。
【０３７４】
非同期処理完了情報８０３が入力されると、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、次に実行されるＣＰＵ処理がループ内のＣＰＵ処理であるか否かを判定する（ステップ１４０１）。
【０３７５】
具体的には、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に値が設定されているか否かを判定する。オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されている場合、ループ内のＣＰＵ処理であると判定される。
【０３７６】
ループ内のＣＰＵ処理でないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＣＰＵ処理情報５０１を生成し、必要な情報を格納する（ステップ１４０２）。
【０３７７】
具体的には、性能分析モジュール２０２は、非同期処理完了情報８０３に含まれる命令列のライン番号に「１」加算した値を開始ｌｉｎｅ５１１に格納し、非同期処理完了情報８０３に対応する処理が起動された時刻を開始時刻５１４に格納する。また、性能分析モジュール２０２は、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、非同期処理完了情報８０３に基づいて、同期ｉｄ５１８の値を格納する。
【０３７８】
さらに、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、開始命令カウンタ６０１及び開始ＦＬＯＰカウンタ６０３の値を取得し、取得された値を格納する。
【０３７９】
ループ内のＣＰＵ処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、対応するＣＰＵ処理情報５０１が存在するか否かを判定する（ステップ１４０３）。すなわち、起動されたＣＰＵ処理に対応するＣＰＵ処理情報５０１がすでに存在するか否かが判定される。
【０３８０】
具体的には、以下のような処理が実行される。
【０３８１】
性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５の開始ｌｉｎｅ５１１を参照して、非同期処理完了情報８０３に含まれる命令列のライン番号に「１」加算した値と一致するＣＰＵ処理情報５０１が存在するか否かを検索する。
【０３８２】
前述した検索の結果、非同期処理開始情報８０２に含まれる命令列のライン番号に「１」加算した値と一致するＣＰＵ処理情報５０１が存在する場合、性能分析モジュール２０２は、さらに、当該ＣＰＵ処理情報５０１のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致するか否かを判定する。
【０３８３】
ＣＰＵ処理情報５０１のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致すると判定された場合、対応するＣＰＵ処理情報５０１が存在すると判定される。
【０３８４】
対応するＣＰＵ処理情報５０１が存在しないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＣＰＵ処理情報５０１を生成し、必要な情報を格納する（ステップ１４０２）。
【０３８５】
具体的には、性能分析モジュール２０２は、非同期処理完了情報８０３に含まれる命令列のライン番号に「１」加算した値を開始ｌｉｎｅ５１１に格納し、非同期処理完了情報８０３に対応する処理が起動された時刻を開始時刻５１４に格納する。また、性能分析モジュール２０２は、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、非同期処理完了情報８０３に基づいて、同期ｉｄ５１８に値を格納する。さらに、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０３８６】
さらに、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、開始命令カウンタ６０１、及び開始ＦＬＯＰカウンタ６０３の値を取得し、取得された値を格納する。
【０３８７】
対応するＣＰＵ処理情報５０１が存在すると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５の既存のＣＰＵ処理情報５０１を更新する（ステップ１４０４）。
【０３８８】
具体的には、開始ｌｉｎｅ５１１、Ｄｏ−ｉｄ５１３、開始時刻５１４、期間回数５１７、同期ｉｄ５１８、開始命令カウンタ６０１、及び開始ＦＬＯＰカウンタ６０３が更新される。
【０３８９】
より詳細には、非同期処理完了情報８０３に含まれる命令列のライン番号に「１」加算した値を開始ｌｉｎｅ５１１に格納し、非同期処理完了情報８０３に対応する処理が起動された時刻を開始時刻５１４に格納する。また、性能分析モジュール２０２は、非同期処理完了情報８０３に基づいて、同期ｉｄ５１８に値を格納する。
【０３９０】
さらに、性能分析モジュール２０２は、期間回数５１７の値を「１」加算し、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０３９１】
さらに、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、開始命令カウンタ６０１及び開始ＦＬＯＰカウンタ６０３の値を取得し、取得された値を格納する。ここで、開始命令カウンタ６０１及び開始ＦＬＯＰカウンタ６０３はループ毎の値が格納される。すなわち、ループ毎に値が上書きされる。
【０３９２】
図１５は、本発明の第１の実施形態の性能分析モジュール２０２が同期処理開始情報８０４を入力された場合に実行する処理を説明するフローチャートである。
【０３９３】
図１５に示す処理は、オーバーラップフラグ２１１が「１」である場合に実行される処理である。したがって、オーバーラップフラグ２１１が「０」である場合には、図１５に示す処理は実行されない。
【０３９４】
なお、ＭＰＩ通信処理又はＧＰＵ非同期処理の何れでも同一の処理が実行される。以下、同期処理開始情報８０４がＭＰＩ通信処理に対する同期処理である場合を例に説明する。
【０３９５】
同期処理開始情報８０４が入力されると、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、同期処理の起動前に実行していたＣＰＵ処理がループ内のＣＰＵ処理であるか否かを判定する（ステップ１５０１）。
【０３９６】
当該判定は、ステップ１４０１と同一の方法を用いることが考えられる。すなわち、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されているか否かが判定される。
【０３９７】
ループ内のＣＰＵ処理でないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、対応するＣＰＵ処理情報５０１に必要な情報を格納する（ステップ１５０２）。
【０３９８】
具体的には、性能分析モジュール２０２は、同期処理開始情報８０４に含まれる命令列のライン番号を「１」減算した値を終了ｌｉｎｅ５１２に格納し、同期処理開始情報８０４に対応する同期処理が起動された時刻を終了時刻５１５に格納する。また、性能分析モジュール２０２は、期間回数５１７に「１」を格納する。
【０３９９】
また、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、終了命令カウンタ６０２、終了ＦＬＯＰカウンタ６０４の値を取得し、取得された値を格納する。
【０４００】
さらに、性能分析モジュール２０２は、実行時間、命令数及びＦＬＯＰ数を算出し、算出されたそれぞれの値を実行時間５１６、命令数６０５及びＦＬＯＰ数６０６に格納する。
【０４０１】
ループ内のＣＰＵ処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、当該ループの識別子と同一のＤｏ−ｉｄ５１３が格納されたＣＰＵ処理情報５０１を更新する（ステップ１５０４）。
【０４０２】
具体的には、性能分析モジュール２０２は、同期処理開始情報８０４に含まれる命令列のライン番号を「１」減算した値を終了ｌｉｎｅ５１２に格納し、同期処理開始情報８０４に対応する同期処理が起動された時刻を終了時刻５１５に格納する。
【０４０３】
また、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、終了命令カウンタ６０２、終了ＦＬＯＰカウンタ６０４の値を取得し、取得された値を格納する。
【０４０４】
さらに、性能分析モジュール２０２は、期間回数５１７の値を「１」加算する。また、性能分析モジュール２０２は、実行時間、命令数及びＦＬＯＰ数を算出し、算出されたそれぞれの値を実行時間５１６、命令数６０５及びＦＬＯＰ数６０６に格納する。なお、実行時間５１６、命令数６０５及びＦＬＯＰ数６０６には、ループ毎の値の合計値が格納される。
【０４０５】
次に、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、起動された同期処理がループ内の同期処理であるか否かを判定する（ステップ１５０３）。
【０４０６】
当該判定は、ステップ１４０１と同一の方法を用いることが考えられる。すなわち、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されているか否かが判定される。
【０４０７】
ループ内の同期処理でないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に新たなＭＰＩ同期処理情報５０６を生成し、必要な情報を格納する（ステップ１５０５）。
【０４０８】
具体的には、性能分析モジュール２０２は、同期処理開始情報８０４に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、同期処理開始情報８０４に対応する同期処理が起動された時刻を開始時刻５１４に格納する。また、性能分析モジュール２０２は、同期処理開始情報８０４に基づいて、同期ｉｄ５１８に値を格納する。
【０４０９】
ループ内の同期処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、対応するＭＰＩ同期処理情報５０６が存在するか否かを判定する（ステップ１５０６）。
【０４１０】
具体的には、以下のような処理が実行される。
【０４１１】
性能分析モジュール２０２は、オーバーラップ期間性能情報テーブル２０５の開始ｌｉｎｅ５１１を参照して、同期処理開始情報８０４に含まれる命令列のライン番号と一致するＭＰＩ同期処理情報５０６が存在するか否かを検索する。
【０４１２】
前述した検索の結果、同期処理開始情報８０４に含まれる命令列のライン番号と一致するＭＰＩ同期処理情報５０６が存在する場合、性能分析モジュール２０２は、さらに、当該ＭＰＩ同期処理情報５０６のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致するか否かを判定する。
【０４１３】
ＭＰＩ同期処理情報５０６のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致すると判定された場合、対応するＭＰＩ同期処理情報５０６が存在すると判定される。
【０４１４】
対応するＭＰＩ同期処理情報５０６が存在しないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＭＰＩ同期処理情報５０６を生成し、生成されたＭＰＩ同期処理情報５０６に必要な情報を格納する（ステップ１５０５）。
【０４１５】
具体的には、性能分析モジュール２０２は、同期処理開始情報８０４に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、同期処理開始情報８０４に対応する同期処理が起動された時刻を開始時刻５１４に格納する。また、性能分析モジュール２０２は、同期処理開始情報８０４に基づいて、同期ｉｄ５１８に値を格納する。さらに、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０４１６】
対応するＭＰＩ同期処理情報５０６が存在すると判定された場合、性能分析モジュール２０２は、既存のＭＰＩ同期処理情報５０６を更新する（ステップ１５０７）。
【０４１７】
具体的には、性能分析モジュール２０２は、開始ｌｉｎｅ５１１、Ｄｏ−ｉｄ５１３、開始時刻５１４、及び同期ｉｄ５１８を更新する。
【０４１８】
より詳細には、性能分析モジュール２０２は、同期処理開始情報８０４に含まれる命令列のライン番号を開始ｌｉｎｅ５１１に格納し、同期処理開始情報８０４に対応する同期処理が起動された時刻を開始時刻５１４に格納する。また、性能分析モジュール２０２は、同期処理開始情報８０４に基づいて、同期ｉｄ５１８に値を格納する。さらに、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子をＤｏ−ｉｄ５１３に格納する。
【０４１９】
図１６は、本発明の第１の実施形態の性能分析モジュール２０２が同期処理完了情報８０５を入力された場合に実行する処理を説明するフローチャートである。
【０４２０】
図１６に示す処理は、オーバーラップフラグ２１１が「１」である場合に実行される処理である。したがって、オーバーラップフラグ２１１が「０」である場合には、図１６に示す処理は実行されない。
【０４２１】
なお、ＭＰＩ通信処理又はＧＰＵ非同期処理（カーネル実行処理又はコピー処理）の何れでも同一の処理である。以下、同期処理完了情報８０５が、ＭＰＩ通信処理の同期処理である場合を例に説明する。
【０４２２】
同期処理完了情報８０５が入力されると、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、終了した同期処理がループ内の同期処理であるか否かを判定する（ステップ１６０１）。
【０４２３】
当該判定は、ステップ１４０１と同一の方法を用いることが考えられる。すなわち、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されているか否かが判定される。
【０４２４】
ループ内の同期処理でないと判定された場合、性能分析モジュール２０２は、対応するＭＰＩ同期処理情報５０６に必要な情報を格納する（ステップ１６０２）。
【０４２５】
具体的には、性能分析モジュール２０２は、同期処理完了情報８０５に対応する同期処理が終了した時刻を終了時刻５１５に格納する。また、性能分析モジュール２０２は、期間回数５１７に「１」を格納する。また、性能分析モジュール２０２は、同期処理完了情報８０５に対応する同期処理の実行時間を算出し、算出された値を実行時間５１６に格納する。
【０４２６】
ループ内の同期処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子が格納されたＭＰＩ同期処理情報５０６を更新する（ステップ１６０３）。
【０４２７】
具体的には、性能分析モジュール２０２は、同期処理完了情報８０５に対応する同期処理が終了した時刻を終了時刻５１５に格納する。また、性能分析モジュール２０２は、期間回数５１７の値を「１」加算する。
【０４２８】
さらに、性能分析モジュール２０２は、同期処理の実行時間を算出し、実行時間５１６に算出された値を加算する。すなわち、ループ処理毎の実行時間の合計値が格納される。
【０４２９】
次に、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、終了した同期処理の対象となる非同期処理のエントリの終了フラグ５１９を「１」に設定する（ステップ１６０４）。
【０４３０】
具体的には、性能分析モジュール２０２は、ＭＰＩ同期処理情報５０６の終了フラグ５１９に「１」を設定する。また、性能分析モジュール２０２は、当該ＭＰＩ同期処理情報５０６の同期ｉｄ５１８と同一の同期ｉｄ５１８である他のＭＰＩ非同期処理情報５０４の終了フラグ５１９に「１」を設定する。
【０４３１】
性能分析モジュール２０２は、オーバーラップ期間が終了したか否かを判定する（ステップ１６０５）。
【０４３２】
具体的には、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５において、同期ｉｄ５１８に識別子が格納される全てのエントリの終了フラグ５１９に「１」が格納されるか否かが判定される。
【０４３３】
同期ｉｄ５１８に識別子が格納される全てのエントリの終了フラグ５１９に「１」が格納される場合、オーバーラップ期間が終了したと判定される。
【０４３４】
オーバーラップ期間が終了したと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５の取得処理を終了し、初期化処理を実行する（ステップ１６０６）。
【０４３５】
具体的には、性能分析モジュール２０２は、オーバーラップフラグ２１１を「０」に設定し、テーブル識別子２１２を「０」に設定する。これによって、性能分析モジュール２０２は、オーバーラップ期間が終了し、また、更新中のオーバーラップ期間性能情報テーブル２０５がないことを把握できる。
【０４３６】
オーバーラップ期間が終了していないと判定された場合、同期処理の終了後、新たなＣＰＵ処理が実行されるため、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、起動されたＣＰＵ処理がループ内のＣＰＵ処理であるか否かを判定する（ステップ１６０７）。
【０４３７】
当該処理はステップ１４０１と同一の処理であり、具体的には、性能分析モジュール２０２は、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に値が設定されているか否かを判定する。オーバーラップ期間情報５００のＤｏ−ｉｄ５１３に「０」以外の値が設定されている場合、ループ内のＣＰＵ処理であると判定される。
【０４３８】
ループ内のＣＰＵ処理でないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＣＰＵ処理情報５０１を生成し、必要な情報を格納する（ステップ１６０８）。
【０４３９】
当該処理はステップ１４０２と同一の処理であり、具体的には、性能分析モジュール２０２は、開始ｌｉｎｅ５１１、開始時刻５１４、期間回数５１７及び同期ｉｄ５１８にそれぞれの値を格納する。
【０４４０】
さらに、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、開始命令カウンタ６０１及び開始ＦＬＯＰカウンタ６０３の値を取得し、取得された値を格納する。
【０４４１】
ループ内のＣＰＵ処理であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、対応するＣＰＵ処理情報５０１が存在するか否かを判定する（ステップ１６０９）。
【０４４２】
当該処理は、ステップ１４０３と同一の処理であり、具体的には、以下のような処理が実行される。
【０４４３】
性能分析モジュール２０２は、オーバーラップ期間性能情報テーブル２０５の開始ｌｉｎｅ５１１を参照して、同期処理完了情報８０５に含まれる命令列のライン番号に「１」加算したライン番号と一致するＣＰＵ処理情報５０１が存在するか否かを検索する。
【０４４４】
前述した検索の結果、同期処理完了情報８０５に含まれる命令列のライン番号に「１」加算したライン番号と一致するＣＰＵ処理情報５０１が存在する場合、性能分析モジュール２０２は、さらに、当該ＣＰＵ処理情報５０１のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致するか否かを判定する。
【０４４５】
ＣＰＵ処理情報５０１のＤｏ−ｉｄ５１３が、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と一致すると判定された場合、対応するＣＰＵ処理情報５０１が存在すると判定される。
【０４４６】
対応するＣＰＵ処理情報５０１が存在しないと判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５に、新たなＣＰＵ処理情報５０１を生成し、必要な情報を格納する（ステップ１６０８）。
【０４４７】
当該処理はステップ１４０２と同一の処理であり、具体的には、性能分析モジュール２０２は、開始ｌｉｎｅ５１１、Ｄｏ−ｉｄ５１３、開始時刻５１４、期間回数５１７、同期ｉｄ５１８に値を格納する。なお、期間回数５１７には「１」が格納され、Ｄｏ−ｉｄ５１３には、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子が格納される。
【０４４８】
さらに、性能分析モジュール２０２は、ハードウェアモニタに問い合わせることによって、開始命令カウンタ６０１、及び開始ＦＬＯＰカウンタ６０３の値を取得し、取得された値を格納する。
【０４４９】
対応するＣＰＵ処理情報５０１が存在すると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５の既存のＣＰＵ処理情報５０１を更新する（ステップ１６１０）。
【０４５０】
当該処理はステップ１４０４と同一の処理であり、具体的には、開始ｌｉｎｅ５１１、Ｄｏ−ｉｄ５１３、開始時刻５１４、期間回数５１７、同期ｉｄ５１８、開始命令カウンタ６０１、及び開始ＦＬＯＰカウンタ６０３が更新される。
【０４５１】
なお、開始時刻５１４、開始命令カウンタ６０１、及び開始ＦＬＯＰカウンタ６０３にはループ毎の値が格納され、期間回数５１７には「１」加算された値が格納される。また、Ｄｏ−ｉｄ５１３には、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３と同一の識別子が格納される。
【０４５２】
図１７は、本発明の第１の実施形態の性能分析モジュール２０２がＤｏループ情報８０６を入力された場合に実行する処理を説明するフローチャートである。
【０４５３】
図１７に示す処理は、オーバーラップフラグ２１１が「１」である場合に実行される処理である。したがって、オーバーラップフラグ２１１が「０」である場合には、図１７に示す処理は実行されない。
【０４５４】
性能分析モジュール２０２は、予め埋め込まれたトラップに基づいて、同期処理又は非同期処理が実行されたときループ処理であることを検知する。
【０４５５】
その後、性能分析モジュール２０２は、Ｄｏループ情報８０６を参照してＤｏループ入口命令であるか否かを判定する（ステップ１７０１）。
【０４５６】
Ｄｏループ入口命令であると判定された場合、性能分析モジュール２０２は、対応するオーバーラップ期間性能情報テーブル２０５を参照して、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３にループ処理の識別子を格納する（ステップ１７０２）。
【０４５７】
Ｄｏループ出口命令であると判定された場合、性能分析モジュール２０２は、テーブル識別子２１２に対応するオーバーラップ期間性能情報テーブル２０５を参照して、オーバーラップ期間情報５００のＤｏ−ｉｄ５１３からループ処理の識別子を削除する（ステップ１７０３）。
【０４５８】
以下、本発明の適用例について説明する。
【０４５９】
図１８は、本発明の第１の実施形態におけるＧＰＵ非同期処理が記載されたソース３０１の一例を示す説明図である。図１９は、本発明の第１の実施形態におけるオーバーラップ計測情報８１３の表示画面の一例を示す説明図である。
【０４６０】
図１９は、図１８に示すソース３０１に対して、性能分析モジュール２０２が性能情報を取得した場合の表示画面の一例を示す図である。
【０４６１】
図１９では、ＣＰＵ処理、コピー処理、及びカーネル実行処理のそれぞれの性能情報が表示されている。
【０４６２】
ＣＰＵ情報では、非同期処理の起動処理の実行時間と、ライン番号１００８から開始するＣＰＵ処理、ライン番号１０２３から開始するＣＰＵ処理の性能情報、及び同期処理の性能情報が表示される。具体的には、実行時間、性能値ＧＦＬＯＰＳ（Ｇｉｇａ  ＦＬｏａｔｉｎｇ−ｐｏｉｎｔ  Ｏｐｅｒａｔｉｏｎｓ  Ｐｅｒ  Ｓｅｃｏｎｄ）及び待ち時間が表示される。
【０４６３】
また、コピー処理では、ＣＰＵ１０１（ホスト）からＧＰＵ１０５（デバイス）へのメモリコピーと、ＧＰＵ１０５（デバイス）からＣＰＵ１０１（ホスト）へのメモリコピーとに分けて性能情報が表示される。コピー処理では、実行時間が性能情報として表示される。
【０４６４】
カーネル実行処理では、実行時間が性能情報として表示される。
【０４６５】
分析結果出力モジュール４０６が、オーバーラップ期間性能情報テーブル２０５に基づいて、図１９に示す情報を出力できることは明らかである。
【０４６６】
具体的には、分析結果出力モジュール４０６は、オーバーラップ管理情報２１０から各オーバーラップ期間性能情報テーブル２０５の各エントリの実行時間５１６及びＦＬＯＰ数６０６を取得する。
【０４６７】
次に、分析結果出力モジュール４０６は、各エントリの実行時間５１６を当該エントリの期間回数５１７で除算して実行時間及び待ち時間を算出する。また、分析結果出力モジュール４０６は、各ＣＰＵ処理情報５０１のＦＬＯＰ数６０６を、当該エントリの実行時間５１６と期間回数５１７との積で除算して性能値ＧＦＬＯＰＳを算出する。
【０４６８】
本実施形態では、オーバーラップ期間ごとに前述したような情報が表示される。なお、図１９に示す表示画面は一例であって、オーバーラップ期間性能情報テーブル２０５に基づいて他の情報を表示してもよい。
【０４６９】
図２０は、本発明の実施形態におけるＭＰＩ通信処理が記載されたソース３０１の一例を示す説明図である。図２１は、本発明の実施形態におけるオーバーラップ計測情報の表示画面の一例を示す説明図である。
【０４７０】
図２１は、図２０に示すソース３０１に対して、性能分析モジュール２０２が性能情報を取得した場合の表示画面である。
【０４７１】
図２１では、ループ内のＣＰＵ処理、及びＭＰＩ通信処理の統計的な性能情報が表示される。
【０４７２】
ＣＰＵ処理では、ループ内のＭＰＩ通信処理の起動処理の平均実行時間と、ループ内のライン番号１００８以下のＣＰＵ処理の平均実行時間とが表示される。
【０４７３】
また、ＭＰＩ通信処理では、送信処理と、受信処理とに分けて性能情報が表示される。ＭＰＩ通信処理情報では、平均通信時間及び平均通信サイズが性能情報として表示される。
【０４７４】
分析結果出力モジュール４０６は、オーバーラップ期間性能情報テーブル２０５に基づいて、図２０に示す情報を出力できることは明らかである。
【０４７５】
具体的には、分析結果出力モジュール４０６は、オーバーラップ管理情報２１０から各オーバーラップ期間性能情報テーブル２０５の各エントリの実行時間５１６を取得する。
【０４７６】
次に、分析結果出力モジュール４０６は、各エントリの実行時間５１６を、当該エントリの期間回数５１７及びオーバーラップ期間情報５００の期間回数５１７で除算して平均実行時間を算出する。
【０４７７】
本実施形態では、オーバーラップ期間ごとに前述したような情報が表示される。なお、図２１に示す表示画面は一例であって、オーバーラップ期間性能情報テーブル２０５に基づいて他の情報を表示してもよい。
【０４７８】
また、本実施形態では、図１９及び図２１の表示情報を一つにまとめて表示してもよい。
【０４７９】
なお、本実施形態では、ＣＰＵ１０１単位の性能情報を取得したが本発明は限定されない。例えば、マルチコアのＣＰＵ１０１上で複数のスレッド又は複数のプロセスが実行されるような処理では、スレッド、プロセス、又はＣＰＵコア単位の性能を取得することができる。これは、例えば、ハードウェアモニタに問い合わせる情報を変更することによって実現できる。またＧＰＵ１０５側の処理についても同様である。
【０４８０】
［変形例］
変形例では、性能分析モジュール２０２の実現方法が異なる。以下、第１の実施形態との差異を中心に説明する。
【０４８１】
図２２は、本発明の変形例におけるメモリ１０２上に格納されるプログラム及び情報の一例を示す説明図である。
【０４８２】
第１の実施形態と比較して、メモリ１０２にプロファイラ２２０１が格納され、当該プロファイラ２２０１が性能分析モジュール２０２を備える点が異なる。他の構成については第１の実施形態と同一である。
【０４８３】
また、計算機システムの構成、性能分析モジュール２０２の構成は第１の実施形態と同一であるため説明を省略する。
【０４８４】
図２３は、本発明の変形例における計算機システムにおける各構成の論理的接続関係を示す説明図である。
【０４８５】
プロファイラ２２０１は、ソース３０１を解析して、プログラムの実行開始と実行終了時に性能分析モジュール２０２を呼び出すトラップを埋め込む。また、ソース中のループ処理の開始直前とループ処理の終了直後に、性能分析モジュール２０２を呼び出し、当該ループ処理の識別子を取得するためのトラップを埋め込む。前述したトラップの埋め込み処理によって、トラップ埋め込みソース２３０１が生成される。
【０４８６】
コンパイラ２０１は、トラップ埋め込みソース２３０１から実行形式のトラップ埋め込みロードモジュール２０３を生成する。
【０４８７】
リンカ２０４は、トラップ埋め込みロードモジュール２０３とプロファイラ２２０１の性能分析モジュール２０２とをリンクすることによって実行モジュール３０２を生成する。
【０４８８】
ＣＰＵ１０１は、生成された実行モジュール３０２を実行する。実行モジュール３０２が実行されると、所定の処理が実行される。このとき、プロファイラ２２０１の性能分析モジュール２０２も同時に実行され、オーバーラップ期間における性能情報が取得される。
【０４８９】
なお、性能分析モジュール２０２が実行する処理は、第１の実施形態と同一であるため説明を省略する。
【０４９０】
さらに、本実施形態では、コンパイラ２０１又はプロファイラ２２０１は、プログラム（実行モジュール３０２）の実行開始及び終了、並びにループ箇所を特定するトラップを埋め込んだが、トラップを埋め込まない実装も考えられる。
【０４９１】
例えば、非同期処理開始をＰＭＰＩなどによりトラップして、当該処理が最初の非同期処理であればオーバーラップ期間開始であると判定すればよい。この場合、１つのオーバーラップ期間内のループ処理の性能情報は別々の情報として出力されるが、ループ内のオーバーラップ期間の性能情報は統計的な情報としてまとめることが可能である。
【０４９２】
また、コンパイラ２０１又はプロファイラ２２０１が、プログラム（実行モジュール３０２）の実行開始及び終了、並びにループ箇所を特定するトラップとして、非同期処理開始情報８０２及び非同期処理完了情報８０３だけでなく、同期処理開始情報８０４及び同期処理完了情報８０５を、性能分析モジュール２０２が取得できるようなトラップも埋め込む実装とすることも可能である。
【０４９３】
また、本実施形態では、ＧＰＵ非同期処理情報２０９がメモリ１０２上に格納される場合を示した。ＧＰＵ非同期処理情報２０９がファイルに格納される場合でも、シーケンシャル番号６１１を用いることによって、ファイルから対応するＧＰＵ非同期処理の実行時間を取得して、同様の性能情報を表示することが可能である。
【０４９４】
さらに本実施形態では、プログラム実行開始時にＧＰＵプロファイラ２０８を起動し、プログラム実行終了時に停止する場合を示した。オーバーラップ期間開始時にＧＰＵプロファイラ２０８を起動し、オーバーラップ期間終了時に停止する実装も考えられる。その場合は、オーバーラップ期間開始時にシーケンシャル番号２１３を初期化し、オーバーラップ期間内のみシーケンシャル番号２１３を更新すれば同様の処理を実現可能である。
【０４９５】
なお、本実施形態では、ＣＰＵ１０１、ＧＰＵ１０５を備える計算機システムを例に説明したが、本発明はこれに限定されない。例えば、スカラー演算ユニット及びベクター辺算ユニットを備えるマルチコアプロセッサ、又は、スカラー演算ユニット及びＤＲＰ、ＤＳＰを備えるヘテロジニアスマルチコアプロセッサについても本発明を適用することができる。
【０４９６】
本実施形態によれば、ソースに同期バリア等を追加することなくオーバーラップ期間を自動的に特定し、特定されたオーバーラップ期間における非同期処理の性能情報を取得できる。したがって、プログラマは容易にオーバーラップ期間における処理の実効性能を評価することができる。また、本実施形態によれば、ループ内の処理の性能情報については統計的な情報として蓄積するため、メモリ上で処理が可能となる。したがって、高速な処理が実現できる。さらにループ内の処理の性能情報を統計的な情報として表示するため、プログラマが性能情報を解析する労力を削減することができる。
【０４９７】
特許請求の範囲に記載した以外の発明の観点の代表的なものとして、次のものがあげられる。
（１）計算機システム上で実行されるコンパイラであって、
前記計算機システムは、
複数のＣＰＵと、前記ＣＰＵに接続されるメモリと、複数のＧＰＵと、前記ＧＰＵに接続されるＧＰＵメモリと、前記ＣＰＵ間を接続し、互いにデータを送受信するための第１の通信経路と、前記ＣＰＵと前記ＧＰＵとの間を接続し、互いにデータを送受信するための第２の通信経路と、を備え、
前記コンパイラは、前記ＣＰＵ及び前記ＧＰＵのそれぞれが並列して処理を実行するオーバーラップ期間を特定し、前記オーバーラップ期間において実行される処理の性能情報を取得する性能情報取得手段を備え、
前記処理は、前記ＣＰＵ及び前記ＧＰＵのそれぞれが非同期に実行する演算処理及び通信処理の少なくともいずれかの非同期処理を含み、
前記コンパイラは、
第１の非同期処理の実行命令を含む処理プログラムを取得し、
前記取得された処理プログラムから前記ＣＰＵ及び前記ＧＰＵが実行可能なロードモジュールを生成し、
前記取得されたロードモジュールと前記性能情報取得部とがリンクされることによって生成された実行モジュールを実行し、
前記実行モジュールの実行中に、前記第１の非同期処理の実行命令が読み出された時に、当該第１の非同期処理以外に実行中の他の前記非同期処理が存在するか否かを判定し、
前記第１の非同期処理以外には実行中の前記他の前記非同期処理が存在しないと判定された場合に、前記第１の非同期処理の実行命令が読み出された時を前記オーバーラップ期間の開始点として特定し、
前記第１の非同期処理が完了した時に、前記第１の非同期処理以外に実行中の前記他の非同期処理が存在するか否かを判定し、
前記第１の非同期処理以外に実行中の前記他の非同期処理が存在しないと判定された場合に、前記第１の非同期処理が完了した時を前記オーバーラップ期間の終了点として特定し、
前記特定されたオーバーラップ期間の前記開始点から前記終了点までの、前記処理の性能情報を取得し、
前記特定されたオーバーラップ期間において取得された前記処理の性能情報を出力するための出力情報を生成することを特徴とするコンパイラ。
（２）前記処理は、さらに、前記非同期処理に対する同期待ち処理を含み、
前記処理プログラムは、さらに、前記第１の非同期処理に対する第１の同期待ち処理の実行命令を含み、
前記コンパイラは、
前記ＣＰＵによって前記第１の非同期処理の実行命令が読み出された時に、前記第１の非同期処理に対する同期待ちを表す第１の同期ｉｄを付与し、
前記ＣＰＵによって読み出された前記第１の同期待ち処理が完了した時に、前記第１の非同期処理が完了したと判定して、同期待ちが完了したことを表す第１の終了フラグを付与し、
第１の終了フラグが付与された後に、前記オーバーラップ期間における全ての前記非同期処理に対して終了フラグが付与されているか否かを判定し、
前記オーバーラップ期間における全ての前記非同期処理に対して前記終了フラグが付与されている場合に、前記第１の非同期処理以外に実行中の前記他の非同期処理が存在しないと判定することを特徴とする（１）に記載のコンパイラ。
（３）前記処理は、さらに、繰り返し実行されるループ処理を含み、
前記処理プログラムは、さらに、前記ループ処理の実行命令を含み、
前記コンパイラは、
前記処理プログラムを取得した後に、前記取得された処理プログラムを解析し、
前記解析の結果に基づいて、前記ＣＰＵによって前記ループ処理の実行命令が読み出されたことを検知するためのＤｏループ情報を生成し、
前記Ｄｏループ情報に基づいて、前記処理が前記ループ処理に含まれる処理であるか否かを判定し、
前記処理が前記ループ処理に含まれる処理であると判定された場合に、１回の前記ループ処理毎に前記処理の性能情報を取得し、
前記ループ処理毎に取得された前記処理の性能情報に対して統計処理を実行して前記ループ処理における前記処理の性能情報を算出することを特徴とする（１）に記載のコンパイラ。
（４）前記ＣＰＵによって前記第１の非同期処理の実行命令が読み出された場合に、前記ループ特定情報に基づいて、前記第１の非同期処理が前記ループ処理に含まれる処理であるか否かを判定し、
前記第１の非同期処理が前記ループ処理に含まれる処理であると判定された場合には、前記ループ処理毎に、前記第１の非同期処理の性能情報を取得し、
前記ループ処理毎に取得された前記第１の非同期処理の性能情報に対して統計処理することによって前記ループ処理における前記第１の非同期処理の性能情報を算出することを特徴とする（３）に記載のコンパイラ。
（５）前記第１の非同期処理がＣＰＵ間の通信処理である場合に、転送量、転送パターン、及び転送先を前記ＣＰＵ間の通信処理の性能情報として取得し、
前記取得された転送量、転送パターン、転送先の情報に基づいて、前記ＣＰＵ間で送受信されたデータの推定転送時間を算出し、
前記算出された推定転送時間が含まれる前記出力情報を生成することを特徴とする（１）に記載のコンパイラ。
（６）前記計算機システムは、前記ＧＰＵによって実行された前記非同期処理の性能情報を取得するＧＰＵプロファイラを備え、
前記コンパイラは、
前記オーバーラップ期間において前記ＧＰＵによって実行された前記非同期処理を特定し、
前記ＧＰＵプロファイラから前記特定された非同期処理の性能情報を取得することを特徴とする（１）に記載のコンパイラ。
（７）計算機システム上で実行される処理の性能を解析するプロファイラであって、
前記計算機システムは、
複数のＣＰＵと、前記ＣＰＵに接続されるメモリと、複数のＧＰＵと、前記ＧＰＵに接続されるＧＰＵメモリと、前記ＣＰＵ間を接続し、互いにデータを送受信するための第１の通信経路と、前記ＣＰＵと前記ＧＰＵとの間を接続し、互いにデータを送受信するための第２の通信経路と、を備え、
少なくとも一つの前記ＣＰＵは、前記メモリ上に読み出された前記プロファイラを実行し、
前記プロファイラは、前記ＣＰＵ及び前記ＧＰＵのそれぞれが並列して処理を実行するオーバーラップ期間を特定し、前記オーバーラップ期間において実行される処理の性能情報を取得する性能情報取得手段を備え、
前記処理は、前記ＣＰＵ及び前記ＧＰＵのそれぞれが非同期に実行する演算処理及び通信処理の少なくともいずれかの非同期処理を含み、
前記プロファイラは、
第１の非同期処理の実行命令を含む処理プログラムを取得し、
前記取得された処理プログラムから生成され、前記ＣＰＵ及び前記ＧＰＵが実行可能なロードモジュールと前記性能情報取得手段とがリンクされた実行モジュールを前記ＣＰＵが実行し、前記第１の非同期処理の実行命令が読み出された時に、当該第１の非同期処理以外に実行中の他の前記非同期処理が存在するか否かを判定し、
前記第１の非同期処理以外には実行中の前記他の前記非同期処理が存在しないと判定された場合に、前記第１の非同期処理の実行命令が読み出された時を前記オーバーラップ期間の開始点として特定し、
前記第１の非同期処理が完了した時に、前記第１の非同期処理以外に実行中の前記他の非同期処理が存在するか否かを判定し、
前記第１の非同期処理以外に実行中の前記他の非同期処理が存在しないと判定された場合に、前記第１の非同期処理が完了した時を前記オーバーラップ期間の終了点として特定し、
前記特定されたオーバーラップ期間の前記開始点から前記終了点までの、前記処理の性能情報を取得し、
前記特定されたオーバーラップ期間において取得された前記処理の性能情報を出力するための出力情報を生成することを特徴とするプロファイラ。
（８）前記処理は、さらに、前記非同期処理に対する同期待ち処理を含み、
前記処理プログラムは、さらに、前記第１の非同期処理に対する第１の同期待ち処理の実行命令を含み、
前記プロファイラは、
前記ＣＰＵによって前記第１の非同期処理の実行命令が読み出された時に、前記第１の非同期処理に対する同期待ちを表す第１の同期ｉｄを付与し、
前記ＣＰＵによって読み出された前記第１の同期待ち処理が完了した時に、前記第１の非同期処理が完了したと判定して、同期待ちが完了したことを表す第１の終了フラグを付与し、
第１の終了フラグが付与された後に、前記オーバーラップ期間における全ての前記非同期処理に対して終了フラグが付与されているか否かを判定し、
前記オーバーラップ期間における全ての前記非同期処理に対して前記終了フラグが付与されている場合に、前記第１の非同期処理以外に実行中の前記他の非同期処理が存在しないと判定することを特徴とする（７）に記載のプロファイラ。
（９）前記処理は、さらに、繰り返し実行されるループ処理を含み、
前記処理プログラムは、さらに、前記ループ処理の実行命令を含み、
前記プロファイラは、
前記処理プログラムを取得した後に、前記取得された処理プログラムを解析し、
前記解析の結果に基づいて、前記ＣＰＵによって前記ループ処理の実行命令が読み出み出しを検知するためのＤｏループ情報を生成し、
前記Ｄｏループ情報に基づいて、前記オーバーラップ期間において実行される前記処理が前記ループ処理に含まれる処理であるか否かを判定し、
前記オーバーラップ期間において実行される前記処理が前記ループ処理に含まれる処理であると判定された場合に、前記ループ処理毎に前記処理の性能情報を取得し、
前記ループ処理毎に取得された前記処理の性能情報に対して統計処理を実行して前記ループ処理における前記処理の性能情報を算出することを特徴とする（７）に記載のプロファイラ。
（１０）前記ＣＰＵによって前記第１の非同期処理の実行命令が読み出された場合に、前記ループ特定情報に基づいて、前記第１の非同期処理が前記ループ処理内の処理であるか否かを判定し、
前記第１の非同期処理が前記ループ処理内の処理であると判定された場合には、前記ループ処理毎に、前記第１の非同期処理の性能情報を取得し、
前記ループ処理毎に取得された前記第１の非同期処理の性能情報に対して統計処理を実行することによって前記ループ処理における前記第１の非同期処理の性能情報を算出することを特徴とする（９）に記載のプロファイラ。
（１１）前記第１の非同期処理がＣＰＵ間の通信処理である場合に、転送量、転送パターン、及び転送先を前記ＣＰＵ間の通信処理の性能情報として取得し、
前記取得された転送量、転送パターン、転送先の情報に基づいて、前記ＣＰＵ間で送受信されたデータの推定転送時間を算出し、
前記算出された推定転送時間が含まれる前記出力情報を生成することを特徴とする（７）に記載のプロファイラ。
（１２）前記計算機システムは、前記ＧＰＵによって実行された前記非同期処理の性能情報を取得するＧＰＵプロファイラを備え、
前記プロファイラは、
前記オーバーラップ期間において前記ＧＰＵによって実行された前記非同期処理を特定し、
前記ＧＰＵプロファイラから前記特定された非同期処理の性能情報を取得することを特徴とする（７）に記載のプロファイラ。
【符号の説明】
【０４９８】
１０１  ＣＰＵ
１０２  メモリ
１０５  ＧＰＵ
１０６  ＧＰＵメモリ
１１０  インタフェース
１１１  インタフェース
２０１  コンパイラ
２０２  性能分析モジュール
２０３  トラップ埋め込みロードモジュール
２０４  リンカ
２０５  オーバーラップ期間性能情報テーブル
２０７  通信時間推定情報
２０８  ＧＰＵプロファイラ
２０９  ＧＰＵ非同期処理情報
２１０  オーバーラップ管理情報
２１１  オーバーラップフラグ
２１２  テーブル識別子
２１３  シーケンシャル番号
３０１  ソース
３０２  実行モジュール
４０１  オーバーラップ期間判定モジュール
４０２  ＣＰＵ情報取得モジュール
４０３  ＭＰＩ情報取得モジュール
４０４  ＧＰＵ情報取得モジュール
４０５  同期処理情報取得モジュール
４０６  分析結果出力モジュール
５０１  ＣＰＵ処理情報
５０２  Ｍｅｍｃｐｙ非同期処理情報
５０３  ＧＰＵ非同期処理情報
５０４  ＭＰＩ非同期処理情報
５０５  ＧＰＵ同期処理情報
５０６  ＭＰＩ同期処理情報
５１０  ＣＰＵ処理情報
２２０１  プロファイラ
２３０１  トラップ埋め込みソース
【図１】
0005589204.tif 000002
【図２】
0005589204.tif 000003
【図３】
0005589204.tif 000004
【図４】
0005589204.tif 000005
【図５Ａ】
0005589204.tif 000006
【図５Ｂ】
0005589204.tif 000007
【図６Ａ】
0005589204.tif 000008
【図６Ｂ】
0005589204.tif 000009
【図６Ｃ】
0005589204.tif 000010
【図７Ａ】
0005589204.tif 000011
【図７Ｂ】
0005589204.tif 000012
【図７Ｃ】
0005589204.tif 000013
【図８】
0005589204.tif 000014
【図９】
0005589204.tif 000015
【図１０】
0005589204.tif 000016
【図１１Ａ】
0005589204.tif 000017
【図１１Ｂ】
0005589204.tif 000018
【図１２】
0005589204.tif 000019
【図１３Ａ】
0005589204.tif 000020
【図１３Ｂ】
0005589204.tif 000021
【図１３Ｃ】
0005589204.tif 000022
【図１４】
0005589204.tif 000023
【図１５】
0005589204.tif 000024
【図１６】
0005589204.tif 000025
【図１７】
0005589204.tif 000026
【図１８】
0005589204.tif 000027
【図１９】
0005589204.tif 000028
【図２０】
0005589204.tif 000029
【図２１】
0005589204.tif 000030
【図２２】
0005589204.tif 000031
【図２３】
0005589204.tif 000032
【図２４Ａ】
0005589204.tif 000033
【図２４Ｂ】
0005589204.tif 000034