(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024100564
(43)【公開日】2024-07-26
(54)【発明の名称】Spawn制御プログラム、Spawn制御方法、および情報処理装置
(51)【国際特許分類】
G06F 11/34 20060101AFI20240719BHJP
G06F 9/48 20060101ALI20240719BHJP
【FI】
G06F11/34 176
G06F9/48 370
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2023004659
(22)【出願日】2023-01-16
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100104190
【弁理士】
【氏名又は名称】酒井 昭徳
(72)【発明者】
【氏名】戸倉 宏樹
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042GA23
5B042MA08
5B042MA11
5B042MC21
(57)【要約】
【課題】同じコミュニケータに属するプロセスを特定すること。
【解決手段】情報処理装置101は、MPIプログラムが複数回実行された結果、複数回の各実行におけるコミュニケータごとにプロセス情報(例えば、プロセス情報121~123)を取得する。プロセス情報は、コミュニケータ内のプロセスの情報であり、コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含む。情報処理装置101は、取得したプロセス情報に基づいて、複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、
取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する、
処理をコンピュータに実行させることを特徴とするSpawn制御プログラム。
【請求項2】
前記プロセス情報は、前記コミュニケータ内の動的生成されたプロセスのプロセス数および起動プログラム名を表す情報をさらに含み、
前記判断する処理は、
前記複数回の異なる実行において、プロセスのプロセス数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする請求項1に記載のSpawn制御プログラム。
【請求項3】
前記プロセス情報は、前記コミュニケータ内の動的生成されたプロセスが他のプロセスを起動した回数を表す情報をさらに含み、
前記判断する処理は、
前記複数回の異なる実行において、プロセスのプロセス数、起動プログラム名および他のプロセスを起動した回数が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されるプロセス同士を、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする請求項2に記載のSpawn制御プログラム。
【請求項4】
取得した前記プロセス情報に基づいて、前記複数回の各実行におけるコミュニケータをノードとし、前記コミュニケータ内の動的生成されたプロセスと当該プロセスの起動元プロセスとの呼び出し関係を有向エッジとしたグラフを生成し、
前記ノードが表すコミュニケータ内のプロセスを起動元プロセスにおいて起動した起動順に基づいて、生成した前記グラフ間で比較対象となるノードの組合せを特定する、
処理を前記コンピュータに実行させ、
前記判断する処理は、
特定した前記ノードの組合せについて、前記プロセス情報に基づいて、前記ノードの組合せの各ノードが表すコミュニケータ内のプロセスの情報が一致するか否かを判断し、
特定した前記ノードの組合せの全てにおいて、前記プロセスの情報が一致する場合、前記ノードの組合せごとに、当該組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする請求項2に記載のSpawn制御プログラム。
【請求項5】
生成した前記グラフの構造に基づいて、前記複数回の各実行におけるグラフ同士が同型であるか否かを判定する、処理を前記コンピュータに実行させ、
前記グラフ同士が同型ではないと判定した場合、前記MPIプログラムの性能評価を中止する、ことを特徴とする請求項4に記載のSpawn制御プログラム。
【請求項6】
前記同じコミュニケータに属すると判断したプロセスが属するコミュニケータそれぞれに、同一のSpawn番号を設定し、
前記複数回の各実行において得られた前記同一のSpawn番号が割り振られたコミュニケータの性能情報に基づいて、前記コミュニケータに対応するプログラムについての性能分析を行う、
処理を前記コンピュータに実行させることを特徴とする請求項1~5のいずれか一つに記載のSpawn制御プログラム。
【請求項7】
MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、
取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を同じコミュニケータに属するプロセスと判断する、
処理をコンピュータが実行することを特徴とするSpawn制御方法。
【請求項8】
MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、
取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を同じコミュニケータに属するプロセスと判断する、
制御部を有することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、Spawn制御プログラム、Spawn制御方法、および情報処理装置に関する。
【背景技術】
【0002】
MPI(Message Passing Interface)プログラムは、複数のプロセスを起動し、複数のノード(計算機)を用いて計算を行う際によく用いられる。MPIプログラムを使用することで、ノード間の通信をMPIライブラリから提供される関数を使用して容易に行うことができる。このため、MPIプログラムは、スーパーコンピュータなどに幅広く使用されている。MPIプログラムでは、動的にプロセスを生成することができる。例えば、MPIプログラムを実行中に、Spawnプロセスと呼ばれるプロセスを新規に生成して実行することができる。
【0003】
先行技術としては、データ処理システムにおいて実行されるソフトウェア・コンポーネントについて、ソフトウェア・コンポーネントにおける処理の開始時と処理の終了時とに、処理の開始時の識別子と、処理の終了時の識別子と、コンポーネント名と、メソッド名とを記録するようにし、当該記録に基づいて、ソフトウェア・コンポーネントの呼出関係をトレースするものがある。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、従来技術では、MPIプログラムを複数回実行して性能分析を行うにあたり、異なる実行において動的生成された同じプロセスを特定することが難しい。例えば、実行ごとにSpawnプロセスが属するコミュニケータを識別するSpawn番号が異なる可能性があり、同じSpawnプロセスを特定できず、各実行で得られた性能情報を組み合わせて性能分析を行うことが難しい。
【0006】
一つの側面では、本発明は、同じコミュニケータに属するプロセスを特定することを目的とする。
【課題を解決するための手段】
【0007】
1つの実施態様では、MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する、Spawn制御プログラムが提供される。
【発明の効果】
【0008】
本発明の一側面によれば、同じコミュニケータに属するプロセスを特定することができるという効果を奏する。
【図面の簡単な説明】
【0009】
【
図1】
図1は、実施の形態にかかるSpawn制御方法の一実施例を示す説明図である。
【
図2】
図2は、Spawn番号の割り当て例を示す説明図である。
【
図3】
図3は、情報処理システム300のシステム構成例を示す説明図である。
【
図4】
図4は、ログインノード301のハードウェア構成例を示すブロック図である。
【
図5】
図5は、動的プロセス生成回数が0回のMPIプログラムの一例を示す説明図である。
【
図6】
図6は、動的プロセス生成を行わないMPIプログラムを実行した場合のプロセス情報の具体例を示す説明図である。
【
図7】
図7は、動的プロセス生成回数が1回のMPIプログラムの一例を示す説明図(その1)である。
【
図8】
図8は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第1の具体例を示す説明図である。
【
図9】
図9は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第2の具体例を示す説明図である。
【
図10】
図10は、動的プロセス生成回数が1回のMPIプログラムの一例を示す説明図(その2)である。
【
図11】
図11は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第3の具体例を示す説明図である。
【
図12】
図12は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第4の具体例を示す説明図である。
【
図13】
図13は、ログインノード301の機能的構成例を示すブロック図である。
【
図14】
図14は、動的プロセス生成回数が3回のMPIプログラムの一例を示す説明図である。
【
図15】
図15は、動的プロセス生成回数が4回のMPIプログラムの一例を示す説明図である。
【
図16】
図16は、ログインノード301のSpawn制御処理手順の一例を示すフローチャートである。
【
図17】
図17は、コミュニケータごとのプロセス情報の具体例を示す説明図(その1)である。
【
図18】
図18は、コミュニケータごとのプロセス情報の具体例を示す説明図(その2)である。
【
図19】
図19は、コミュニケータごとのプロセス情報の具体例を示す説明図(その3)である。
【
図20】
図20は、コミュニケータごとのプロセス情報の具体例を示す説明図(その4)である。
【
図21】
図21は、コミュニケータごとのプロセス情報の具体例を示す説明図(その5)である。
【
図23】
図23は、グラフの第1の比較例を示す説明図(その1)である。
【
図24】
図24は、グラフの第1の比較例を示す説明図(その2)である。
【
図25】
図25は、グラフの第1の比較例を示す説明図(その3)である。
【
図26】
図26は、グラフの第1の比較例を示す説明図(その4)である。
【
図27】
図27は、グラフの第1の比較例を示す説明図(その5)である。
【
図28】
図28は、グラフの第1の比較例を示す説明図(その6)である。
【
図29】
図29は、グラフの第1の比較例を示す説明図(その7)である。
【
図30】
図30は、グラフの第1の比較例を示す説明図(その8)である。
【
図31】
図31は、グラフの第1の比較例を示す説明図(その9)である。
【
図32】
図32は、グラフの第1の比較例を示す説明図(その10)である。
【
図33】
図33は、グラフの第1の比較例を示す説明図(その11)である。
【
図34】
図34は、グラフの第1の比較例を示す説明図(その12)である。
【
図35】
図35は、グラフの第1の比較例を示す説明図(その13)である。
【
図36】
図36は、グラフの第2の比較例を示す説明図(その1)である。
【
図37】
図37は、グラフの第2の比較例を示す説明図(その2)である。
【
図38】
図38は、部分的に信用できるプロセスの特定例を示す説明図(その1)である。
【
図39】
図39は、部分的に信用できるプロセスの特定例を示す説明図(その2)である。
【発明を実施するための形態】
【0010】
以下に図面を参照して、本発明にかかるSpawn制御プログラム、Spawn制御方法、および情報処理装置の実施の形態を詳細に説明する。
【0011】
(実施の形態)
図1は、実施の形態にかかるSpawn制御方法の一実施例を示す説明図である。
図1において、情報処理装置101は、MPIプログラムが複数回実行された結果、複数回の異なる実行において動的生成された同じSpawnプロセスを特定するコンピュータである。MPIとは、並列コンピューティングを利用するための標準化された規格である。Spawnプロセスは、MPIプログラムを実行中に動的生成されるプロセスである。
【0012】
MPIプログラムでは、各プロセスにプロセス番号が割り当てられる。Spawnプロセスにも、プロセス番号が割り当てられる。プロセス番号は、基本的にコミュニケータ内で固有のもの割り当てられる。コミュニケータは、MPIの通信を行う単位であり、1以上のプロセスを含むグループに対応する。
【0013】
MPIプログラムを実行中に、動的プロセス生成によりSpawnプロセスが生成された場合、起動元(親)と起動先(子)は、別のコミュニケータとなる。各コミュニケータに属するプロセスにプロセス番号が割り当てられるが実態は異なる。そのため、システムによっては、動的プロセス生成されたSpawnプロセスが属するコミュニケータに対して、Spawn番号が割り当てられる場合がある。
【0014】
Spawn番号は、コミュニケータを識別する識別情報に相当する。例えば、動的プロセスが生成される際に、管理ノードにSpawn番号発行要求が送られ、Spawn番号発行要求受付順にSpawn番号が連番で割り振られる。
【0015】
図1の例では、グラフ110は、MPIプログラムを実行した場合のプロセスの起動を表している(後述の
図2に示す第1回目計測に対応)。グラフ110において、Spawn番号:0~3のコミュニケータが示されている。Spawn番号:0のコミュニケータは、プロセス0~4を含む。Spawn番号:0のコミュニケータ内のプロセス0~4は、静的に起動されるプロセスである。なお、プロセス#の#は、プロセス番号を示す。
【0016】
Spawn番号:1のコミュニケータは、Spawn番号:0のコミュニケータ内のプロセス1によって動的生成されたプロセス0,1(Spawnプロセス)を含む。Spawn番号:2のコミュニケータは、Spawn番号:0のコミュニケータ内のプロセス4によって動的生成されたプロセス0~2(Spawnプロセス)を含む。Spawn番号:3のコミュニケータは、Spawn番号:2のコミュニケータ内のプロセス2によって動的生成されたプロセス0,1(Spawnプロセス)を含む。
【0017】
ここで、スーパーコンピュータなどの様々な計算機において、プログラムの性能分析を行うためにプロファイラと呼ばれる性能解析ツールを使用する場合がある。プロファイラでは、MPIプログラムに対する性能分析が可能であり、動的プロセス生成されたプログラムに対しても性能分析が可能である。プロファイラでは、より詳細な性能情報を取得するために、同じプログラムを複数回実行する場合がある。
【0018】
例えば、n回実行する場合、各回のMPIプログラムの性能情報をディスクに書き出し、得られたn個の性能情報を集計して、詳細なプロファイル結果を出力する。MPIプログラムで動的プロセス生成が行われた場合であっても、各回のSpawnプロセスに対する性能情報は取得できる。Spawnプロセスは、例えば、性能評価対象のプログラムのプロセスである。
【0019】
しかし、複数回にわたって性能情報を取得して性能分析をしようとしたときに、実行ごとに性能分析対象のプロセスのSpawn番号が異なる可能性がある。そのため、従来、Spawn番号から特定されるSpawnプロセスに対する性能情報は、実行ごとの性能情報のみ信用でき、他の実行で得られた性能情報と組み合わせて性能分析することができなかった。
【0020】
このような状態は、実行ごとに複数回の動的プロセス生成が行われる場合に発生する。ここで、
図2を用いて、実行ごとに複数回の動的プロセス生成が行われる場合のSpawn番号の割り当て例について説明する。
【0021】
図2は、Spawn番号の割り当て例を示す説明図である。
図2において、静的に起動されるプロセスが5個、動的プロセス生成回数が3回のMPIプログラムを3回実行した場合を想定する。
図2中、P#は、プロセス#を示す。
【0022】
第1回目計測では、Spawn番号:0のコミュニケータ内のプロセス1によって動的生成されたプロセス0,1を含むコミュニケータに、Spawn番号:1が割り当てられている。また、Spawn番号:0のコミュニケータ内のプロセス4によって動的生成されたプロセス0~2を含むコミュニケータに、Spawn番号:2が割り当てられている。また、Spawn番号:2のコミュニケータ内のプロセス2によって動的生成されたプロセス0,1を含むコミュニケータに、Spawn番号:3が割り当てられている。
【0023】
第2回目計測では、Spawn番号:0のコミュニケータ内のプロセス1によって動的生成されたプロセス0,1を含むコミュニケータに、Spawn番号:3が割り当てられている。また、Spawn番号:0のコミュニケータ内のプロセス4によって動的生成されたプロセス0~2を含むコミュニケータに、Spawn番号:1が割り当てられている。また、Spawn番号:1のコミュニケータ内のプロセス2によって動的生成されたプロセス0,1を含むコミュニケータに、Spawn番号:2が割り当てられている。
【0024】
第3回目計測では、Spawn番号:0のコミュニケータ内のプロセス1によって動的生成されたプロセス0,1を含むコミュニケータに、Spawn番号:2が割り当てられている。また、Spawn番号:0のコミュニケータ内のプロセス4によって動的生成されたプロセス0~2を含むコミュニケータに、Spawn番号:1が割り当てられている。また、Spawn番号:1のコミュニケータ内のプロセス2によって動的生成されたプロセス0,1を含むコミュニケータに、Spawn番号:3が割り当てられている。
【0025】
例えば、各実行においてSpawn番号:0のコミュニケータ内のプロセス1によって動的生成されたプロセス0,1は、同じSpawnプロセスである。しかし、
図2の例では、各実行において、Spawn番号:0のコミュニケータ内のプロセス1によって動的生成されたプロセス0,1(Spawnプロセス)に、実行ごとに異なるSpawn番号が割り当てられている。
【0026】
Spawn番号が実行ごとに一意に定まらない理由としては、例えば、各プロセスが非同期に動作するため、Spawn番号発行要求受付順が各実行で異なるものとなることが挙げられる。このため、従来は、各実行で得られたSpawnプロセスに対するプロファイルデータがどの動的プロセス生成によるものか判断できず、複数回の計測が必要な性能分析を行うことができないという問題があった。
【0027】
そこで、本実施の形態では、親(起動元)が子(起動先)を何回目に起動したかを示す起動順を示す情報を利用して、同じコミュニケータに属するプロセスを特定するSpawn制御方法について説明する。ここで、情報処理装置101の処理例(下記(1)および(2)の処理に対応)について説明する。
【0028】
(1)情報処理装置101は、MPIプログラムが複数回実行された結果、複数回の各実行におけるコミュニケータごとにプロセス情報を取得する。ここで、プロセス情報は、コミュニケータ内のプロセスの情報である。プロセス情報は、コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含む。
【0029】
図1の例では、プロセス情報121~123が取得された場合を想定する。プロセス情報121は、1回目の実行(
図2に示した第1回目計測に対応)におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含む。例えば、プロセス情報121は、Spawn番号:1のコミュニケータ内の動的生成されたプロセス0,1の起動元プロセス(Spawn番号:0のコミュニケータ内のプロセス1)における起動順「1」を含む。
【0030】
プロセス情報121は、2回目の実行(
図2に示した第2回目計測に対応)におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含む。例えば、プロセス情報122は、Spawn番号:3のコミュニケータ内の動的生成されたプロセス0,1の起動元プロセス(Spawn番号:0のコミュニケータ内のプロセス1)における起動順「1」を含む。
【0031】
プロセス情報123は、3回目の実行(
図2に示した第3回目計測に対応)におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含む。例えば、プロセス情報123は、Spawn番号:2のコミュニケータ内の動的生成されたプロセス0,1の起動元プロセス(Spawn番号:0のコミュニケータ内のプロセス1)における起動順「1」を含む。
【0032】
(2)情報処理装置101は、取得したプロセス情報に基づいて、複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する。ここでは、MPIプログラムを複数回実行したとしても、各プロセスでは、同じ入力データが処理され、乱数などの実行時に処理するデータが変化することはないとする。
【0033】
また、各実行における動的プロセス生成回数が0以上であり、MPIプログラムを複数回実行しても、同じプロセス(同じスレッド)から同じ順番で同じ実行バイナリを用いて動的プロセス生成が行われるとする。このため、異なるSpawn番号が割り当てられたコミュニケータ内のプロセスであっても、同じ起動元プロセスから同じ起動順で起動されたプロセスは、同じSpawnプロセスであるといえる。
【0034】
図1の例では、情報処理装置101は、プロセス情報121に基づいて、例えば、Spawn番号:1のコミュニケータ内のプロセス0,1が、第1回目計測において、Spawn番号:0のコミュニケータ内のプロセス1から起動順「1」で起動(動的生成)されたプロセスであると判断する。なお、Spawn番号:0は、最初に起動される静的なプロセスであり、全ての実行において同じコミュニケータに対応する。
【0035】
また、情報処理装置101は、プロセス情報122に基づいて、例えば、Spawn番号:3のコミュニケータ内のプロセス0,1が、第2回目計測において、Spawn番号:0のコミュニケータ内のプロセス1から起動順「1」で起動(動的生成)されたプロセスであると判断する。また、情報処理装置101は、プロセス情報121に基づいて、例えば、Spawn番号:2のコミュニケータ内のプロセス0,1が、第3回目計測において、Spawn番号:0のコミュニケータ内のプロセス1から起動順「1」で起動(動的生成)されたプロセスであると判断する。
【0036】
ここで、プロセスAを「第1回目計測におけるSpawn番号:1のコミュニケータ内のプロセス0,1」とする。プロセスBを「第2回目計測におけるSpawn番号:3のコミュニケータ内のプロセス0,1」とする。プロセスCを「第3回目計測におけるSpawn番号:2のコミュニケータ内のプロセス0,1」とする。
【0037】
プロセスA~Cは、複数回(第1回目計測~第3回目計測)の異なる実行において、同じ起動元プロセス(Spawn番号:0のコミュニケータ内のプロセス1)から同じ起動順(1)で起動されたプロセス同士である。このため、情報処理装置101は、プロセスA~Cを、同じコミュニケータに属するプロセス(Spawnプロセス)と判断する。
【0038】
このように、情報処理装置101によれば、複数回の異なる実行において動的生成されたプロセスのうち、同じコミュニケータに属するプロセスを特定することができる。これにより、情報処理装置101は、同じコミュニケータに属するプロセスに対する性能分析を可能にすることができる。
【0039】
図1の例では、第1回目計測~第3回目計測において動的生成されたプロセスのうち、同じコミュニケータに属するプロセスA~Cを特定することができる。プロセスA~Cは、性能評価対象となるプログラムに相当する。これにより、情報処理装置101は、複数回の計測が求められるMPIプログラムの性能分析を実現することが可能となる。
【0040】
(情報処理システム300のシステム構成例)
つぎに、
図1に示した情報処理装置101を含む情報処理システム300のシステム構成例について説明する。ここでは、
図1に示した情報処理装置101を、情報処理システム300内のログインノード301に適用した場合を例に挙げて説明する。
【0041】
図3は、情報処理システム300のシステム構成例を示す説明図である。
図3において、情報処理システム300は、ログインノード301と、ユーザ端末302と、計算ノードN1~Nm(m:2以上の自然数)と、共有データベース320と、を含む。情報処理システム300において、ログインノード301、ユーザ端末302、計算ノードN1~Nmおよび共有データベース320は、有線または無線のネットワーク310を介して接続される。ネットワーク310は、例えば、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)などである。
【0042】
ここで、ログインノード301は、ジョブ(MPIプログラムのプロセス)を投入したり、MPIプログラムの性能分析を行ったりするコンピュータである。ログインノード301は、例えば、サーバである。
【0043】
ユーザ端末302は、情報処理システム300のユーザが使用するコンピュータである。ユーザは、例えば、MPIプログラムの性能分析を行う分析者である。ユーザ端末302は、例えば、PC(Personal Computer)、タブレットPCなどである。
【0044】
計算ノードN1~Nmは、ジョブ(MPIプログラムのプロセス)を実行するコンピュータである。計算ノードN1~Nmは、例えば、サーバである。
【0045】
共有データベース320は、MPIプログラムを実行することにより得られる性能情報や、MPIプログラムの性能分析結果を記録する。共有データベース320は、例えば、データベースサーバにより実現される。また、共有データベース320は、ログインノード301が有していてもよい。
【0046】
情報処理システム300において、ユーザは、例えば、ssh(secure shell)によりログインノード301にログインする。ログインノード301は、例えば、ユーザからの指示に応じて、計算ノードN1~Nmに性能分析のためのジョブを投入して実行させる。
【0047】
計算ノードN1~Nmは、MPIプログラムをn回実行し、各回の性能情報を共有データベース320に記録する(n:2以上の自然数)。この結果、共有データベース320には、n個の性能情報が保存される。ログインノード301は、n個の性能情報からMPIプログラムの性能分析を行い、性能分析結果を出力する。
【0048】
ユーザ端末302は、例えば、sftp(sh file transfer protocolは)などにより、共有データベース320に記録された性能分析結果をログインノード301からダウンロードして表示してもよい。性能分析結果は、例えば、ログインノード301で表示されてもよい。
【0049】
なお、ここではログインノード301とユーザ端末302とを別体に設けることにしたが、これに限らない。例えば、ログインノード301は、ユーザ端末302により実現されてもよい。また、MPIプログラムの性能分析は、例えば、計算ノードN1~Nmのいずれかで実行されてもよく、また、ユーザ端末302で実行されてもよい。
【0050】
(ログインノード301のハードウェア構成例)
つぎに、ログインノード301のハードウェア構成例について説明する。
【0051】
図4は、ログインノード301のハードウェア構成例を示すブロック図である。
図4において、ログインノード301は、CPU(Central Processing Unit)401と、メモリ402と、ディスクドライブ403と、ディスク404と、通信I/F(Interface)405と、可搬型記録媒体I/F406と、可搬型記録媒体407と、を有する。また、各構成部は、バス400によってそれぞれ接続される。
【0052】
ここで、CPU401は、ログインノード301の全体の制御を司る。CPU401は、複数のコアを有していてもよい。メモリ402は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMがOSのプログラムを記憶し、ROMがアプリケーションプログラムを記憶し、RAMがCPU401のワークエリアとして使用される。メモリ402に記憶されるプログラムは、CPU401にロードされることで、コーディングされている処理をCPU401に実行させる。
【0053】
ディスクドライブ403は、CPU401の制御に従ってディスク404に対するデータのリード/ライトを制御する。ディスク404は、ディスクドライブ403の制御で書き込まれたデータを記憶する。ディスク404は、例えば、磁気ディスク、光ディスクなどである。
【0054】
通信I/F405は、通信回線を通じてネットワーク310に接続され、ネットワーク310を介して外部のコンピュータ(例えば、
図3に示したユーザ端末302、計算ノードN1~Nm、共有データベース320)に接続される。そして、通信I/F405は、ネットワーク310と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。通信I/F405は、例えば、モデムやLANアダプタなどである。
【0055】
可搬型記録媒体I/F406は、CPU401の制御に従って可搬型記録媒体407に対するデータのリード/ライトを制御する。可搬型記録媒体407は、可搬型記録媒体I/F406の制御で書き込まれたデータを記憶する。可搬型記録媒体407は、例えば、CD(Compact Disc)-ROM、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリなどである。
【0056】
なお、ログインノード301は、上述した構成部のほかに、例えば、入力装置、ディスプレイなどを有してもよい。また、ログインノード301は、上述した構成部のうち、例えば、可搬型記録媒体I/F406、可搬型記録媒体407を有さなくてもよい。また、
図2に示したユーザ端末302、計算ノードN1~Nmおよび共有データベース320についても、ログインノード301と同様のハードウェア構成により実現することができる。ただし、ユーザ端末302は、上述した構成部のほかに、例えば、入力装置、ディスプレイなどを有する。
【0057】
(MPIプログラムについて)
ここで、MPIプログラムについて説明する。MPIプログラムでは、多数のプロセスを起動し、動的プロセスを起動した場合であっても、親(プロセス)と子(プロセス)が存在する。また、親と子を頂点(ノード)とし、親が子を起動させるときに親と子を辺(有向エッジ)で結ぶと木構造のグラフができる。このグラフには、ループが存在しない。
【0058】
親と子をそれぞれ頂点とすると、それぞれの頂点は、例えば、以下の情報を有する。親は、自分(子)の起動元プロセスに相当する。
【0059】
・親の”暫定Spawn番号”
・親のプロセス番号
・親のスレッド番号
・親が自分(子)を何回目に起動したか
・親の起動プログラム名
・自分の”暫定Spawn番号”
・自分のプロセス番号
・自分のスレッド番号
・自分のSpawnプロセスを起動した回数
・自分の起動プログラム名
【0060】
ここで、暫定Spawn番号は、動的プロセス生成したときに、Spawnプロセス(コミュニケータ)に割り振られる固有の識別情報である。暫定Spawn番号は、例えば、数字であっても文字列であってもよい。暫定Spawn番号は、同じ実行において他のSpawnプロセスと区別できればよく、各実行において異なるものが割り振られる場合がある。
【0061】
プロセス番号は、コミュニケータ内のプロセスに割り振られる固有の識別情報である。スレッド番号は、プロセス内のスレッドに割り振られる固有の識別情報である。親が自分(子)を何回目に起動したかは、親が子を何回目に起動したかを示す起動順番情報である。起動順番情報は、例えば、動的プロセス生成時に子(プロセス)によって生成される。
【0062】
親の起動プログラム名は、プロセスを起動したMPIプログラムの名称である。自分の起動プログラム名は、プロセスを実行するMPIプログラムの名称である。自分のSpawnプロセスを起動した回数は、例えば、スレッドごとに固有に設けられるカウンタによって計数される。
【0063】
動的プロセス生成を行う場合、親(プロセス)は、子(プロセス)に以下のような情報を渡す。子(プロセス)の起動プログラム名は、子(プロセス)自身で取得できるため、親(プロセス)から渡さなくてもよい。また、子(プロセス)は、「親が自分(子)を何回目に起動したか」の情報を生成するにあたり、親(プロセス)に対して、自分(子)を何回目に起動したかを問い合わせてもよい。
【0064】
・親の”暫定Spawn番号”
・親のプロセス番号
・親のスレッド番号
・親のSpawnプロセスを起動した回数
・親の起動プログラム名
【0065】
ここで、動的プロセス生成を行わない単純なMPIプログラムについて説明する。
【0066】
図5は、動的プロセス生成回数が0回のMPIプログラムの一例を示す説明図である。
図5において、コミュニケータ500内のプロセス0~4が示されている。コミュニケータ500内のプロセス0~4は、動的プロセス生成を行わないMPIプログラム(mpiexec)を実行することにより起動されたプロセスである。各プロセスは1スレッドから構成されるとする。
【0067】
つぎに、
図5に示したMPIプログラムを実行した結果、コミュニケータ500内の各プロセス0~4が有する情報について説明する。
【0068】
図6は、動的プロセス生成を行わないMPIプログラムを実行した場合のプロセス情報の具体例を示す説明図である。
図6において、プロセス情報600は、
図5に示したコミュニケータ500内の各プロセス0~4が有する情報を表す。
【0069】
コミュニケータ500内の各プロセス0~4は、mpiexecにより起動された静的なプロセス(ユーザが固定で起動したプロセス)である。このため、各プロセス0~4が有する親の情報は存在せず、プロセス情報600において、各プロセス0~4が有する親の情報は「-1」となっている。
【0070】
また、各プロセス0~4は、mpiexecにより起動されたプロセスである。このため、各プロセス0~4の「自分の暫定Spawn番号」は「0」となる。また、動的プロセス生成は行われていない。このため、各プロセス0~4の「自分のSpawnを起動した回数」は「0」となる。また、各プロセス0~4の「自分の起動プログラム名」は「a.out」である。
【0071】
図5に示したような動的プロセス生成回数が0回のMPIプログラムを複数回実行しても、
図6に示したような各プロセスが有する情報は変化しない。このため、動的プロセス生成回数が0回のMPIプログラムでは、Spawn番号が実行ごとに一意に定まらないという問題は生じない。
【0072】
つぎに、動的プロセス生成を行うMPIプログラムについて説明する。ここでは、動的プロセス生成回数が1回のMPIプログラムを例に挙げて説明する。
【0073】
図7は、動的プロセス生成回数が1回のMPIプログラムの一例を示す説明図(その1)である。
図7において、コミュニケータ701内のプロセス0~4と、コミュニケータ702内のプロセス0~2とが示されている。コミュニケータ701内のプロセス0~4は、MPIプログラム(mpiexec)を実行することにより起動されたプロセスである。コミュニケータ702内のプロセス0~2は、コミュニケータ701内のプロセス1により動的生成されたプロセスである。各プロセスは1スレッドから構成されている。
【0074】
つぎに、
図8および
図9を用いて、
図7に示したMPIプログラムを実行した結果、コミュニケータ701内の各プロセス0~4が有する情報と、コミュニケータ702内の各プロセス0~2が有する情報とについて説明する。
【0075】
図8は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第1の具体例を示す説明図である。
図9は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第2の具体例を示す説明図である。
図8において、プロセス情報800は、
図7に示したコミュニケータ701内の各プロセス0~4が有する情報を表す。
【0076】
コミュニケータ701内の各プロセス0~4は、mpiexecにより起動された静的なプロセス(ユーザが固定で起動したプロセス)である。このため、各プロセス0~4が有する親の情報は存在せず、プロセス情報800において、各プロセス0~4が有する親の情報は「-1」となっている。
【0077】
また、各プロセス0~4は、mpiexecにより起動されたプロセスである。このため、各プロセス0~4の「自分の暫定Spawn番号」は「0」となる。ここで、コミュニケータ701内のプロセス1により、プロセス(コミュニケータ702内のプロセス0~3)の動的生成が1回行われている。
【0078】
このため、プロセス0~4のうち、プロセス1の「自分のSpawnを起動した回数」が「1」となっている。プロセス0,2,3,4の「自分のSpawnを起動した回数」は「0」である。また、各プロセス0~4の「自分の起動プログラム名」は「a.out」である。
【0079】
図9において、プロセス情報900は、
図7に示したコミュニケータ702内の各プロセス0~2が有する情報を表す。コミュニケータ702内の各プロセス0~2は、コミュニケータ701内のプロセス1により動的生成されたプロセスである。各プロセス0~2の親の情報は、全てのプロセスで同じになっている。例えば、各プロセス0~2の「親が自分を何回目に起動したか」は、全てのプロセスで「0」になっている。この「0」は、親が自分を1回目に起動したことを示す。
【0080】
また、各プロセス0~2の自分の暫定Spawn番号」は「1」となっている。プロセス0~2からは、動的プロセス生成は行われていない。このため、各プロセス0~2の「自分のSpawnを起動した回数」は「0」となる。また、各プロセス0~2の「自分の起動プログラム名」は「b.out」である。
【0081】
つぎに、動的プロセス生成を行うMPIプログラムであって、各プロセスが複数のスレッドから構成されるMPIプログラムについて説明する。ここでは、動的プロセス生成回数が1回で、各プロセスが2スレッドから構成されるMPIプログラムを例に挙げて説明する。
【0082】
図10は、動的プロセス生成回数が1回のMPIプログラムの一例を示す説明図(その2)である。
図10において、コミュニケータ1001内のプロセス0~4と、コミュニケータ1002内のプロセス0~2とが示されている。コミュニケータ1001内のプロセス0~4は、mpiexecを実行することにより起動されたプロセスである。コミュニケータ1002内のプロセス0~2は、コミュニケータ1001内のプロセス1により動的生成されたプロセスである。各プロセスは、2スレッドから構成されている。
【0083】
つぎに、
図11および
図12を用いて、
図10に示したMPIプログラムを実行した結果、コミュニケータ1001内の各プロセス0~4が有する情報と、コミュニケータ1002内の各プロセス0~2が有する情報とについて説明する。
【0084】
図11は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第3の具体例を示す説明図である。
図12は、動的プロセス生成を行うMPIプログラムを実行した場合のプロセス情報の第4の具体例を示す説明図である。
図11において、プロセス情報1100は、
図10に示したコミュニケータ1001内の各プロセス0~4が有する情報を表す。
【0085】
コミュニケータ1001内の各プロセス0~4は、mpiexecにより起動された静的なプロセス(ユーザが固定で起動したプロセス)である。このため、各プロセス0~4が有する親の情報は存在せず、プロセス情報1100において、各プロセス0~4が有する親の情報は「-1」となっている。
【0086】
各プロセス0~4は、mpiexecにより起動されたプロセスである。このため、各プロセス0~4の「自分の暫定Spawn番号」は「0」となる。また、各プロセス0~4は、2スレッドで構成されるため、各プロセス0~4内のスレッドにスレッド番号が割り当てられている。
【0087】
ここで、コミュニケータ1001内のプロセス1のスレッド1により、プロセス(コミュニケータ1002内のプロセス0~3)の動的生成が1回行われている。このため、プロセス0~4のうち、プロセス1のスレッド1の「自分のSpawnを起動した回数」が「1」となっている。プロセス1のスレッド0の「自分のSpawnを起動した回数」は「0」である。また、各プロセス0~4のスレッド0,1の「自分の起動プログラム名」は「a.out」である。
【0088】
図12において、プロセス情報1200は、
図10に示したコミュニケータ1002内の各プロセス0~2が有する情報を表す。コミュニケータ1002内の各プロセス0~2は、コミュニケータ1001内のプロセス1により動的生成されたプロセスである。各プロセス0~2の親の情報は、全てのプロセスで同じになっている。例えば、各プロセス0~2の各スレッド0,1の「親が自分を何回目に起動したか」は、全てのスレッドで「0」になっている。この「0」は、親が自分を1回目に起動したことを示す。
【0089】
また、各プロセス0~2の自分の暫定Spawn番号」は「1」となっている。プロセス0~2からは、動的プロセス生成は行われていない。このため、各プロセス0~2のスレッド0,1の「自分のSpawnを起動した回数」は「0」となる。また、各プロセス0~2のスレッド0,1の「自分の起動プログラム名」は「b.out」である。
【0090】
このように、プロセスが複数のスレッドから構成される場合であっても、プロセスの情報がプロセス内のスレッドごとの情報に拡張されるだけで、プロセスが1スレッドから構成される場合と同様に扱うことができる。
【0091】
(ログインノード301の機能的構成例)
つぎに、ログインノード301の機能的構成例について説明する。
【0092】
図13は、ログインノード301の機能的構成例を示すブロック図である。
図13において、ログインノード301は、取得部1301と、判断部1302と、設定部1303と、分析部1304と、出力部1305と、を含む。取得部1301~出力部1305は制御部1300となる機能であり、具体的には、例えば、
図4に示したメモリ402、ディスク404、可搬型記録媒体407などの記憶装置に記憶されたプログラムをCPU401に実行させることにより、または、通信I/F405により、その機能を実現する。各機能部の処理結果は、例えば、メモリ402、ディスク404などの記憶装置に記憶される。
【0093】
取得部1301は、動的プロセス生成が行われるMPIプログラムが複数回実行された結果、複数回の各実行(各回)の性能情報を取得する。ここで、各実行の性能情報は、MPIプログラムの性能分析に用いられる情報である。各実行の性能情報は、例えば、各実行(各回)のMPIプログラムの実行結果およびプロセス情報を含む。
【0094】
MPIプログラムの実行結果は、例えば、各実行におけるコミュニケータごとに、当該コミュニケータ内のプロセス等の実行結果を含む。プロセス等の実行結果は、例えば、プロセスやプロセス内のスレッドの実行時間、各種演算回数(浮動小数点演算回数、整数演算回数など)、CPU使用率、キャッシュ率、メモリ使用率などを含む。
【0095】
MPIプログラムのプロセス情報は、各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含む。また、MPIプログラムのプロセス情報は、コミュニケータ内の動的生成されたプロセスのプロセス数および起動プログラム名を表す情報を含む。また、MPIプログラムのプロセス情報は、コミュニケータ内の動的生成されたプロセスが他のプロセスを起動した回数を表す情報をさらに含むものであってもよい。他のプロセスは、自分のSpawnプロセス(子プロセス)に相当する。
【0096】
例えば、コミュニケータ内の動的生成されたプロセスを起動元プロセスにおいて起動した起動順は、「親が自分を何回目に起動したか」の情報に相当する。コミュニケータ内の動的生成されたプロセスのプロセス数は、コミュニケータ内のプロセス番号から特定される。なお、コミュニケータ内の動的生成されたプロセスのプロセス数は、例えば、プロセス情報内の列数から特定されてもよい。また、コミュニケータ内の動的生成されたプロセスの起動プログラム名は、「自分の起動プログラム名」の情報に相当する。コミュニケータ内の動的生成されたプロセスのスレッド数は、例えば、各プロセス内のスレッド番号から特定される。
【0097】
例えば、MPIプログラムのプロセス情報は、
図8および
図9に示したプロセス情報800,900や、
図11および
図12に示したプロセス情報1100,1200などである。ただし、取得部1301は、各実行(各回)のMPIプログラムの実行結果とMPIプログラムのプロセス情報とを別々に取得してもよい。
【0098】
具体的には、例えば、取得部1301は、MPIプログラムがn回実行された結果、
図3に示した共有データベース320から、0回~(n-1)回の各回の性能情報を取得する。また、取得部1301は、
図3に示した計算ノードN1~Nmから、0回~(n-1)回の各回の性能情報を取得してもよい。また、取得部1301は、不図示の入力装置を用いたユーザの操作入力により、0回~(n-1)回の各回の性能情報を取得してもよい。
【0099】
判断部1302は、取得された各実行(各回)の性能情報に基づいて、複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断する。同じSpawnプロセスは、同じコミュニケータに属するプロセスである。
【0100】
具体的には、例えば、判断部1302は、各実行のプロセス情報に基づいて、複数回の異なる実行において、プロセスのプロセス数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断する。プロセスのプロセス数および起動プログラム名が同一とは、コミュニケータ間で、コミュニケータ内のプロセス数が同一で、コミュニケータ内の各プロセスの起動プログラム名が同一であることを表す。
【0101】
また、Spawnプロセスがさらに他のプロセス(自分のSpawnプロセス)を起動する場合がある。判断部1302は、例えば、各実行のプロセス情報に基づいて、複数回の異なる実行において、プロセスのプロセス数、起動プログラム名および他のプロセスを起動した回数が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断してもよい。プロセスのプロセス数、起動プログラム名および他のプロセスを起動した回数が同一とは、コミュニケータ間で、コミュニケータ内のプロセス数が同一で、コミュニケータ内の各プロセスの起動プログラム名が同一で、コミュニケータ内の各プロセスが他のプロセスを起動した回数が同一であることを表す。
【0102】
また、各プロセスが複数のスレッドを含む場合がある。この場合、判断部1302は、例えば、複数回の異なる実行において、プロセスのプロセス数、スレッド数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断する。プロセスのプロセス数、スレッド数および起動プログラム名が同一とは、コミュニケータ間で、コミュニケータ内のプロセス数が同一で、コミュニケータ内の各プロセスのスレッド数が同一で、コミュニケータ内の各プロセス(スレッド)の起動プログラム名が同一であることを表す。
【0103】
また、判断部1302は、例えば、複数回の異なる実行において、プロセスのプロセス数、スレッド数、起動プログラム名および他のプロセスを起動した回数が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断してもよい。プロセスのプロセス数、スレッド数、起動プログラム名および他のプロセスを起動した回数が同一とは、コミュニケータ間で、コミュニケータ内のプロセス数が同一で、コミュニケータ内の各プロセスのスレッド数が同一で、コミュニケータ内の各プロセス(スレッド)の起動プログラム名が同一で、コミュニケータ内の各プロセス(スレッド)が他のプロセスを起動した回数が同一であることを表す。
【0104】
以下の説明では、特に指定する場合を除いて、各プロセスが1スレッドから構成される場合を例に挙げて説明する。
【0105】
より詳細に説明すると、例えば、まず、判断部1302は、取得された各実行のプロセス情報に基づいて、グラフを生成する。ここで、グラフは、各実行におけるプロセスの起動を表す。グラフは、例えば、各実行におけるコミュニケータをノードとし、コミュニケータ内の動的生成されたプロセスと当該プロセスの起動元プロセスとの呼び出し関係を有向エッジとしたグラフである。
【0106】
例えば、MPIプログラムをn回実行したとすると、0回~(n-1)回の各回のグラフが生成される。グラフの具体例については、例えば、
図22を用いて後述する。
【0107】
つぎに、判断部1302は、生成したグラフの構造に基づいて、複数回の各実行におけるグラフ同士が同型であるか否かを判定する。グラフの同型とは、例えば、グラフ同士が同一の頂点(ノード)を持ち、同一の辺(有向エッジ)のつながり方をしていることである。グラフの同型性判定は、既存のいかなる技術を用いて行われてもよい。
【0108】
ここで、グラフ同士が同型ではないと判定した場合、判断部1302は、実行されたMPIプログラムが性能評価対象のプログラムではないと判断する。この場合、ログインノード301は、例えば、MPIプログラムの性能評価を中止する。
【0109】
一方、グラフ同士が同型であると判定した場合、判断部1302は、ノードが表すコミュニケータ内の動的生成されたプロセスの起動順に基づいて、生成したグラフ間で比較対象となるノードの組合せを特定する。プロセスの起動順は、当該プロセスを起動元プロセスにおいて起動した順番であり、親が自分を何回目に起動したかの情報に相当する。
【0110】
例えば、判断部1302は、自分の暫定Spawn番号が「0」のコミュニケータを表すノードの組合せを、比較対象となるノードの組合せとして特定する。また、判断部1302は、自分の暫定Spawn番号が0以外のコミュニケータを表すノードのうち、同じ起動元プロセスから同じ起動順で起動されたプロセスを含むコミュニケータを表すノードの組合せを、比較対象となるノードの組合せとして特定する。起動元プロセスは、例えば、親のプロセス番号(または、親のプロセス番号、スレッド番号)や親の起動プログラム名から特定される。
【0111】
そして、判断部1302は、特定したノードの組合せの全てにおいて、ノードの組合せの各ノードが表すコミュニケータ内のプロセスの情報が一致するか否かを判断する。プロセスの情報は、例えば、プロセスのプロセス数および起動プログラム名である。また、プロセスの情報は、プロセスのプロセス数、起動プログラム名および他のプロセスを起動した回数であってもよい。
【0112】
また、各プロセスが複数スレッドから構成される場合、判断部1302は、さらにプロセス内のスレッド数についても一致するか否かを判断する。プロセス内のスレッド数の一致判定は、例えば、同じプロセス番号のプロセス同士でスレッド数を比較することによって行われる。また、各プロセスが複数スレッドから構成される場合、判断部1302は、他のプロセスを起動した回数について、プロセス内のスレッドごとに比較する。他のプロセスを起動した回数の一致判定は、例えば、同じプロセス番号のプロセス内の同じスレッド番号のスレッド同士で他のプロセスを起動した回数を比較することによって行われる。
【0113】
ここで、ノードの組合せの全てにおいてプロセスの情報が一致するとする。この場合、判断部1302は、ノードの組合せごとに、当該組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じコミュニケータに属するSpawnプロセスと判断する。
【0114】
一方、ノードの組合せの少なくとも一部の組合せにおいてプロセスの情報が不一致の場合、ログインノード301は、例えば、MPIプログラムの性能評価を中止する。プロセスの情報が不一致とは、例えば、プロセスのプロセス数、スレッド数、起動プログラム名および他のプロセスを起動した回数のうちの少なくともいずれかが一致しないことを意味する。
【0115】
なお、同じSpawnプロセスを判断する際の具体的な処理例については、
図23~
図35を用いて後述する。
【0116】
また、上述した説明では、ノードの組合せの一部の組合せにおいてプロセスの情報が不一致の場合、MPIプログラムの性能評価を中止することにしたが、これに限らない。
【0117】
例えば、判断部1302は、特定したノードの組合せの一部の組合せのプロセスの情報が不一致の場合、一部の組合せのノードの親ノードおよび当該親ノードから呼び出されるノードを除くノードの組合せを検出してもよい。そして、判断部1302は、検出したノードの組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じSpawnプロセスと判断してもよい。
【0118】
これにより、グラフ同士で情報が完全一致しなくても、グラフ同士で情報が一致するノードの組合せを検出して、部分的に信用できるプロセスを特定することができる。なお、部分的に信用できるプロセスの特定例については、
図38および
図39を用いて後述する。
【0119】
設定部1303は、同じSpawnプロセスと判断されたプロセスが属するコミュニケータそれぞれに、同一のSpawn番号を設定する。具体的には、例えば、設定部1303は、同じSpawnプロセスと判断されたプロセスが属するコミュニケータそれぞれに、同一の確定Spawn番号を割り振る。
【0120】
確定Spawn番号は、各実行におけるコミュニケータを識別する識別情報である。どのコミュニケータにどの確定Spawn番号を割り振るかは、例えば、グラフにおけるルートノード(確定Spawn番号:0)から深さ優先探索や幅優先探索などでノードを辿っていくことにより決定される。
【0121】
そして、設定部1303は、各実行(各回)の性能情報(プロセス情報)における暫定Spawn番号を、確定Spawn番号に書き換える。書換後の暫定Spawn番号(確定Spawn番号)は、既存のプロファイラ(性能解析ツール)が認識するSpawn番号として扱われる。
【0122】
分析部1304は、MPIプログラムの性能分析を行う。具体的には、例えば、分析部1304は、複数回の各実行において得られた同一の確定Spawn番号が割り振られたコミュニケータの性能情報に基づいて、コミュニケータに対応するプログラムについての性能分析を行う。
【0123】
より詳細に説明すると、例えば、分析部1304は、0回~(n-1)回の各回の性能情報から、同一の確定Spawn番号(書換後の暫定Spawn番号)が割り振られたコミュニケータの性能情報を特定する。これにより、分析部1304は、0回~(n-1)回の各回のコミュニケータごとの性能情報を得ることができる。
【0124】
そして、分析部1304は、既存のプロファイラ(性能解析ツール)により、特定した0回~(n-1)回の各回のコミュニケータごとの性能情報に基づいて、各コミュニケータに対応するプログラムについての性能分析を行う。
【0125】
これにより、分析部1304は、複数回の計測(性能情報)に基づくコミュニケータ(MPIプログラム)ごとの性能分析結果が得ることができる。性能分析処理では、例えば、プログラム(コミュニケータ)単位で、プロセスやレッドの実行時間、各種演算回数、CPU使用率、キャッシュ率、メモリ使用率などに基づく分析が行われる。
【0126】
また、分析部1304は、各コミュニケータに対応するプログラムの性能分析結果から、MPIプロブラム全体の性能分析を行ってもよい。これにより、分析部1304は、MPIプログラム全体の性能分析結果が得ることができる。
【0127】
出力部1305は、MPIプログラムの性能分析結果を出力する。性能分析結果は、例えば、コミュニケータ(MPIプログラム)ごとの性能分析結果やMPIプログラム全体の性能分析結果を含む。出力部1305の出力形式としては、例えば、メモリ402、ディスク404などの記憶装置への記憶、通信I/F405による他のコンピュータ(例えば、
図3に示したユーザ端末302、共有データベース320)への送信、不図示のディスプレイへの表示、不図示のプリンタへの印刷出力などがある。
【0128】
また、出力部1305は、暫定Spawn番号が確定Spawn番号に書き換えられた各実行(各回)の性能情報を出力してもよい。この場合、例えば、他のコンピュータにおいて、既存のプロファイラ(性能解析ツール)により、ログインノード301から出力された各実行の性能情報に基づくMPIプログラムの性能分析を行ってもよい。
【0129】
(動的プロセス生成が複数回行われるMPIプログラム)
つぎに、動的プロセス生成が複数回行われるMPIプログラムについて説明する。
【0130】
図14は、動的プロセス生成回数が3回のMPIプログラムの一例を示す説明図である。
図14において、コミュニケータ1401内のプロセス0~4と、コミュニケータ1402内のプロセス0~2と、コミュニケータ1403内のプロセス0~2と、コミュニケータ1404内のプロセス0,1と、コミュニケータ1405内のプロセス0,1と、が示されている。
【0131】
コミュニケータ1401内のプロセス0~4は、mpiexecを実行することにより起動されたプロセス(ユーザが固定で起動したプロセス)である。コミュニケータ1402内のプロセス0~2は、コミュニケータ1401内のプロセス1により動的生成されたプロセスである。
【0132】
コミュニケータ1403内のプロセス0~2は、コミュニケータ1401内のプロセス4により動的生成されたプロセスである。コミュニケータ1404内のプロセス0,1は、コミュニケータ1402内のプロセス1により動的生成されたプロセスである。コミュニケータ1405内のプロセス0,1は、コミュニケータ1403内のプロセス1により動的生成されたプロセスである。
【0133】
図15は、動的プロセス生成回数が4回のMPIプログラムの一例を示す説明図である。
図15において、コミュニケータ1501内のプロセス0~4と、コミュニケータ1502内のプロセス0~2と、コミュニケータ1503内のプロセス0~2と、コミュニケータ1504内のプロセス0,1と、コミュニケータ1505内のプロセス0,1と、コミュニケータ1506内のプロセス0,1と、が示されている。
【0134】
コミュニケータ1501内のプロセス0~4は、mpiexecを実行することにより起動されたプロセス(ユーザが固定で起動したプロセス)である。コミュニケータ1502内のプロセス0~2は、コミュニケータ1501内のプロセス1により動的生成されたプロセスである。
【0135】
コミュニケータ1503内のプロセス0~2は、コミュニケータ1501内のプロセス4により動的生成されたプロセスである。コミュニケータ1504内のプロセス0,1は、コミュニケータ1502内のプロセス1により動的生成されたプロセスである。コミュニケータ1505内のプロセス0,1は、コミュニケータ1503内のプロセス1により動的生成されたプロセスである。コミュニケータ1506内のプロセス0,1は、コミュニケータ1503内のプロセス1により動的生成されたプロセスである。
【0136】
ここで、1回目にMPIプログラムを実行した場合に、
図14に示したような動的プロセス生成が行われ、2回目にMPIプログラムを実行した場合に、
図15に示したような動的プロセス生成が行われたとする。この場合、1回目の実行と2回目の実行とで動的プロセス生成回数が異なるため、グラフのマッチングに失敗して、MPIプログラムの性能評価は中止される。
【0137】
(ログインノード301のSpawn制御処理手順)
つぎに、ログインノード301のSpawn制御処理手順について説明する。
【0138】
図16は、ログインノード301のSpawn制御処理手順の一例を示すフローチャートである。
図16のフローチャートにおいて、まず、ログインノード301は、MPIプログラムが複数回実行された結果、複数回の各実行の性能情報を取得する(ステップS1601)。
【0139】
つぎに、ログインノード301は、取得した各実行のプロセス情報に基づいて、各実行におけるプロセスの起動を表すグラフを生成する(ステップS1602)。そして、ログインノード301は、生成したグラフが全て同型であるか否かを判定する(ステップS1603)。
【0140】
ここで、グラフが同型ではない場合(ステップS1603:No)、ログインノード301は、ステップS1610に移行する。一方、グラフが全て同型の場合(ステップS1603:Yes)、ログインノード301は、ノードが表すコミュニケータ内の動的生成されたプロセスの起動順(親が自分を何回目に起動したか)に基づいて、生成したグラフ間で比較対象となるノードの組合せを特定する(ステップS1604)。
【0141】
そして、ログインノード301は、特定したノードの組合せの全てにおいて、ノードの組合せの各ノードが表すコミュニケータ内のプロセスの情報が一致するか否かを判断する(ステップS1605)。プロセスの情報は、例えば、プロセス数、起動プログラム名、自分のSpawnプロセスを起動した回数などである。また、各プロセスが複数スレッドから構成される場合、プロセスの情報は、プロセス内のスレッド数をさらに含む。
【0142】
ここで、ノードの組合せの全てにおいてプロセスの情報が一致する場合(ステップS1605:Yes)、ログインノード301は、ノードの組合せごとに、当該組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じSpawnプロセスとして特定する(ステップS1606)。
【0143】
そして、ログインノード301は、同じSpawnプロセスとして特定したプロセスが属するコミュニケータそれぞれに、同一の確定Spawn番号を割り振る(ステップS1607)。つぎに、ログインノード301は、各実行において得られた、同一の確定Spawn番号が割り振られたコミュニケータの性能情報に基づいて、Spawnプロセス(コミュニケータに対応するMPIプログラム)の性能分析を行う(ステップS1608)。
【0144】
そして、ログインノード301は、Spawnプロセスの性能分析結果を出力して(ステップS1609)、本フローチャートによる一連の処理を終了する。また、ステップS1605において、ノードの組合せの少なくとも一部の組合せにおいて不一致の場合(ステップS1605:No)、ログインノード301は、MPIプログラムの性能評価を中止して(ステップS1610)、本フローチャートによる一連の処理を終了する。
【0145】
これにより、ログインノード301は、同じSpawnプロセス(同じコミュニケータに属するプロセス)に対する性能分析を実施することができる。
【0146】
(実施例)
つぎに、ログインノード301の実施例について説明する。
【0147】
(コミュニケータごとのプロセス情報の具体例)
図17~
図21は、コミュニケータごとのプロセス情報の具体例を示す説明図である。
図17~
図21において、プロセス情報1700,1800,1900,2000,2100は、MPIプログラムがn回実行された結果、0回目の実行で得られたコミュニケータごとのプロセス情報である。
【0148】
図17に示すプロセス情報1700は、暫定Spawn番号が「0」のコミュニケータ内の各プロセス0~4が有する情報を表す。
図18に示すプロセス情報1800は、暫定Spawn番号が「1」のコミュニケータ内の各プロセス0,1が有する情報を表す。
図19に示すプロセス情報1900は、暫定Spawn番号が「2」のコミュニケータ内の各プロセス0,1が有する情報を表す。
図20に示すプロセス情報2000は、暫定Spawn番号が「4」のコミュニケータ内の各プロセス0,1が有する情報を表す。
図21に示すプロセス情報2100は、暫定Spawn番号が「3」のコミュニケータ内の各プロセス0,1が有する情報を表す。
【0149】
例えば、プロセス情報1800によれば、暫定Spawn番号が「1」のコミュニケータ内のプロセス0,1は、暫定Spawn番号が「0」のコミュニケータ内のプロセス1が0回目に起動したプロセスであることがわかる。
【0150】
また、プロセス情報1900によれば、暫定Spawn番号が「2」のコミュニケータ内のプロセス0,1は、暫定Spawn番号が「0」のコミュニケータ内のプロセス3が0回目に起動したプロセスであることがわかる。
【0151】
また、プロセス情報2000によれば、暫定Spawn番号が「4」のコミュニケータ内のプロセス0,1は、暫定Spawn番号が「0」のコミュニケータ内のプロセス3が1回目に起動したプロセスであることがわかる。
【0152】
また、プロセス情報2100によれば、暫定Spawn番号が「3」のコミュニケータ内のプロセス0~2は、暫定Spawn番号が「1」のコミュニケータ内のプロセス0が0回目に起動したプロセスであることがわかる。
【0153】
(グラフの具体例)
つぎに、
図22を用いて、0回目の実行で得られたプロセス情報1700,1800,1900,2000,2100に基づいて生成されるグラフについて説明する。
【0154】
図22は、グラフの具体例を示す説明図である。
図22において、グラフ2200は、ノードN0~N4と、エッジE0~E3とを含む。ノードN0は、Spawn番号「0」のコミュニケータを表す。ノードN1は、Spawn番号「1」のコミュニケータを表す。ノードN2は、Spawn番号「2」のコミュニケータを表す。ノードN3は、Spawn番号「3」のコミュニケータを表す。ノードN4は、Spawn番号「4」のコミュニケータを表す。
【0155】
エッジE0は、ノードN1内の動的生成されたプロセス0,1と、ノードN0内の起動元プロセス1との呼び出し関係を示す。エッジE1は、ノードN2内の動的生成されたプロセス0,1と、ノードN0内の起動元プロセス3との呼び出し関係を示す。エッジE2は、ノードN4内の動的生成されたプロセス0,1と、ノードN0内の起動元プロセス3との呼び出し関係を示す。エッジE3は、ノードN3内の動的生成されたプロセス0~2と、ノードN1内の起動元プロセス0との呼び出し関係を示す。
【0156】
(グラフの比較例)
つぎに、
図23~
図35を用いて、グラフの第1の比較例について説明する。ここでは、0回目のプロセス情報に基づくグラフG0と、1回目のプロセス情報に基づくグラフG1とを例に挙げて説明する。
【0157】
図23~
図35は、グラフの第1の比較例を示す説明図である。
図23において、0回目のプロセス情報に基づき生成されたグラフG0と、1回目のプロセス情報に基づき生成されたグラフG1とが示されている。グラフG0は、ノードN00~N06を含む。グラフG1は、ノードN10~N16を含む。
【0158】
グラフG0内のノードN00は、暫定Spawn番号が「0」のコミュニケータを表す。グラフG1内のノードN10は、暫定Spawn番号が「0」のコミュニケータを表す。
図23~
図35中、○は、プロセスを表す。○内の数字は、プロセス番号を表す。なお、ノード間をつなぐエッジの符号は省略する。
【0159】
以下、グラフG0を基準にして、グラフG0,G1内の比較対象となるノード間でプロセスの情報の一致の判定を行う場合について説明する。
【0160】
図24において、まず、ログインノード301は、自分の暫定Spawn番号が「0」のコミュニケータを表すノードの組合せを、比較対象となるノードの組合せとして特定する。ここでは、グラフG0内のノードN00とグラフG1内のノードN10の組合せが、比較対象となるノードの組合せとして特定される。
【0161】
つぎに、ログインノード301は、特定したノードN00,N10同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致するか否かを判断する。各ノードN00,N10が表すコミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名は、各ノードN00,N10が表すコミュニケータのプロセス情報から特定される。
【0162】
例えば、ノードN0が表すコミュニケータ内のプロセスのプロセス数は、例えば、ノードN00が表すコミュニケータのプロセス情報の「自分のプロセス番号」から特定される。ノードN0が表すコミュニケータ内のプロセスのスレッド数は、例えば、ノードN00が表すコミュニケータのプロセス情報の「自分のスレッド番号」から特定される。ただし、各プロセスが1スレッドから構成される場合は、スレッド数の一致判定は省略してもよい。ここでは、各プロセスが1スレッドから構成される場合を想定する。ノードN0が表すコミュニケータ内のプロセスの起動プログラム名は、例えば、ノードN00が表すコミュニケータのプロセス情報の「自分の起動プログラム名」から特定される。
【0163】
ここで、プロセス数、スレッド数および起動プログラム名が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。ここでは、ノードN00,N10同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致する場合を想定する。
【0164】
図25において、つぎに、ログインノード301は、ノードN00内のプロセス0とN10内のプロセス0について、「自分のSpawnプロセスを起動した回数」が一致するか否かを判断する。各ノードN00,N10内の各プロセスの「自分のSpawnプロセスを起動した回数」は、各ノードN00,N10が表すコミュニケータのプロセス情報から特定される。
【0165】
ここで、「自分のSpawnプロセスを起動した回数」が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。ここでは、「自分のSpawnプロセスを起動した回数」はともに「0」のため、ログインノード301は、次のプロセスの処理に移行する。
【0166】
図26において、つぎに、ログインノード301は、ノードN00内のプロセス1とN10内のプロセス1について、「自分のSpawnプロセスを起動した回数」が一致するか否かを判断する。ここで、「自分のSpawnプロセスを起動した回数」が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。
【0167】
ここでは、「自分のSpawnプロセスを起動した回数」はともに「2」である。この場合、ログインノード301は、ノードN00内のプロセス1が0回目に呼び出したSpawnプロセスの特定を行う。また、ログインノード301は、ノードN10内のプロセス1が0回目に呼び出したSpawnプロセスの特定を行う。
【0168】
図27において、ログインノード301は、ノードN00内のプロセス1が0回目に呼び出したSpawnプロセスとして、ノードN01内のプロセス0,1を特定する。また、ログインノード301は、ノードN10内のプロセス1が0回目に呼び出したSpawnプロセスとして、ノードN11内のプロセス0,1を特定する。
【0169】
ここで、ノードN00,N10は、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致する。また、ノードN00内のプロセス1と、ノードN10内のプロセス1は、プロセス番号が一致する。このため、ノードN01内のプロセス0,1と、ノードN11内のプロセス0,1は、同じ起動元プロセスから同じ起動順で起動されたプロセスに相当する。そこで、ログインノード301は、ノードN01とノードN11を、比較対象となるノードの組合せとして特定する。
【0170】
図28において、ログインノード301は、特定したノードN01,N11同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致するか否かを判断する。各ノードN01,N11が表すコミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名は、各ノードN01,N11が表すコミュニケータのプロセス情報から特定される。
【0171】
ここで、プロセス数、スレッド数および起動プログラム名が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。ここでは、ノードN01,N11同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致する場合を想定する。
【0172】
図29において、ログインノード301は、ノードN01内のプロセス0とN11内のプロセス0について、「自分のSpawnプロセスを起動した回数」が一致するか否かを判断する。ここで、「自分のSpawnプロセスを起動した回数」が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。
【0173】
ここでは、「自分のSpawnプロセスを起動した回数」はともに「2」である。この場合、ログインノード301は、ノードN10内のプロセス0が0回目に呼び出したSpawnプロセスの特定を行う。また、ログインノード301は、ノードN11内のプロセス0が0回目に呼び出したSpawnプロセスの特定を行う。
【0174】
図30において、ログインノード301は、ノードN01内のプロセス0が0回目に呼び出したSpawnプロセスとして、ノードN03内のプロセス0,1を特定する。また、ログインノード301は、ノードN11内のプロセス0が0回目に呼び出したSpawnプロセスとして、ノードN15内のプロセス0,1を特定する。
【0175】
ここで、ノードN01,N11は、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致する。また、ノードN01内のプロセス0と、ノードN11内のプロセス0は、プロセス番号が一致する。このため、ノードN03内のプロセス0,1と、ノードN15内のプロセス0,1は、同じ起動元プロセスから同じ起動順で起動されたプロセスに相当する。そこで、ログインノード301は、ノードN03とノードN15を、比較対象となるノードの組合せとして特定する。
【0176】
図31において、ログインノード301は、特定したノードN03,N15同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致するか否かを判断する。各ノードN03,N15が表すコミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名は、各ノードN03,N15が表すコミュニケータのプロセス情報から特定される。
【0177】
ここで、プロセス数、スレッド数および起動プログラム名が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。ここでは、ノードN03,N15同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致する場合を想定する。
【0178】
図32において、ログインノード301は、ノードN03内のプロセス0とN15内のプロセス0について、「自分のSpawnプロセスを起動した回数」が一致するか否かを判断する。ここで、「自分のSpawnプロセスを起動した回数」が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。ここでは、「自分のSpawnプロセスを起動した回数」はともに「0」のため、ログインノード301は、次のプロセスの処理に移行する。
【0179】
図33において、つぎに、ログインノード301は、ノードN03内のプロセス1とN15内のプロセス1について、「自分のSpawnプロセスを起動した回数」が一致するか否かを判断する。ここで、「自分のSpawnプロセスを起動した回数」が一致しない場合、ログインノード301は、MPIプログラムの性能評価を中止する。ここでは、「自分のSpawnプロセスを起動した回数」はともに「0」のため、ログインノード301は、次のプロセスの処理に移行する。
【0180】
図34において、ログインノード301は、ノードN01内のプロセス0が1回目に呼び出したSpawnプロセスとして、ノードN04内のプロセス0,1を特定する。また、ログインノード301は、ノードN11内のプロセス0が1回目に呼び出したSpawnプロセスとして、ノードN13内のプロセス0,1を特定する。以降、ログインノード301は、同様の処理を再帰的に繰り返す。
【0181】
図35において、ログインノード301は、グラフG0,G1同士で全てのプロセス(スレッド)の情報が一致する場合、グラフG0,G1が一致すると判断する。この場合、ログインノード301は、例えば、ノードN00が表すコミュニケータ内のプロセス0~2と、ノードN10が表すコニュニケータ内のプロセス0~2とを、同じSpawnプロセスとして特定する。
【0182】
また、ログインノード301は、ノードN01が表すコミュニケータ内のプロセス0,1と、ノードN11が表すコニュニケータ内のプロセス0,1とを、同じSpawnプロセスとして特定する。また、ログインノード301は、ノードN03が表すコミュニケータ内のプロセス0,1と、ノードN15が表すコニュニケータ内のプロセス0,1とを、同じSpawnプロセスとして特定する。また、ログインノード301は、ノードN04が表すコミュニケータ内のプロセス0,1と、ノードN13が表すコニュニケータ内のプロセス0,1とを、同じSpawnプロセスとして特定する。
【0183】
つぎに、
図36および
図37を用いて、グラフの第2の比較例について説明する。ここでは、0回目のプロセス情報に基づくグラフG0と、2回目のプロセス情報に基づくグラフG2とを例に挙げて説明する。
【0184】
図36および
図37は、グラフの第2の比較例を示す説明図である。
図36において、0回目のプロセス情報に基づき生成されたグラフG0と、2回目のプロセス情報に基づき生成されたグラフG2とが示されている。グラフG0は、ノードN00~N06を含む。グラフG2は、ノードN20~N26を含む。
【0185】
ここでは、ノードN00,N20同士で、コミュニケータ内のプロセスの情報が一致すると判断された場合を想定する。また、ノードN01,N21同士で、コミュニケータ内のプロセスの情報が一致すると判断された場合を想定する。また、ノードN03,N25同士で、コミュニケータ内のプロセスの情報が一致すると判断された場合を想定する。また、ノードN04,N23同士で、コミュニケータ内のプロセスの情報が一致すると判断された場合を想定する。また、ノードN02,N22同士で、コミュニケータ内のプロセスの情報が一致すると判断された場合を想定する。
【0186】
この場合、ログインノード301は、ノードN02内のプロセス1が0回目に呼び出したSpawnプロセスとして、ノードN05内のプロセス0,1を特定する。また、ログインノード301は、ノードN22内のプロセス1が0回目に呼び出したSpawnプロセスとして、ノードN26内のプロセス0を特定する。
【0187】
ここで、ノードN02,N22は、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致する。また、ノードN02内のプロセス1と、ノードN22内のプロセス1は、プロセス番号が一致する。このため、ノードN05内のプロセス0,1と、ノードN26内のプロセス0は、同じ起動元プロセスから同じ起動順で起動されたプロセスに相当する。そこで、ログインノード301は、ノードN05とノードN26を、比較対象となるノードの組合せとして特定する。
【0188】
図37において、ログインノード301は、特定したノードN05,N26同士で、コミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名が一致するか否かを判断する。各ノードN05,N26が表すコミュニケータ内のプロセスのプロセス数、スレッド数および起動プログラム名は、各ノードN05,N26が表すコミュニケータのプロセス情報から特定される。
【0189】
ここでは、ノードN05,N26同士で、コミュニケータ内のプロセス数が一致しない。この場合、ログインノード301は、MPIプログラムの性能評価を中止する。
【0190】
つぎに、
図38および
図39を用いて、部分的に信用できるプロセスの特定例について説明する。
【0191】
図38および
図39は、部分的に信用できるプロセスの特定例を示す説明図である。
図38において、0回目のプロセス情報に基づき生成されたグラフG0と、2回目のプロセス情報に基づき生成されたグラフG2とが示されている。グラフG0は、ノードN00~N06を含む。グラフG2は、ノードN20~N26を含む。
【0192】
図37で説明したように、ノードN05,N26同士で、コミュニケータ内のプロセス数が一致しない。この場合、ログインノード301は、各ノードN05,N26の親ノードおよび当該親ノードから呼び出されるノードを除くノードの組合せを検出する。
【0193】
具体的には、例えば、まず、ログインノード301は、ノードN05,N26の親ノードN02,N22を特定する。つぎに、ログインノード301は、親ノードN02から呼び出されるノードN05,N06を特定する。また、ログインノード301は、親ノードN22から呼び出されるノードN24,N26を特定する。
【0194】
そして、ログインノード301は、特定したノードN02,N22,N05,N06,N24,N26を除くノードの組合せを検出する。ここでは、ノードN00,N20の組合せ、ノードN01,N21の組合せ、ノードN03,N25の組合せ、およびノードN04,N23の組合せが検出される。
【0195】
この場合、ログインノード301は、ノードN01が表すコミュニケータ内のプロセス0,1と、ノードN21が表すコニュニケータ内のプロセス0,1とを、同じSpawnプロセスとして特定する。また、ログインノード301は、ノードN03が表すコミュニケータ内のプロセス0,1と、ノードN25が表すコニュニケータ内のプロセス0,1とを、同じSpawnプロセスとして特定する。また、ログインノード301は、ノードN04が表すコミュニケータ内のプロセス0,1と、ノードN23が表すコニュニケータ内のプロセス0,1とを、同じSpawnプロセスとして特定する。
【0196】
これにより、ログインノード301は、グラフG0,G2同士で情報が完全一致しなくても、グラフG0,G2同士で情報が一致するノードの組合せを検出して、部分的に信用できるプロセスを特定することができる。
【0197】
以上説明したように、実施の形態にかかるログインノード301によれば、MPIプログラムが複数回実行された結果、複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得することができる。そして、ログインノード301によれば、取得したプロセス情報に基づいて、複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセス(同じコミュニケータに属するプロセス)と判断することができる。
【0198】
これにより、ログインノード301は、複数回の異なる実行において動的生成された同じSpawnプロセスを特定することができる。
【0199】
また、ログインノード301によれば、コミュニケータ内の動的生成されたプロセスのプロセス数および起動プログラム名をさらに含むプロセス情報を取得することができる。そして、ログインノード301によれば、複数回の異なる実行において、プロセスのプロセス数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断することができる。
【0200】
これにより、ログインノード301は、複数回の異なる実行において動的生成された同じSpawnプロセスの特定精度を向上させることができる。
【0201】
また、ログインノード301によれば、コミュニケータ内の動的生成されたプロセスが他のプロセスを起動した回数をさらに含むプロセス情報を取得することができる。そして、ログインノード301によれば、複数回の異なる実行において、プロセスのプロセス数、起動プログラム名および他のプロセスを起動した回数が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されるプロセス同士を、同じSpawnプロセスと判断することができる。
【0202】
これにより、ログインノード301は、自分のSpawnプロセス(子プロセス)をさらに起動(動的生成)するようなプロセスであっても、複数回の異なる実行において動的生成された同じSpawnプロセスを特定することができる。
【0203】
また、ログインノード301によれば、取得したプロセス情報に基づいて、複数回の各実行におけるコミュニケータをノードとし、コミュニケータ内の動的生成されたプロセスと当該プロセスの起動元プロセスとの呼び出し関係を有向エッジとしたグラフを生成することができる。また、ログインノード301によれば、ノードが表すコミュニケータ内のプロセスを起動元プロセスにおいて起動した起動順に基づいて、生成したグラフ間で比較対象となるノードの組合せを特定し、特定したノードの組合せについて、プロセス情報に基づいて、ノードの組合せの各ノードが表すコミュニケータ内のプロセスの情報が一致するか否かを判断することができる。そして、ログインノード301によれば、特定したノードの組合せの全てにおいて、プロセスの情報が一致する場合、ノードの組合せごとに、当該組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じSpawnプロセスと判断することができる。
【0204】
これにより、ログインノード301は、各実行におけるプロセスの起動を表すグラフを利用して、複数回の異なる実行において動的生成された同じSpawnプロセスを効率的に特定することができる。
【0205】
また、ログインノード301によれば、特定したノードの組合せの一部の組合せにおいて、プロセスの情報が不一致の場合、一部の組合せのノードの親ノードおよび当該親ノードから呼び出されるノードを除くノードの組合せを検出し、検出したノードの組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じSpawnプロセスと判断することができる。
【0206】
これにより、ログインノード301は、グラフ同士で情報が完全一致しなくても、グラフ同士で情報が一致するノードの組合せを検出して、部分的に信用できるプロセスを特定することができる。
【0207】
また、ログインノード301によれば、生成したグラフの構造に基づいて、複数回の各実行におけるグラフ同士が同型であるか否かを判定し、グラフ同士が同型ではないと判定した場合、MPIプログラムの性能評価を中止することができる。
【0208】
これにより、ログインノード301は、実行されたMPIプログラムが性能評価対象外のプログラムであり、正しくプロファイルできない場合、性能評価を中止することができる。性能評価対象外のプログラムとしては、例えば、動的プロセス生成回数が0以上であり、複数回実行した場合に、同じプロセスや同じスレッドから同じ順番で同じ実行バイナリを用いて動的プロセス生成が行われる保証ができないものがある。また、性能評価対象外のプログラムとしては、動的プロセス生成回数が0以上であり、動的プロセス生成が乱数によって変化(例えば、起動バイナリや起動されるプロセス数が変化)するものがある。
【0209】
また、ログインノード301によれば、コミュニケータ内の動的生成されたプロセスのプロセス数、スレッド数および起動プログラム名をさらに含むプロセス情報を取得することができる。そして、ログインノード301によれば、複数回の異なる実行において、プロセスのプロセス数、スレッド数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じSpawnプロセスと判断することができる。
【0210】
これにより、ログインノード301は、各プロセスが複数のスレッドから構成される場合であっても、複数回の異なる実行において動的生成された同じSpawnプロセスを特定することができる。
【0211】
また、ログインノード301によれば、同じSpawnプロセスと判断したプロセスが属するコミュニケータそれぞれに、同一のSpawn番号を設定し、複数回の各実行において得られた同一のSpawn番号が割り振られたコミュニケータの性能情報に基づいて、当該コミュニケータに対応するプログラムについての性能分析を行うことができる。
【0212】
これにより、ログインノード301は、既存のプロファイラ(性能解析ツール)で利用可能であって、一意なSpawn番号(確定Spawn番号)を振り直すことで、性能分析を行う際のユーザの利便性を向上させることができる。
【0213】
また、ログインノード301によれば、性能分析結果を出力することができる。
【0214】
これにより、ログインノード301は、複数回の計測(性能情報)が求められるMPIプログラムの性能分析を実現することができる。
【0215】
これらのことから、ログインノード301によれば、複数回の異なる実行において動的生成される同じSpawnプロセス(同じコミュニケータに属するプロセス)に対する性能分析を可能にすることができる。例えば、ログインノード301は、地球シミュレーショやゲノム解析などのスーパーコンピュータで実行されるようなアプリケーションの性能分析を精度よく行うことを可能にすることができる。
【0216】
なお、本実施の形態で説明したSpawn制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本Spawn制御プログラムは、ハードディスク、フレキシブルディスク、CD-ROM、DVD、USBメモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本Spawn制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【0217】
また、本実施の形態で説明した情報処理装置101(ログインノード301)は、スタンダードセルやストラクチャードASIC(Application Specific Integrated Circuit)などの特定用途向けICやFPGAなどのPLD(Programmable Logic Device)によっても実現することができる。
【0218】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0219】
(付記1)MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、
取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する、
処理をコンピュータに実行させることを特徴とするSpawn制御プログラム。
【0220】
(付記2)前記プロセス情報は、前記コミュニケータ内の動的生成されたプロセスのプロセス数および起動プログラム名を表す情報をさらに含み、
前記判断する処理は、
前記複数回の異なる実行において、プロセスのプロセス数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする付記1に記載のSpawn制御プログラム。
【0221】
(付記3)前記プロセス情報は、前記コミュニケータ内の動的生成されたプロセスが他のプロセスを起動した回数を表す情報をさらに含み、
前記判断する処理は、
前記複数回の異なる実行において、プロセスのプロセス数、起動プログラム名および他のプロセスを起動した回数が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されるプロセス同士を、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする付記2に記載のSpawn制御プログラム。
【0222】
(付記4)取得した前記プロセス情報に基づいて、前記複数回の各実行におけるコミュニケータをノードとし、前記コミュニケータ内の動的生成されたプロセスと当該プロセスの起動元プロセスとの呼び出し関係を有向エッジとしたグラフを生成し、
前記ノードが表すコミュニケータ内のプロセスを起動元プロセスにおいて起動した起動順に基づいて、生成した前記グラフ間で比較対象となるノードの組合せを特定する、
処理を前記コンピュータに実行させ、
前記判断する処理は、
特定した前記ノードの組合せについて、前記プロセス情報に基づいて、前記ノードの組合せの各ノードが表すコミュニケータ内のプロセスの情報が一致するか否かを判断し、
特定した前記ノードの組合せの全てにおいて、前記プロセスの情報が一致する場合、前記ノードの組合せごとに、当該組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする付記2または3に記載のSpawn制御プログラム。
【0223】
(付記5)前記判断する処理は、
特定した前記ノードの組合せの一部の組合せにおいて、前記プロセスの情報が不一致の場合、前記一部の組合せのノードの親ノードおよび当該親ノードから呼び出されるノードを除くノードの組合せを検出し、
検出した前記ノードの組合せの各ノードが表すコミュニケータ内のプロセスと、当該組合せの他のノードが表すコニュニケータ内のプロセスとを、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする付記4に記載のSpawn制御プログラム。
【0224】
(付記6)生成した前記グラフの構造に基づいて、前記複数回の各実行におけるグラフ同士が同型であるか否かを判定する、処理を前記コンピュータに実行させ、
前記グラフ同士が同型ではないと判定した場合、前記MPIプログラムの性能評価を中止する、ことを特徴とする付記4または5に記載のSpawn制御プログラム。
【0225】
(付記7)前記プロセス情報は、前記コミュニケータ内の動的生成されたプロセスのプロセス数、スレッド数および起動プログラム名を表す情報をさらに含み、
前記判断する処理は、
前記複数回の異なる実行において、プロセスのプロセス数、スレッド数および起動プログラム名が同一のコミュニケータに属し、かつ、同じ起動元プロセスから同じ起動順で起動されたプロセス同士を、同じコミュニケータに属するプロセスと判断する、
ことを特徴とする付記1~6のいずれか一つに記載のSpawn制御プログラム。
【0226】
(付記8)前記同じコミュニケータに属すると判断したプロセスが属するコミュニケータそれぞれに、同一のSpawn番号を設定し、
前記複数回の各実行において得られた前記同一のSpawn番号が割り振られたコミュニケータの性能情報に基づいて、前記コミュニケータに対応するプログラムについての性能分析を行う、
処理を前記コンピュータに実行させることを特徴とする付記1~7のいずれか一つに記載のSpawn制御プログラム。
【0227】
(付記9)前記性能分析の結果を出力する、
処理を前記コンピュータに実行させることを特徴とする付記8に記載のSpawn制御プログラム。
【0228】
(付記10)MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、
取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を同じコミュニケータに属するプロセスと判断する、
処理をコンピュータが実行することを特徴とするSpawn制御方法。
【0229】
(付記11)MPIプログラムが複数回実行された結果、前記複数回の各実行におけるコミュニケータごとに、当該コミュニケータ内の動的生成されたプロセスの起動元プロセスにおいて当該プロセスを起動した起動順を含むプロセス情報を取得し、
取得した前記プロセス情報に基づいて、前記複数回の異なる実行において同じ起動元プロセスから同じ起動順で起動されたプロセス同士を同じコミュニケータに属するプロセスと判断する、
制御部を有することを特徴とする情報処理装置。
【符号の説明】
【0230】
101 情報処理装置
110,2200 グラフ
121,122,123,600,800,900,1100,1200,1700,1800,1900,2000,2100 プロセス情報
300 情報処理システム
301 ログインノード
302 ユーザ端末
310 ネットワーク
320 共有データベース
400 バス
401 CPU
402 メモリ
403 ディスクドライブ
404 ディスク
405 通信I/F
406 可搬型記録媒体I/F
407 可搬型記録媒体
1300 制御部
1301 取得部
1302 判断部
1303 設定部
1304 分析部
1305 出力部