(57)【要約】【課題】並列計算機システムのノードの稼働率を向上させる。【解決手段】ノード１ａ〜１ｘは、Ｎ個の座標軸によって特定されるＮ次元の座標が付与されており、Ｎ次元の座標を用いて接続関係が管理される。管理装置２は、処理に用いるノード群について座標軸毎のノード数を指定した処理要求３を取得すると、ノード１ａ〜１ｘの中から使用可能な空きノード群を検出し、空きノード群の各座標軸方向に並ぶノードの数に応じて、処理要求３で指定されたＮ個の座標軸のノード数のうち２以上の座標軸のノード数を変換する。管理装置２は、変換後の座標軸毎のノード数に応じて、空きノード群に含まれるノードを処理要求３に対して割当てる。【選択図】図１
2016004310.tif 000002
【特許請求の範囲】
【請求項１】
Ｎ個（Ｎは２以上の整数）の座標軸によって特定されるＮ次元の座標が付与されており、前記Ｎ次元の座標を用いて接続関係が管理される複数のノードと、
処理に用いるノード群について座標軸毎のノード数を指定した処理要求を取得すると、前記複数のノードの中から使用可能な空きノード群を検出し、前記空きノード群の各座標軸方向に並ぶノードの数に応じて、前記処理要求で指定された前記Ｎ個の座標軸のノード数のうち２以上の座標軸のノード数を変換し、変換後の座標軸毎のノード数に応じて、前記空きノード群に含まれるノードを前記処理要求に対して割当てる管理装置と、
を有する並列計算機システム。
【請求項２】
前記管理装置は、前記処理要求で要求されたノードの総数が変わらないように、前記Ｎ個の座標軸のうち第１の座標軸について指定されたノード数を減らし、前記Ｎ個の座標軸のうち第２の座標軸について指定されたノード数を増やす、
請求項１記載の並列計算機システム。
【請求項３】
前記管理装置は、前記第１の座標軸について指定されたノード数を因数分解し、因数分解によって得られた一の因数を前記第１の座標軸から前記第２の座標軸に移動する、
請求項２記載の並列計算機システム。
【請求項４】
前記処理要求は、並列に実行される複数のプロセスの間の通信状況を示す情報を含み、
前記管理装置は、前記２以上の座標軸のノード数を変換する方法として複数の変換方法の候補があるとき、前記通信状況を示す情報に基づいて、前記複数の変換方法の候補それぞれについて、前記複数のプロセスにノードを割当てた場合にノード間で発生する通信のコストを示す指標値を算出し、前記指標値に基づいて一の変換方法を選択する、
請求項１乃至３の何れか一項に記載の並列計算機システム。
【請求項５】
Ｎ個（Ｎは２以上の整数）の座標軸によって特定されるＮ次元の座標が付与されており、前記Ｎ次元の座標を用いて接続関係が管理される複数のノードを含む並列計算機システムが実行する制御方法であって、
処理に用いるノード群について座標軸毎のノード数を指定した処理要求を取得し、
前記複数のノードの中から使用可能な空きノード群を検出し、
前記空きノード群の各座標軸方向に並ぶノードの数に応じて、前記処理要求で指定された前記Ｎ個の座標軸のノード数のうち２以上の座標軸のノード数を変換し、
変換後の座標軸毎のノード数に応じて、前記空きノード群に含まれるノードを前記処理要求に対して割当てる、
制御方法。
【請求項６】
Ｎ個（Ｎは２以上の整数）の座標軸によって特定されるＮ次元の座標が付与されており、前記Ｎ次元の座標を用いて接続関係が管理される複数のノードを含む並列計算機システムを制御するジョブ管理プログラムであって、コンピュータに、
処理に用いるノード群について座標軸毎のノード数を指定した処理要求を取得し、
前記複数のノードの中から使用可能な空きノード群を検出し、
前記空きノード群の各座標軸方向に並ぶノードの数に応じて、前記処理要求で指定された前記Ｎ個の座標軸のノード数のうち２以上の座標軸のノード数を変換し、
変換後の座標軸毎のノード数に応じて、前記空きノード群に含まれるノードを前記処理要求に対して割当てる、
処理を実行させるジョブ管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は並列計算機システム、制御方法およびジョブ管理プログラムに関する。
【背景技術】
【０００２】
科学技術計算などの大規模な計算を行う場合、プロセッサやメモリなどの計算リソースを備えるノードを複数備え、それら複数のノードがネットワークで接続された並列計算機システムを用いることがある。並列計算機システムでは、各ノードは他のノードとは並列に処理を実行することができ、他のノードとデータの受け渡しを行うこともできる。
【０００３】
複数のノードを接続する相互接続網の形態（ネットワークトポロジ）の１つとして、メッシュやトーラスなどの直接網が挙げられる。直接網では、ノード同士が独立のスイッチを経由せずに直接接続されており、各ノードは、宛先ノードに応じてデータを転送するルーティング機能を備える。メッシュ型やトーラス型の並列計算機システムの場合、論理的には複数のノードが格子状に配置されていると見ることができ、各ノードの位置は直交するＮ個（Ｎは２以上の整数）の座標軸によって決まるＮ次元の座標で特定できる。
【０００４】
並列計算機システムにジョブと呼ばれる一纏まりの処理を実行させる（ジョブを投入する）場合、並列計算機システムが備えるノードの中から、当該ジョブの実行に使用するノードを選択することになる。ノードの割当てに関して、ジョブを管理するＨＰＣ（High Performance Computing）サーバが提案されている。このＨＰＣサーバは、３次元トーラスの中から、何れのジョブにも割当てられていないノード群である非割当て部分集合を検出する。ＨＰＣサーバは、新たなジョブが投入されると、当該ジョブの実行に適した非割当て部分集合があるか判定し、存在すれば当該ジョブに非割当て部分集合を割当てる。一方、適切な非割当て部分集合がない場合、ＨＰＣサーバは、投入されたジョブをジョブキューに格納して他のジョブが終了するのを待つ。
【０００５】
また、処理要素として複数のタスクを含むジョブが投入されたとき、複数のノードにタスクを分散して割り付ける並列処理装置が提案されている。この並列処理装置は、ジョブの実行中に各ノードから性能情報を取得する。並列処理装置は、取得した性能情報に基づいて、タスクの割り付けパターンのうちジョブを高速に実行できるパターンを予測する。並列処理装置は、予測した割り付けパターンによって現在よりもジョブの実行速度を改善できるとき、ジョブを中断してノードへのタスクの割り付けを変更する。
【０００６】
また、メッシュ型の並列計算機システムに対してジョブの実行を指示するスケジューリング装置が提案されている。このスケジューリング装置は、待機中のジョブのうち優先度の高いジョブに対して、メッシュ状のノード集合の一部分である長方形のサブメッシュを予約する。このとき、スケジューリング装置は、ジョブの割当ての有無を示す２次元配列を用いてジョブ間の干渉を検出し、予約するサブメッシュを決定する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００５−３１０１３９号公報
【特許文献２】特開２０１０−２５７０５６号公報
【特許文献３】特開２０１０−２６７０２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
格子状の相互接続網をもつ並列計算機システムでは、ノード間の通信のコストは、送信元ノードと宛先ノードの位置に依存する。よって、複数のノードを使用するジョブの実行効率は、使用するノードの総数だけでなく、各座標軸方向に並ぶノードの数（ノード群の形状）にも依存する。例えば、２次元メッシュまたは２次元トーラスにおいて、４×３個のノードを使用する場合と２×６個のノードを使用する場合とでは、ジョブの実行効率が異なる可能性がある。好ましいノード群の形状は、ジョブによって異なる。そこで、並列計算機システムにジョブを投入するにあたっては、ユーザの端末装置やスケジューリング装置などのジョブ投入元から、ノード群の形状が明示的に指定されることがある。
【０００９】
しかし、並列計算機システムの中に、ジョブが要求するノード総数に相当する空きノード群が存在していても、その空きノード群の形状が指定された形状と異なると、そのままでは当該ジョブにノードを割当てることができない可能性がある。例えば、並列計算機システムの中に２×６個の空きノード群が存在していても、４×３個の形状が指定されたジョブにノードを割当てられない可能性がある。そのとき、ノードの割当てが不可であると判断してジョブを待機させてしまうと、ノードの稼働率が低下し、並列計算機システムのスループットが低下するおそれがあるという問題がある。
【００１０】
１つの側面では、本発明は、ノードの稼働率を向上させることができる並列計算機システム、制御方法およびジョブ管理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、複数のノードと管理装置とを有する並列計算機システムが提供される。複数のノードは、Ｎ個（Ｎは２以上の整数）の座標軸によって特定されるＮ次元の座標が付与されており、Ｎ次元の座標を用いて接続関係が管理される。管理装置は、処理に用いるノード群について座標軸毎のノード数を指定した処理要求を取得する。管理装置は、複数のノードの中から使用可能な空きノード群を検出する。管理装置は、空きノード群の各座標軸方向に並ぶノードの数に応じて、処理要求で指定されたＮ個の座標軸のノード数のうち２以上の座標軸のノード数を変換する。管理装置は、変換後の座標軸毎のノード数に応じて、空きノード群に含まれるノードを処理要求に対して割当てる。
【００１２】
また、１つの態様では、Ｎ個（Ｎは２以上の整数）の座標軸によって特定されるＮ次元の座標が付与されており、Ｎ次元の座標を用いて接続関係が管理される複数のノードを含む並列計算機システムが実行する制御方法が提供される。
【００１３】
また、１つの態様では、Ｎ個（Ｎは２以上の整数）の座標軸によって特定されるＮ次元の座標が付与されており、Ｎ次元の座標を用いて接続関係が管理される複数のノードを含む並列計算機システムを制御するジョブ管理プログラムが提供される。
【発明の効果】
【００１４】
１つの側面では、並列計算機システムのノードの稼働率が向上する。
【図面の簡単な説明】
【００１５】
【図１】第１の実施の形態の並列計算機システムを示す図である。
【図２】第２の実施の形態の並列計算機システムを示す図である。
【図３】管理装置のハードウェア例を示す図である。
【図４】ノードのハードウェア例を示す図である。
【図５】ノード割当ての問題点を示す図である。
【図６】並列計算機システムの機能例を示す図である。
【図７】要求テーブルの例を示す図である。
【図８】通信テーブルの例を示す図である。
【図９】ジョブに２次元のノードを割当てる処理の例を示すフローチャートである。
【図１０】ジョブに２次元のノードを割当てる処理の具体例を示す図である。
【図１１】ジョブに２次元のノードを割当てる処理の具体例（続き）を示す図である。
【図１２】ジョブに３次元以上のノードを割当てる処理の例を示すフローチャートである。
【図１３】ジョブ形状の変形パターンを特定する処理の例を示すフローチャートである。
【発明を実施するための形態】
【００１６】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の並列計算機システムを示す図である。
【００１７】
第１の実施の形態の並列計算機システムは、ノード１ａ〜１ｘを含む複数のノードと管理装置２とを有する。ノード１ａ〜１ｘは、並列にプロセスを実行することができる処理主体である。ノード１ａ〜１ｘはそれぞれ、ＣＰＵ（Central Processing Unit）などのプロセッサとＲＡＭ（Random Access Memory）などのメモリとを有していてもよい。その場合、プロセッサは、メモリに記憶されたプログラムを実行する。管理装置２は、一纏まりの処理であるジョブの投入を管理する。管理装置２は、プロセッサとメモリとを有するコンピュータであってもよい。その場合、以下に説明する管理装置２の処理が、プログラムとして実装されてもよい。また、管理装置２は、ユーザが操作するクライアント装置でもよいし、クライアント装置からアクセスされるサーバ装置でもよい。
【００１８】
ノード１ａ〜１ｘを含む複数のノードは、互いに通信できるように、Ｎ次元（Ｎは２以上の整数）の格子状の相互接続網によって接続されている。この相互接続網の例として、Ｎ次元メッシュやＮ次元トーラスなどが挙げられる。各ノードには、Ｎ個の座標軸（例えば、互いに直交するＮ個の座標軸）によって特定される、他のノードとは異なるＮ次元の座標が付与されている。このＮ次元の座標を用いて、ノード間の接続関係が管理される。例えば、各ノードは、何れか１つの座標軸の値が１つだけ異なる他のノードと直接接続される。ルーティング時のデータの転送先は、Ｎ次元の座標を用いて判定できる。
【００１９】
一例として図１には、座標軸Ｘ，Ｙによって特定される２次元の相互接続網の例が記載されている。ノード１ａ〜１ｆには、座標（０，０），（０，１），（０，２），（０，３），（０，４），（０，５）が付与される。ノード１ｇ〜１ｌには、座標（１，０），（１，１），（１，２），（１，３），（１，４），（１，５）が付与される。ノード１ｍ〜１ｒには、座標（２，０），（２，１），（２，２），（２，３），（２，４），（２，５）が付与される。ノード１ｓ〜１ｘには、座標（３，０），（３，１），（３，２），（３，３），（３，４），（３，５）が付与される。
【００２０】
ここでは、ノード１ａ〜１ｌは既存のジョブに割当て済の使用中ノードであり、そのジョブが終了するまで新たなジョブに割当てられないものとする。一方、ノード１ｍ〜１ｘは空きノードであり、新たなジョブに割当て可能であるものとする。説明を簡単にするため、１つのノードは１つのジョブに割当てられるものとする。また、１つのジョブは、連続した（分断されていない）２以上のノードを含むノード群を使用するものとする。使用する各ノードには、ジョブによって指定されたプロセスが配置される。これにより、１つのジョブに属する２以上のプロセスが並列に実行される。
【００２１】
管理装置２は、新たなジョブの投入の要求を示す処理要求３を取得する。処理要求３は、ユーザの操作によって管理装置２に対して入力されてもよいし、ネットワークを介して他の装置から受信されてもよい。処理要求３は、処理に用いるノード群の形状を示す形状情報３ａを含む。形状情報３ａは、Ｎ個の座標軸それぞれの方向に並ぶノードの数を指定している。例えば、「４×３」は、座標軸Ｘ方向に４個のノードが並び、座標軸Ｙ方向に３個のノードが並ぶような長方形のノード群を示している。この場合、処理要求３によって要求されたノードの総数は４×３＝１２個になる。
【００２２】
処理要求３を取得すると、管理装置２は、ノード１ａ〜１ｘを含む複数のノードの中から使用可能な空きノード群を検出する。図１の例の場合、管理装置２は、ノード１ｍ〜１ｘの集合である２×６の空きノード群を検出する。管理装置２は、検出した空きノード群の形状が処理要求３の要求するノード群の形状を包含しているか、すなわち、各座標軸について空きノード群のノード数が形状情報３ａの指定するノード数以上であるか判定する。上記の条件を満たす場合、管理装置２は、空きノード群の中から形状情報３ａの指定する形状のノード群を選択してジョブに対して割当ててよい。
【００２３】
一方、上記の条件を満たさない場合、管理装置２は、空きノード群の各座標軸方向に並ぶノードの数に応じて、形状情報３ａを形状情報３ｂに変換する。形状情報３ｂは、Ｎ個の座標軸のうち２以上の座標軸について、形状情報３ａで指定されたノード数を変換したものである。このノード数の変換は、上記の条件が満たされるように、すなわち、各座標軸について形状情報３ｂの指定するノード数が空きノード群のノード数以下になるように行われる。好ましくは、管理装置２は、処理要求３が要求するノードの総数が変わらないように、ある座標軸のノード数を減らして他の座標軸のノードを増やす。
【００２４】
このとき、管理装置２は、ある座標軸のノード数を因数分解し、因数分解によって得られた一の因数を他の座標軸に移すようにしてもよい。図１の例では、「４×３」が「２×６」に変換されている。これは、ノードの総数（１２個）を変えず、形状情報３ａが指定する座標軸Ｘのノード数を減らして、形状情報３ａが指定する座標軸Ｙのノード数を増やしたものである。また、これは、座標軸Ｘのノード数「４」の因数の１つである「２」を、座標軸Ｘから座標軸Ｙに移動したものと言うこともできる。
【００２５】
そして、管理装置２は、形状情報３ｂが指定する変換後の座標軸毎のノード数に応じて、空きノード群に含まれるノードをジョブに対して割当てる。図１の例では、ノード１ｍ〜１ｘの集合である空きノード群の形状が２×６であり、また、形状情報３ｂが指定するノード群の形状は２×６である。よって、管理装置２は、処理要求３が要求するジョブに対して、ノード１ｍ〜１ｘを割当てることができる。
【００２６】
並列計算機システムの中に処理要求３が要求するノード総数に相当する空きノード群が存在していても、その空きノード群の形状が指定された形状と異なると、そのままではジョブの実行を開始できない可能性がある。図１の例では、並列計算機システムの中に１２個の空きノードが存在するものの、「４×３」を包含する空きノード群は存在しない。よって、処理要求３が示すジョブは開始されず待機状態になる可能性がある。
【００２７】
これに対し、第１の実施の形態の並列計算機システムによれば、検出した空きノード群の形状に応じて、処理要求３が指定したノード群の形状を変換してジョブを実行可能にする。これにより、並列計算機システムのノードの稼働率が向上し、スループットが向上する。また、ジョブの待機時間を減らして、レスポンス時間を短縮することができる。
【００２８】
［第２の実施の形態］
図２は、第２の実施の形態の並列計算機システムを示す図である。第２の実施の形態の並列計算機システムは、管理装置１００と並列計算機２００とクライアント３００とを有する。並列計算機２００は、ノード２００ａ〜２００ｉを含む複数のノードを有する。管理装置１００とクライアント３００は、ユーザアクセス用のネットワークを介して接続されている。ユーザアクセス用のネットワークは、インターネットなどの広域ネットワークを含んでもよい。管理装置１００とノード２００ａ〜２００ｉは、管理用のネットワークを介して接続されている。管理用のネットワークは、例えば、ノード２００ａ〜２００ｉが設置されたデータセンタ内のローカルネットワークである。ただし、ユーザアクセス用のネットワークと管理用のネットワークとが分離されていなくてもよい。
【００２９】
管理装置１００は、並列計算機２００へのジョブの投入を制御する。例えば、管理装置１００は、サーバコンピュータである。管理装置１００は、クライアント３００からジョブ情報を受信する。ジョブ情報は、並列に実行されるべき複数のプロセスを含むジョブを実行するよう要求するものであり、ジョブが使用するノードの数に関する情報を含む。管理装置１００は、受信したジョブ情報に基づいて並列計算機２００の中から複数のノードを選択して当該ジョブに割当て、ジョブの実行を開始させる。
【００３０】
ノード２００ａ〜２００ｉを含む複数のノードは、互いに通信できるように、管理用のネットワークとは異なる格子状の相互接続網によって接続されている。この相互接続網の例として、メッシュやトーラスなどが挙げられる。並列計算機２００のノード間の接続関係は、Ｎ次元（Ｎは２以上の整数）の座標によって管理される。各ノードには、他のノードとは異なるＮ次元の座標が付与される。各ノードは、何れか１つの座標軸の値が１つだけ異なる他のノード（最大で２Ｎ個のノード）と直接接続されている。一のノード（送信元ノード）から他の一のノード（宛先ノード）にデータを送信するにあたり、送信元ノードと宛先ノードとが直接接続されていない場合、その間に位置するノードが宛先ノードの座標に応じてデータを中継する。
【００３１】
図２には、ノード２００ａ〜２００ｉが、Ｘ軸・Ｙ軸の２つの座標軸によって定義される２次元メッシュを用いて相互接続されている例が示されている。例えば、ノード２００ｅは、Ｘ軸の負の方向にノード２００ｂと直接接続され、Ｘ軸の正の方向にノード２００ｈと直接接続されている。また、ノード２００ｅは、Ｙ軸の負の方向にノード２００ｆと直接接続され、Ｙ軸の正の方向にノード２００ｄと直接接続されている。
【００３２】
同様に、ノード２００ａはノード２００ｂ，２００ｄと直接接続され、ノード２００ｂはノード２００ａ，２００ｃ，２００ｅと直接接続され、ノード２００ｃはノード２００ｂ，２００ｆと直接接続されている。ノード２００ｄはノード２００ａ，２００ｅ，２００ｇと直接接続され、ノード２００ｆはノード２００ｃ，２００ｅ，２００ｉと直接接続されている。ノード２００ｇはノード２００ｄ，２００ｈと直接接続され、ノード２００ｈはノード２００ｅ，２００ｇ，２００ｉと直接接続され、ノード２００ｉはノード２００ｆ，２００ｈと直接接続されている。
【００３３】
なお、ノード２００ａ〜２００ｉを２次元トーラスで相互接続した場合、ノード２００ａ，２００ｃ，２００ｇ，２００ｉは、各座標軸について更に他の１つのノードと直接接続される。例えば、ノード２００ａは、更にノード２００ｃ，２００ｇと接続されてもよい。また、複数のノードを３次元メッシュまたは３次元トーラスを用いて相互接続した場合、各ノードは最大で６個の他のノードと直接接続される。
【００３４】
クライアント３００は、ユーザによって利用される端末装置である。例えば、クライアント３００は、クライアントコンピュータである。クライアント３００は、ジョブの実行のために並列計算機２００を利用するとき、管理装置１００にジョブ情報を送信する。ジョブ情報には、使用するノードの数に関する情報、複数のノードへのプロセスの配置を示す情報、プロセスの起動に用いるプログラムのファイルの指定（例えば、ファイルのパス）などを含む。
【００３５】
図３は、管理装置のハードウェア例を示す図である。管理装置１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ（Hard Disk Drive）１０３、画像信号処理部１０４、入力信号処理部１０５、読み取り装置１０６および通信インタフェース１０７，１０７ａを有する。各ユニットが管理装置１００のバスに接続されている。
【００３６】
プロセッサ１０１は、管理装置１００の全体を制御する。プロセッサ１０１は、複数のプロセッシング要素を含むマルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）またはＦＰＧＡ（Field Programmable Gate Array）などである。また、プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００３７】
ＲＡＭ１０２は、管理装置１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００３８】
ＨＤＤ１０３は、管理装置１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。管理装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００３９】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、管理装置１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、有機ＥＬ（Electro-Luminescence）ディスプレイなど各種のディスプレイを用いることができる。
【００４０】
入力信号処理部１０５は、管理装置１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２としては、マウスやタッチパネルなどのポインティングデバイスやキーボードなどの各種の入力デバイスを用いることができる。管理装置１００には、複数の種類の入力デバイスが接続されてもよい。
【００４１】
読み取り装置１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。読み取り装置１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４２】
通信インタフェース１０７は、管理用のネットワークを介してノード２００ａ〜２００ｉに接続され、データの送受信を行う。通信インタフェース１０７ａは、クライアント３００に接続され、データの送受信を行う。ただし、通信インタフェース１０７と通信インタフェース１０７ａとが同一であってもよい。
【００４３】
なお、クライアント３００も管理装置１００と同様のハードウェアにより実現できる。
図４は、ノードのハードウェア例を示す図である。ノード２００ａ〜２００ｉは、同様のハードウェアで実現できる。そのため、ここではノード２００ａのハードウェアについて説明する。
【００４４】
ノード２００ａは、プロセッサ２０１、ＲＡＭ２０２、ＨＤＤ２０３、管理ポート２０４および通信ポート２０５，２０５ａ，２０５ｂ，２０５ｃを有する。各ユニットがノード２００ａのバスに接続されている。
【００４５】
プロセッサ２０１は、ノード２００ａの全体を制御する。プロセッサ２０１は、複数のプロセッシング要素を含むマルチプロセッサであってもよい。プロセッサ２０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ２０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００４６】
ＲＡＭ２０２は、ノード２００ａの主記憶装置である。ＲＡＭ２０２は、プロセッサ２０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ２０２は、プロセッサ２０１による処理に用いる各種データを記憶する。
【００４７】
ＨＤＤ２０３は、ノード２００ａの補助記憶装置である。ＨＤＤ２０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ２０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。ノード２００ａは、フラッシュメモリやＳＳＤなどの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４８】
管理ポート２０４は、管理用のネットワークを介して管理装置１００とデータの送受信を行うためのインタフェースである。
通信ポート２０５，２０５ａ，２０５ｂ，２０５ｃは、ノード２００ａと直接接続する他のノードとの間でデータの送受信を行うためのインタフェースである。通信ポート２０５はノード２００ｂと直接接続され、通信ポート２０５ａはノード２００ｃと直接接続され、通信ポート２０５ｂはノード２００ｄと直接接続され、通信ポート２０５ｃはノード２００ｇと直接接続されている。
【００４９】
ノード２００ａは、通信ポート２０５，２０５ａ，２０５ｂ，２０５ｃを用いて、他のノードとの間のデータの送信・受信やデータの転送を行うことができる。ノード２００ａは、データを生成した場合、ノード２００ａの座標と宛先ノードの座標からデータが宛先ノードに近づく方向を判定し、判定した方向の通信ポートからデータを出力する。
【００５０】
また、ノード２００ａは、何れかの通信ポートからデータを受信した場合、受信したデータの宛先ノードの座標を確認する。宛先ノードの座標は、データに付加されていてもよい。宛先ノードがノード２００ａである場合、ノード２００ａは、受信したデータをノード２００ａに取り込む。一方、宛先ノードが他のノードである場合、ノード２００ａは、ノード２００ａの座標と宛先ノードの座標からデータが宛先ノードに近づく方向を判定し、判定した方向の通信ポートからデータを出力する。
【００５１】
ノード２００ａから宛先ノードに近づく方向を判定するにあたり、ノード２００ａは、複数の次元のうち優先的に座標の差を小さくする次元を予め決めておいてもよい。Ｘ次元とＹ次元の両方についてノード２００ａの座標と宛先ノードの座標とが一致していない場合、ノード２００ａは、Ｘ次元の座標の差を小さくする方向にデータを転送することが考えられる。例えば、ノード２００ａは、宛先ノードが２００ｅであるデータを生成または受信したとき、Ｘ次元の方向に隣接するノード２００ｄにデータを転送する。
【００５２】
なお、通信ポート２０５，２０５ａ，２０５ｂ，２０５ｃを利用したデータの転送制御は、プロセッサ２０１がソフトウェアを用いて行ってもよいし、プロセッサ２０１と異なるハードウェアであるスイッチング回路が行ってもよい。
【００５３】
次に、ジョブ情報に応じてジョブにノードを割当てるときの問題点を説明する。
図５は、ノード割当ての問題点を示す図である。図５の上部は、並列計算機２００に含まれるノード群を示している。１つのブロックは、１つのノードを表している。ここで、図５の左上の頂点を原点Ｏとする。また、原点Ｏに対して右方向の座標軸をＸ軸（Ｘ次元ともいう）とする。原点Ｏに対して下方向の座標軸をＹ軸（Ｙ次元ともいう）とする。各ノードは、Ｘ次元とＹ次元の２次元の座標によって特定できるものとする。図５では、並列計算機２００に１２×１２個のノードが含まれている。ここで、“１２×１２”の第１項はＸ軸方向に１２個のノードが連続して並んでいることを表し、第２項はＹ軸方向に１２個のノードが連続して並んでいることを表す。
【００５４】
図５では、（４，０）〜（１１，３）の範囲の８×４個のノード群が、ジョブＡに使用されている。（０，０）〜（３，７）の範囲の４×８個のノード群が、ジョブＢに使用されている。（０，８）〜（３，１１）の範囲の４×４個のノード群が、ジョブＣに使用されている。以下では、“８×４”や“４×８”など各座標軸方向のノード数の組み合わせを、ジョブの「形状」と言うことがある。一方、（４，４）〜（１１，１１）の範囲の８×８個のノードは、何れのジョブにも使用されていない空きノード群である。
【００５５】
何れかのジョブに割当てられているノードは、当該ジョブが終了するまで新たなジョブに割当てられないものとする。一方、空きノード群の一部または全部は、即時に新たなジョブに割当て可能である。１つのノードは、同時に複数のジョブに割当てられないものとし、高々１つのジョブに使用されるものとする。また、１つのジョブは、連続した（分断されていない）２以上のノードを含むノード群を使用するものとする。各ノードには、ジョブ情報で指定されたプログラムが送り込まれて（当該ノードにコピーされて）プロセスが配置される。これにより、１つのジョブに属する２以上のプロセスが２以上のノードを用いて並列に実行される。
【００５６】
管理装置１００は、クライアント３００からジョブ情報を受信する。例えば、管理装置１００は、ノード数に関する情報として１２×２個の形状を指定したジョブＤを示すジョブ情報を受信する。このジョブ情報では、２４個のノードそれぞれに配置されるプロセスの番号が指定される。プロセス番号と処理の内容との対応関係は、例えば、ジョブ情報で指定されるプログラムにおいて定義されている。すなわち、プロセス番号によって、１２×２個のノードそれぞれに実行させたい処理の内容が特定されることになる。
【００５７】
ここで、管理装置１００は、クライアント３００から受信したジョブ情報に基づいて、ジョブＤを並列計算機２００に実行させようとする。このとき、管理装置１００は、ジョブＤのジョブ情報によって指定された１２×２個という形状に合致する空きノード群を、並列計算機２００の中から探す。しかし、１つのノードは同時に複数のジョブに割当てられないため、管理装置１００は、１２×２個の空きノード群を見つけることができない。その場合、例えば、管理装置１００は、ジョブＤへのノードの割当てができないと判断し、ジョブＢまたはジョブＣの実行が終了するまでジョブＤを待機させておく可能性がある。このように、並列計算機２００には６４個の空きノードが存在するにもかかわらず、ジョブ形状が合致しないために、２４個のノードを要求するジョブＤの実行を開始できない可能性がある。ジョブＤが待ち状態になると、並列計算機２００におけるノードの稼働率が低下し、並列計算機システムのスループットが低下するおそれがあるという問題がある。そこで、管理装置１００は、クライアント３００から指定されたジョブ形状を変形することを検討する。
【００５８】
図６は、並列計算機システムの機能例を示す図である。管理装置１００は、記憶部１１０、ジョブ受付部１２０、ノード管理部１３０および割当算出部１４０を有する。ジョブ受付部１２０、ノード管理部１３０および割当算出部１４０は、互いに通信可能である。記憶部１１０は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域として実装される。ジョブ受付部１２０、ノード管理部１３０および割当算出部１４０は、例えば、プロセッサ１０１が実行するプログラムのモジュールとして実装される。
【００５９】
記憶部１１０は、ジョブ受付部１２０、ノード管理部１３０および割当算出部１４０の処理に用いられる情報を記憶する。記憶部１１０に記憶される情報には、要求テーブルおよび通信テーブルが含まれる。要求テーブルおよび通信テーブルは、クライアント３００から取得するジョブ情報に含まれている。後述するように、要求テーブルは、ジョブの形状、すなわち、ジョブが使用するノードの総数を各座標軸のノード数の積として表した情報を含む。また、要求テーブルは、プロセス番号とノードとの対応関係、すなわち、ジョブ形状内での各ノードへのプロセスの配置方法を示す情報を含む。通信テーブルは、複数のプロセスの間の通信関係、すなわち、一のプロセスから他の一のプロセスに対してデータを送信することがあるか否かを示す情報を含む。
【００６０】
ジョブ受付部１２０は、クライアント３００から、並列計算機２００を利用したジョブの実行を要求するジョブ情報を受付ける。ジョブ情報には、要求テーブルおよび通信テーブルが含まれる。また、ジョブ情報は、プロセスの起動に用いるプログラムの指定を含む。ジョブ受付部１２０は、ジョブ情報を受付けると、受付けたジョブ情報に含まれる要求テーブルおよび通信テーブルを記憶部１１０に格納する。また、ジョブ受付部１２０は、ジョブ情報を受付けたことを示す応答をクライアント３００に返す。このとき、ジョブ受付部１２０は、要求されたジョブの実行が開始されたか（ノードが割当てられたか）、または、要求されたジョブが待機状態になったか（ノードが割当てられなかったか）をクライアント３００に通知してもよい。
【００６１】
ノード管理部１３０は、並列計算機２００の状態を監視し、並列計算機２００へのジョブの投入を管理する。ノード管理部１３０は、並列計算機２００からノード構成を示す情報を収集する。ノード構成を示す情報は、並列計算機２００に何個のノードが含まれており、それらノードがどのように接続されているかを示す。
【００６２】
また、ノード管理部１３０は、並列計算機２００に含まれる各ノードが使用中か否か、すなわち、何れかのジョブに属するプロセスが配置されているか否かを管理する。例えば、ノード管理部１３０は、各ノードに定期的に問い合わせることで、各ノードが使用中か否かを把握してもよい。また、ノード管理部１３０は、あるノードでプロセスの実行が終了したときまたはプロセスの配置が解除されたとき、当該ノードから完了通知を受付けることで、当該ノードが使用中から未使用になったことを把握してもよい。ノード管理部１３０は、割当算出部１４０から空きノード群の問い合わせを受付けると、連続する未使用のノードの集合である空きノード群を検索し、割当算出部１４０に回答する。
【００６３】
また、ノード管理部１３０は、割当算出部１４０からの指示に応じて、並列計算機２００にジョブを開始させる。例えば、ノード管理部１３０は、割当算出部１４０から指定されたノードに対して指定されたプログラムを送信し、当該プログラムを起動する起動コマンドを当該ノードに対して送信する。このとき、ノード管理部１３０は、割当算出部１４０から指定されたプロセス番号をパラメータとして指定してもよい。これにより、割当算出部１４０から指定された番号のプロセスが指定されたノードに配置される。
【００６４】
割当算出部１４０は、ジョブ受付部１２０が受付けたジョブ情報が示すジョブに対して、並列計算機２００の空きノード群を割当てる。まず、割当算出部１４０は、ノード管理部１３０に現在の空きノード群を問い合わせる。割当算出部１４０は、ジョブ情報が要求するノード総数を満たす空きノードが並列計算機２００に存在するか、および、ジョブ情報が指定するジョブ形状を収容できる空きノード群が存在するか判定する。全ての座標軸について、ある空きノード群のノード数がジョブ形状のノード数以上である場合、当該空きノード群は指定されたジョブ形状を収容できる。
【００６５】
指定されたジョブ形状を収容できる空きノード群がある場合、割当算出部１４０は、ジョブ形状に合致する空きノードを選択して当該ジョブに対して割当てる。そして、割当算出部１４０は、ノードの割当て結果をノード管理部１３０に通知して、ジョブが開始されるようにする。また、要求されたノード総数を満たす空きノードが並列計算機２００に存在しない場合、割当算出部１４０は、要求されたジョブに関する情報をキューに格納して当該ジョブを待機させ、実行中の他のジョブが終了して空きノードが増えるのを待つ。
【００６６】
これに対し、ノード総数の条件は満たすもののジョブ形状の条件を満たさない空きノード群が存在する場合、割当算出部１４０は、要求されたノード総数を変更せずに、指定されたジョブ形状を変化させて、既存の空きノード群を使用できるようにする。割当算出部１４０は、例えば、１２×２個の形状を６×４個の形状に変化させることで、ジョブに空きノード群を割当てることができるようにする。
【００６７】
並列計算機２００は、管理装置１００から要求されたジョブを実行する。並列計算機２００の各ノードは、ノード管理部１３０から指定されたプログラムを用いて、ノード管理部１３０から指定されたプロセスを実行する。並列計算機２００は、ジョブの実行が終了した場合、その旨を管理装置１００に通知してもよい。
【００６８】
クライアント３００は、ユーザの操作により、ジョブ情報を作成し、当該ジョブ情報を管理装置１００に送信する。
図７は、要求テーブルの例を示す図である。要求テーブル１１１は、クライアント３００が送信するジョブ情報に含まれており、記憶部１１０に格納される。要求テーブル１１１は、要求ノード数、プロセスおよび座標の項目を含む。要求ノード数の項目には、割当てを要求するノード数が登録される。要求ノード数は、座標軸毎のノード数の積として表されており、ジョブ形状を表していると言うことができる。プロセスの項目には、プロセス番号が登録される。例えば、プロセス数をｎとすると、プロセス番号は０からｎ−１までの連番として表現できる。１つのノードには１つのプロセスが配置されるため、プロセス数ｎは、ジョブが要求するノード総数と一致する。座標の項目には、プロセスが配置されるノードの座標が登録される。この座標は、クライアント３００から指定されたジョブ形状の中での相対的な位置関係を示すものである。通常、ジョブ形状の中の１つのノードに原点が付与され、そのノードを基点にして他のノードにＮ次元の座標が付与される。
【００６９】
例えば、要求テーブル１１１には、図５の下部に示したジョブＤに関する情報が登録される。その場合、要求テーブル１１１には、要求ノード数として“１２×２”が登録される。また、要求テーブル１１１には、プロセス０に対して座標（０，０）、プロセス１に対して座標（１，０）、プロセス２３に対して座標（１１，１）などの対応関係が登録される。
【００７０】
図８は、通信テーブルの例を示す図である。通信テーブル１１２は、クライアント３００が送信するジョブ情報に含まれており、記憶部１１０に格納される。列Ｌ１は、送信元プロセスのプロセス番号を示している。列Ｌ２は、宛先プロセスのプロセス番号を示している。通信テーブル１１２を参照することで、ある２つのプロセス間で通信を行うことになっているか否かの情報を取得することができる。ある２つのプロセス間で通信が行われるか否かは、それらプロセスを生成するプログラムによって定義されているため、クライアント３００のユーザが予め知っている。
【００７１】
例えば、図８の例では、プロセス０は、プロセス０，２にデータを送信することがなく、プロセス１にデータを送信することがある。プロセス１は、プロセス０，１にデータを送信することがなく、プロセス２にデータを送信することがある。プロセス２は、プロセス０，２にデータを送信することがなく、プロセス１にデータを送信することがある。
【００７２】
なお、図８の例では、２つのプロセスの間のデータ送信の有無は非対称である。例えば、プロセス０はプロセス１にデータを送信することがある一方、プロセス１はプロセス０にデータを送信することがない。ただし、２つのプロセスの間のデータ送信の有無が対称である場合も考えられる。その場合、通信テーブル１１２の記載を簡略化してもよい。
【００７３】
次に、並列計算機２００のトポロジが２次元メッシュまたは２次元トーラスである場合を主に想定して、ノードの割当て処理について説明する。
図９は、ジョブに２次元のノードを割当てる処理の例を示すフローチャートである。図９の処理は、ジョブ受付部１２０がクライアント３００からジョブ情報を受付けることにより処理が始まる。以下、図９に示す処理をステップ番号に沿って説明する。
【００７４】
（Ｓ１１）割当算出部１４０は、現在存在する空きノード群をノード管理部１３０に問い合わせる。ノード管理部１３０は、並列計算機２００に存在する空きノード群を検索し、１または２以上の空きノード群それぞれの形状および座標を回答する。
【００７５】
割当算出部１４０は、要求テーブル１１１を参照し、クライアント３００から要求されたノード総数分の空きノードが並列計算機２００に存在するか判定する。例えば、要求されたノード総数が２４個（＝１２×２）の場合、割当算出部１４０は、２４個以上のノードを含む空きノード群が存在するか判定する。ノード総数分の空きノードが存在する場合は、ステップＳ１２に処理が進み、それ以外の場合は処理が終了する。
【００７６】
処理が終了する場合、ジョブ受付部１２０は、クライアント３００にノードの割当てができない旨の通知を行ってもよい。また、割当算出部１４０は、ノードを割当てられなかったジョブを示す情報をＲＡＭ１０２上のキューに格納して当該ジョブを待機させてもよい。この場合、例えば、割当算出部１４０は、他のジョブが終了して空きノードが増えたときに、待機しているジョブにノードを割当て可能か判定する。また、割当算出部１４０は、指定されたジョブ形状を包含する空きノード群が存在すれば、以降の処理を行わずに、要求されたジョブに空きノードを割当てて並列計算機２００に実行させる。
【００７７】
（Ｓ１２）割当算出部１４０は、指定されたジョブ形状に含まれるＸ，Ｙ次元それぞれのノード数の約数を全て算出する。
（Ｓ１３）割当算出部１４０は、何れか１つの約数を次元間で移動させて、指定されたジョブ形状を変形したパターンを特定する。ただし、変形後のジョブ形状は、何れかの空きノード群に収容できるものに限定する。変形後のジョブ形状は、式（１）および式（２）を用いて算出することができる。
【００７８】
【数１】
2016004310.tif 000003
【００７９】
【数２】
2016004310.tif 000004
【００８０】
式（１）および式（２）において、Ｍ１srcは、変形後の移動元であるｓｒｃ次元のノード数を示す。Ｍsrcは、変形前の移動元であるｓｒｃ次元のノード数を示す。ｆａｃｔは、次元間で移動させる約数を示す。Ｍ１dstは、変形後の移動先であるｄｓｔ次元のノード数を示す。Ｍdstは、変形前の移動先であるｄｓｔ次元のノード数を示す。約数ｆａｃｔをｓｒｃ次元からｄｓｔ次元に移動することで、ｓｃｒ次元のノード数はｆａｃｔ分の１に減少し、ｄｓｔ次元のノード数はｆａｃｔ倍に増加する。ただし、約数を移動しただけでは、ジョブが要求するノード総数は変化しない。
【００８１】
例えば、割当算出部１４０は、Ｘ次元およびＹ次元の約数の中から１つを選択して他方の次元に移動し、移動によって得られるジョブ形状が何れかの空きノード群に収容できるものであるか判定する。空きノード群に収容できる場合、割当算出部１４０は、そのジョブ形状を変形パターンとして採用する。一方、何れの空きノード群にも収容できない場合、割当算出部１４０は、そのジョブ形状を変形パターンとして採用せずに破棄する。割当算出部１４０は、考え得る全ての変形パターンを特定する。
【００８２】
（Ｓ１４）割当算出部１４０は、ステップＳ１３で特定された１つのパターンを選択し、式（３）および式（４）を用いて、各プロセスの配置を変更する。
【００８３】
【数３】
2016004310.tif 000005
【００８４】
【数４】
2016004310.tif 000006
【００８５】
式（３）および式（４）において、ｖ１srcは、変形後の移動元であるｓｒｃ次元の座標を示す。ｖsrcは、変形前の移動元であるｓｒｃ次元の座標を示す。ｖsrc／ｆａｃｔは、ｖsrcを約数ｆａｃｔで割ったときの整数部を示し、小数点以下は切り捨てられる。ｖ１dstは、変形後の移動先であるｄｓｔ次元の座標を示す。ｖdstは、変形前の移動先であるｄｓｔ次元の座標を示す。ｖsrc％ｆａｃｔは、ｖsrcを約数ｆａｃｔで割った余りを示す。ｖsrc、ｖdst、ｖ１srcおよびｖ１dstは、それぞれ０以上の整数である。式（３）および式（４）によれば、変形前のジョブ形状において座標（ｖsrc，ｖdst）に配置されていたプロセスは、変形後のジョブ形状において座標（ｖ１src，ｖ１dst）に配置されることになる。
【００８６】
（Ｓ１５）割当算出部１４０は、変形後のジョブ形状の評価値を算出する。評価値の一例として、ここでは、ノード間の通信コストを示す総ホップ数（ＴｏｔａｌＨｏｐ）を用いる。総ホップ数が小さいほど、ノード間の通信コストが低いことを示す。割当算出部１４０は、通信テーブル１１２を参照し、式（５）を用いて総ホップ数を算出する。
【００８７】
【数５】
2016004310.tif 000007
【００８８】
式（５）において、ｎはジョブに含まれるプロセスの数を示す。関数ｈｏｐ（ｉ，ｊ）の値は、プロセスｉが配置されるノード（ノードｉ）からプロセスｊが配置されるノード（ノードｊ）までのホップ数を示している。ホップ数は、データが異なるノード間を跨ぐ回数であり、通信の経路長とも言える。ノードｉとノードｊが隣接しているときホップ数は１であり、ノードｉとノードｊが離れているほどホップ数は大きくなる。例えば、ホップ数は、ノードｉのＸ座標とノードｊのＸ座標の差＋ノードｉのＹ座標とノードｊのＹ座標の差として算出できる。ただし、プロセスｉからプロセスｊにデータが送信されない場合、関数ｈｏｐ（ｉ，ｊ）の値を０とする。総ホップ数は、全てのプロセスｉとプロセスｊの組（順序も区別した組）について関数ｈｏｐ（ｉ，ｊ）の値を合計したものである。
【００８９】
（Ｓ１６）割当算出部１４０は、ステップＳ１３で特定した全てのパターンに対して、ステップＳ１４，Ｓ１５を処理済みであるか判定する。処理済みの場合はステップＳ１７に処理が進み、それ以外の場合はステップＳ１４に処理が進む。
【００９０】
（Ｓ１７）割当算出部１４０は、要求テーブル１１１と通信テーブル１１２を参照して、変形前のジョブ形状の評価値を算出する。一例として、割当算出部１４０は、変形前のジョブ形状についての総ホップ数を算出する。
【００９１】
（Ｓ１８）割当算出部１４０は、ステップＳ１３で特定したパターンの中から、ステップＳ１５で算出した評価値（例えば、総ホップ数）が、ステップＳ１７で算出した変形前のジョブ形状の評価値（例えば、総ホップ数）に最も近いパターンを特定する。割当算出部１４０は、特定したパターンを変形後のジョブ形状として採用する。なお、割当算出部１４０は、上記のステップＳ１７，Ｓ１８に代えて、ステップＳ１３で特定したパターンの中から、ステップＳ１５で算出した評価値が最良のもの（例えば、総ホップ数が最小のもの）を選択するようにしてもよい。
【００９２】
（Ｓ１９）割当算出部１４０は、変形後のジョブ形状を空きノード群とマッチングして、ジョブに割当てるノードおよび各ノードに配置するプロセスのプロセス番号を決定する。割当算出部１４０は、使用するノードの座標（並列計算機２００の中での絶対座標）とプロセス番号のリストをノード管理部１３０に通知する。ノード管理部１３０は、割当算出部１４０から指定されたノード（割当てノード）を用いてジョブの実行を開始させる。例えば、ノード管理部１３０は、ジョブ情報で指定されたプログラムのファイルを割当てノードそれぞれにコピーし、プログラムを起動するコマンドを割当てノードそれぞれに対して送信する。これにより、各割当てノードにおいて、所望の処理を実行するプロセスが立ち上がる。そして、処理を終了する。
【００９３】
このように、ジョブ形状の変形パターンの中から評価値が変形前のジョブ形状に最も近いパターンを特定することで、変形前と近い性能を実現することができる。評価値として総ホップ数を用いた場合、変形前と近い通信性能を実現できる。
【００９４】
図１０は、ジョブに２次元のノードを割当てる処理の具体例を示す図である。
ジョブ受付部１２０は、クライアント３００から１２×２個の形状であるジョブＤのジョブ情報を受付ける。ノード管理部１３０は、並列計算機２００の空きノード数が６４（８×８）個であることを確認する。すると、割当算出部１４０は、ジョブＤで要求されたノード総数である２４（１２×２）個分の空きノードが並列計算機２００に存在すると判断する。一方、割当算出部１４０は、１２×２のジョブ形状では、ジョブＤにノードを割当てることができないと判断する。
【００９５】
そこで、割当算出部１４０は、ジョブＤが指定するジョブ形状のＸ，Ｙ次元におけるノード数の約数を算出する。Ｘ次元の約数は、１、２、３、４、６、１２である。Ｙ次元の約数は、１、２である。そして、割当算出部１４０は、何れか１つの約数を次元間で移動させることで、指定されたジョブ形状（１２×２）を変形させたパターンを算出する。
【００９６】
１つの約数を移動させて得られるジョブ形状としては、２４×１、６×４、４×６、３×８、２×１２、１×２４の６通りが考えられる。ただし、並列計算機２００に存在する空きノード群の形状は８×８であるため、空きノード群に収容できないジョブ形状である２４×１、２×１２、１×２４は変形パターンから除外される。よって、６×４、４×６、３×８の３つの変形パターンが候補として挙げられる。
【００９７】
図１０（Ａ）は、パターン１として、６×４のジョブ形状を示している。パターン１は、Ｘ次元の約数“２”をＹ次元に移動することに相当する。図１０（Ｂ）は、パターン２として、４×６のジョブ形状を示している。パターン２は、Ｘ次元の約数“３”をＹ次元に移動することに相当する。図１０（Ｃ）は、パターン３として、３×８のジョブ形状を示している。パターン３は、Ｘ次元の約数“４”をＹ次元に移動することに相当する。
【００９８】
なお、４×６のジョブ形状は、各次元のノード数という観点では、６×４のジョブ形状を回転させたものである。しかし、プロセスの配置という観点では、４×６のプロセス配置は、６×４のプロセス配置を回転させたものと一致しない。すなわち、４×６のジョブ形状の評価値は、６×４のジョブ形状の評価値と一致しない可能性がある。このため、割当算出部１４０は、６×４のジョブ形状と４×６のジョブ形状とを別個の変形パターンとして評価している。
【００９９】
図１１は、ジョブに２次元のノードを割当てる処理の具体例（続き）を示す図である。図１１の上部では、指定されたジョブ形状（１２×２）からパターン１のジョブ形状（６×４）に変形させた場合に、変形に伴ってプロセスの配置が変更されることを示している。変更後のプロセスの配置は、割当算出部１４０が、式（３）および式（４）を用いることで算出できる。
【０１００】
例えば、座標（２，０）に配置されていたプロセス２について、パターン１ではＸ座標はｖ１X＝２／２＝１、変形後のＹ座標はｖ１Y＝０×２＋２％２＝０となる。よって、プロセス２は、パターン１では座標（１，０）に移動することになる。また、座標（８，１）に配置されていたプロセス２０について、パターン１ではＸ座標はｖ１X＝８／２＝４、変形後のＹ座標はｖ１Y＝１×２＋８％２＝２となる。よって、プロセス２０は、パターン１では座標（４，２）に移動することになる。
【０１０１】
割当算出部１４０は、通信テーブル１１２を参照し、式（５）を用いて、パターン１のジョブ形状（６×４）の評価値として総ホップ数を算出する。同様に、割当算出部１４０は、パターン２のジョブ形状（４×６）、パターン３のジョブ形状（３×８）についても、プロセスの配置を算出し、総ホップ数を算出する。ここでは、パターン１の総ホップ数を１２０、パターン２の総ホップ数を１３０、パターン３の総ホップ数を１８０とする。
【０１０２】
また、割当算出部１４０は、通信テーブル１１２を参照して、クライアント３００から指定されたジョブ形状（１２×２）の総ホップ数を算出する。ここでは、算出した結果は１００であったものとする。
【０１０３】
すると、割当算出部１４０は、総ホップ数が変形前のジョブ形状の総ホップ数（１００）に最も近いパターン１を選択する。図１１の下部では、ノード管理部１３０が、６×４のジョブ形状に変形したジョブＤに並列計算機２００の空きノードを割当てた状態を示している。ここでは、（４，４）〜（９，７）の範囲にある６×４個のノードが、ジョブＤに割当てられている。
【０１０４】
このように、要求されたノードの総数を変更せずに、指定されたジョブ形状を変更することを許容することで、ジョブＤに並列計算機２００の空きノードを割当てることができる。そして、ジョブＤを割当てたことで、並列計算機２００におけるノード稼働率を向上させることができる。
【０１０５】
上記のジョブ形状の変形方法は、並列計算機２００のノードを接続する相互接続網が３次元以上である場合に適用することもできる。例えば、割当算出部１４０は、３以上の座標軸の中から２つの座標軸を選択し、選択した２つの座標軸の間で何れか１つの約数を移動することで変形パターンを算出する。割当算出部１４０は、選択する２つの座標軸の組み合わせを変えていくことで、様々な変形パターンを算出することができる。ただし、上記以外のジョブ形状の変形方法も考えられる。以下では、主に３次元以上の相互接続網に対して適用することを想定して、他の変形方法の例を説明する。
【０１０６】
図１２は、ジョブに３次元以上のノードを割当てる処理の例を示すフローチャートである。図１２の処理は、ジョブ受付部１２０がクライアント３００からジョブ情報を受付けることにより処理が始まる。ジョブ情報に含まれる要求テーブル１１１の要求ノード数の項目には、３次元以上のジョブ形状を示す情報が登録されている。例えば、要求テーブル１１１の要求ノード数の項目には、８×１２×１５が登録される。これは、Ｘ次元のノード数が８、Ｙ次元のノード数が１２、Ｚ次元のノード数が１５であることを示す。以下、図１２に示す処理をステップ番号に沿って説明する。
【０１０７】
（Ｓ２１）割当算出部１４０は、現在存在する空きノード群をノード管理部１３０に問い合わせ、クライアントから要求されたノード総数分の空きノードが並列計算機２００に存在するか判定する。空きノードが存在する場合は、ステップＳ２２に処理が進み、それ以外の場合は処理が終了する。
【０１０８】
また、割当算出部１４０は、指定されたジョブ形状を包含する空きノード群が存在すれば、以降の処理を行わずに、要求されたジョブに空きノードを割当てて並列計算機２００に実行させる。
【０１０９】
（Ｓ２２）割当算出部１４０は、指定されたジョブ形状に含まれる各次元（Ｘ，Ｙ，Ｚ次元など）のノード数を素因数分解する。また、割当算出部１４０は、並列計算機２００に存在する各空きノード群について、当該空きノード群のジョブ形状に含まれる各次元のノード数を素因数分解する。
【０１１０】
（Ｓ２３）割当算出部１４０は、各空きノード群について、当該空きノード群の全ての次元の素数を集めた集合が、指定されたジョブ形状の素数の集合を包含しているか判断し、該当する空きノード群が少なくとも１つ存在するか判定する。このとき、素数が存在する次元の違いは無視してよい。
【０１１１】
例えば、指定されたジョブ形状が８×１２×１５であり、ある空きノード群の形状が６×１５×１６であるとする。前者を素因数分解すると（２×２×２）×（２×２×３）×（３×５）＝２5×３2×５となり、後者を素因数分解すると（２×３）×（３×５）×（２×２×２×２）＝２5×３2×５となる。よって、次元の違いを無視すれば、この空きノード群は、指定されたジョブ形状の素数の集合を包含している。
【０１１２】
該当する空きノード群が少なくとも１つ存在する場合はステップＳ２４に処理が進み、それ以外の場合は処理が終了する。処理が終了する場合、ジョブ受付部１２０は、クライアント３００にノードの割当てができない旨の通知を行ってもよい。
【０１１３】
（Ｓ２４）割当算出部１４０は、指定されたジョブ形状を変形するパターンを特定する。図１２の処理における変形パターンは、後述するように、ある次元から別の次元に１または２以上の素数を移動する操作を複数定義し、ある順序でそれら複数の操作を実行するものである。最終的な変形後のジョブ形状は、何れかの空きノード群に収容できるものに限定される。パターン特定処理の詳細は後述する。
【０１１４】
（Ｓ２５）割当算出部１４０は、ステップＳ２４で特定された１つのパターンを選択し、選択したパターンに従って各プロセスの配置を変更する。例えば、割当算出部１４０は、１または２以上の素数をｓｒｃ次元からｄｓｔ次元に移動する操作１回毎に、前述の式（３）および式（４）を適用して、各プロセスの座標（ｖ１src，ｖ１dst）を算出する。このとき、式（３）および式（４）の約数ｆａｃｔは、移動する１または２以上の素数の積とすればよい。割当算出部１４０は、パターンが示す操作の順序に従って、上記のプロセス配置の変更を連続的に行う。これにより、最終的なジョブ形状におけるプロセス配置を算出することができる。
【０１１５】
（Ｓ２６）割当算出部１４０は、変形後のジョブ形状の評価値を算出する。一例として、割当算出部１４０は、通信テーブル１１２を参照し、式（５）を用いて総ホップ数（ＴｏｔａｌＨｏｐ）を算出する。前述のように、総ホップ数はノード間の通信コストを示しており、総ホップ数が小さいほど通信コストが小さい。
【０１１６】
（Ｓ２７）割当算出部１４０は、ステップＳ２４で特定した全てのパターンに対して、ステップＳ２５，Ｓ２６を処理済みであるか判定する。処理済みの場合はステップＳ２８に処理が進み、それ以外の場合はステップＳ２５に処理が進む。
【０１１７】
（Ｓ２８）割当算出部１４０は、ステップＳ２４で特定したパターンの中から、ステップＳ２６で算出した評価値が最良のパターン（例えば、総ホップ数が最小のパターン）を特定する。割当算出部１４０は、特定したパターンを変形後のジョブ形状として採用する。なお、割当算出部１４０は、ステップＳ２８に代えて、変形前のジョブ形状の評価値を算出し、ステップＳ２４で特定したパターンの中から、評価値が変形前のジョブ形状に最も近いパターンを採用するようにしてもよい。
【０１１８】
（Ｓ２９）割当算出部１４０は、変形後のジョブ形状を空きノード群とマッチングして、ジョブに割当てるノードおよび各ノードに配置するプロセスのプロセス番号を決定する。ノード管理部１３０は、割当算出部１４０から指定されたノード（割当てノード）を用いてジョブの実行を開始させる。例えば、ノード管理部１３０は、ジョブ情報で指定されたプログラムのファイルを割当てノードそれぞれにコピーし、プログラムを起動するコマンドを割当てノードそれぞれに対して送信する。そして、処理を終了する。
【０１１９】
図１３は、ジョブ形状の変形パターンを特定する処理の例を示すフローチャートである。図１３に示す処理は、上記のステップＳ２４の処理に対応する。以下、図１３に示す処理をステップ番号に沿って説明する。なお、以下の説明では、この処理を実装したプログラムにおいて用いられる変数名や関数名の例を、括弧書きで記載することがある。また、ここでは、１つの空きノード群についての処理を説明する。ステップＳ２３に該当する空きノード群が２以上がある場合、各空きノード群について図１３に示す処理が実行されて、１または２以上のパターンが特定される。
【０１２０】
（Ｓ３１）割当算出部１４０は、次元を１つ選択する（次元ｄｉｍ）。例えば、並列計算機２００の相互接続網が３次元の場合、Ｘ次元、Ｙ次元、Ｚ次元のうち１つの次元を選択する。
【０１２１】
（Ｓ３２）割当算出部１４０は、次元ｄｉｍについて、クライアント３００から指定されたジョブ形状（要求形状ｒｅｑ）に存在せず、空きノード群の形状（空き形状ｓｐ）に存在する素数を特定する（素数集合ｍｕｌｔｉｓ［ｄｉｍ］）。
【０１２２】
（Ｓ３３）割当算出部１４０は、要求形状ｒｅｑに存在し、空き形状ｓｐに存在しない素数を特定する（素数集合ｄｅｖｓ［ｄｉｍ］）。
（Ｓ３４）割当算出部１４０は、ステップＳ３２，Ｓ３３を全ての次元に対して処理済みであるか否かを判定する。例えば、３次元の相互接続網の場合、割当算出部１４０は、ステップＳ３１においてＸ次元、Ｙ次元、Ｚ次元の全てを選択したか判定する。処理済みの場合はステップＳ３５に処理が進み、それ以外の場合はステップＳ３１に処理が進む。
【０１２３】
（Ｓ３５）割当算出部１４０は、次元を１つ選択する（次元ｄｉｍ）。
（Ｓ３６）割当算出部１４０は、次元ｄｉｍ以外の他次元の素数集合ｄｅｖｓの中から、素数集合ｍｕｌｔｉｓ［ｄｉｍ］と同じ素数を選択し、次元ｄｉｍへ移動する候補とする（操作集合ｍｏｖｅｄｓ［ｄｉｍ］）。例えば、３次元の相互接続網において、次元ｄｉｍ＝Ｘ次元である場合、他次元はＹ次元とＺ次元である。素数集合ｍｕｌｔｉｓ［ｄｉｍ］に２以上の素数が含まれる場合、それら２以上の素数全てを移動することになる。このとき、２以上の素数は、１つの他次元の素数集合ｄｅｖｓの中に存在してもよいし、複数の他次元の素数集合ｄｅｖｓに分散して存在してもよい。後者の場合、第１の他次元から次元ｄｉｍへの素数の移動と、第２の他次元から次元ｄｉｍへの素数の移動とは、別の操作として扱われる。
【０１２４】
（Ｓ３７）割当算出部１４０は、ステップＳ３６を全ての次元に対して処理済みであるか否かを判定する。処理済みの場合はステップＳ３８に処理が進み、それ以外の場合はステップＳ３５に処理が進む。
【０１２５】
（Ｓ３８）割当算出部１４０は、全ての次元の操作集合ｍｏｖｅｄｓを結合し、結合した操作集合に列挙されている操作の順列を全て算出する。素数の移動操作の順列が変形パターンとなる。そして、処理を終了する。
【０１２６】
なお、素数の移動順序が異なると、最終的なジョブ形状が同じであってもプロセスの配置が異なるため、評価値が異なる可能性がある。そこで、図１２および図１３の処理では、ジョブ形状が同じでプロセス配置の異なる変形も異なる「パターン」として特定して、最適なパターンを選択するようにする。評価対象の複数のパターンの中には、同じ空きノード群について算出された、素数の移動順序が異なるパターン（変形後のジョブ形状が同じでプロセス配置が異なるパターン）が含まれていることがある。また、評価対象の複数のパターンの中には、形状の異なる空きノード群について算出されたパターン（変形後のジョブ形状が異なるパターン）が含まれていることがある。
【０１２７】
このように、図１２、１３の処理によって、３次元以上の相互接続網をもつ並列計算機２００の空きノードを、ジョブに対して柔軟に割当てることができる。
次に、３次元の相互接続網のノードをジョブに割当てる処理の具体例を説明する。一例として、ジョブ受付部１２０は、クライアント３００から８×１２×１５のジョブ形状を指定したジョブ情報を受付ける。このとき、並列計算機２００には６×１５×１６の空きノード群が存在するものとする。割当算出部１４０は、要求されたノード総数８×１２×１５＝１４４０個分の空きノードが並列計算機２００に存在すると判断する。一方、割当算出部１４０は、指定された８×１２×１５のジョブ形状では、当該ジョブにノードを割当てることができないと判断する。
【０１２８】
すると、割当算出部１４０は、指定されたジョブ形状（８×１２×１５）と空きノード群の形状（６×１５×１６）の各次元のノード数を素因数分解する。指定されたジョブ形状のＸ次元は２×２×２、Ｙ次元は２×２×３、Ｚ次元は３×５である。空きノード群の形状のＸ次元は２×３、Ｙ次元は３×５、Ｚ次元は２×２×２×２である。次に、割当算出部１４０は、Ｘ次元、Ｙ次元、Ｚ次元について素数集合ｍｕｌｔｉｓと素数集合ｄｅｖｓを算出する。ｍｕｌｔｉｓ［Ｘ］＝｛３｝、ｍｕｌｔｉｓ［Ｙ］＝｛５｝、ｍｕｌｔｉｓ［Ｚ］＝｛２×２×２×２｝となる。また、ｄｅｖｓ［Ｘ］＝｛２，２｝、ｄｅｖｓ［Ｙ］＝｛２，２｝、ｄｅｖｓ［Ｚ］＝｛３，５｝となる。
【０１２９】
次に、割当算出部１４０は、Ｘ次元、Ｙ次元、Ｚ次元について操作集合ｍｏｖｅｄｓを算出する。ｍｏｖｅｄｓ［Ｘ］＝｛ｄｅｖｓ［Ｚ］の３｝となる。これは、Ｚ次元からＸ次元に“３”を移動する操作を示す。また、ｍｏｖｅｄｓ［Ｙ］＝｛ｄｅｖｓ［Ｚ］の５｝となる。これは、Ｚ次元からＹ次元に“５”を移動する操作を示す。ｍｏｖｅｄｓ［Ｚ］＝｛ｄｅｖｓ［Ｘ］の２×２、ｄｅｖｓ［Ｙ］の２×２｝となる。これは、Ｘ次元からＺ次元に“２”と“２”（すなわち、“４”）を移動する操作と、Ｙ次元からＺ次元に“２”と”２”（すなわち、“４”）を移動する操作とを示す。
【０１３０】
これにより、ｍｏｖｅｄｓ［Ｘ］、ｍｏｖｅｄｓ［Ｙ］、ｍｏｖｅｄｓ［Ｚ］に列挙された４つの操作を得ることができる。操作１は、Ｚ次元からＸ次元への“３”の移動である。操作２は、Ｚ次元からＹ次元への“５”の移動である。操作３は、Ｘ次元からＺ次元への“４”の移動である。操作４は、Ｙ次元からＺ次元への“４”の移動である。割当算出部１４０は、これら４つの操作に対する全ての順列を算出する。４つの操作の順列は、以下の２４通りになる。すなわち、２４通りの「パターン」が算出される。
【０１３１】
｛１，２，３，４｝、｛１，２，４，３｝、｛１，３，２，４｝、｛１，３，４，２｝、｛１，４，２，３｝、｛１，４，３，２｝、｛２，１，３，４｝、｛２，１，４，３｝、｛２，３，１，４｝、｛２，３，４，１｝、｛２，４，１，３｝、｛２，４，３，１｝、｛３，１，２，４｝、｛３，１，４，２｝、｛３，２，１，４｝、｛３，２，４，１｝、｛３，４，１，２｝、｛３，４，２，１｝、｛４，１，２，３｝、｛４，１，３，２｝、｛４，２，１，３｝、｛４，２，３，１｝、｛４，３，１，２｝、｛４，３，２，１｝（列挙されている番号は操作番号を示し、番号の順序は操作順序を示す）。
【０１３２】
上記のパターンそれぞれについて、ジョブ形状およびプロセス配置を操作の順に沿って算出していく。以下では、代表して｛１，２，３，４｝のパターンの例を示す。また、一例として、開始時に座標（５，３，８）にあるプロセスの移動先を追うこととする。
【０１３３】
割当算出部１４０は、指定されたジョブ形状（８×１２×１５）に対して、Ｚ次元からＸ次元へ“３”を移動する操作１を実行する。操作１が行われた後のジョブ形状は、式（１）および式（２）に従い、（８×３）×１２×（１５／３）＝２４×１２×５となる。このとき、座標（５，３，８）にあるプロセスは、式（３）および式（４）に従い、（５×３＋８％３，３，８／３）＝（１７，３，２）に移動することになる。
【０１３４】
次に、割当算出部１４０は、２４×１２×５のジョブ形状に対して、Ｚ次元からＹ次元へ“５”を移動する操作２を実行する。すると、操作２が行われた後のジョブ形状は、２４×（１２×５）×（５／５）＝２４×６０×１となる。このとき、操作１の直後に座標（１７，３，２）にあったプロセスは、（１７，３×５＋２％５，２／５）＝（１７，１７，０）に移動することになる。
【０１３５】
次に、割当算出部１４０は、２４×６０×１のジョブ形状に対して、Ｘ次元からＺ次元へ“４”を移動する操作３を実行する。すると、操作３が行われた後のジョブ形状は、（２４／４）×６０×（１×４）＝６×６０×４となる。このとき、操作２の直後に座標（１７，１７，０）にあったプロセスは、（１７／４，１７，０×４＋１７％４）＝（４，１７，１）に移動することになる。
【０１３６】
次に、割当算出部１４０は、６×６０×４のジョブ形状に対して、Ｙ次元からＺ次元へ“４”を移動する操作４を実行する。すると、操作４が行われた後のジョブ形状は、６×（６０／４）×（４×４）＝６×１５×１６となる。このとき、操作３の直後に座標（４，１７，１）にあったプロセスは、（４，１７／４，１×４＋１７％４）＝（４，４，５）に移動することになる。このように、指定された８×１２×１５のジョブ形状は、空きノード群に収まるように、６×１５×１６のジョブ形状に変形される。これに伴い、座標（５，３，８）にあったプロセスは、座標（４，４，５）に移動する。
【０１３７】
割当算出部１４０は、上記と同様に他のプロセスについても、当該他のプロセスが最終的に配置されるノードの座標を算出する。素数の移動順序が異なると、最終的なジョブ形状が同じであってもプロセス配置が異なることがある。よって、割当算出部１４０は、上記の２４通りのパターンについてプロセス配置を算出する。そして、割当算出部１４０は、２４通りのパターンについて総ホップ数などの評価値を算出する。他の空きノード群が存在する場合、他の空きノード群についても１または２以上のパターンが特定されて各パターンの評価値が算出される。割当算出部１４０は、上記の２４通りのパターンを含む全てのパターンの中から、評価値が最良のパターン（例えば、総ホップ数が最小のパターン）を採用する。これにより、変形後のジョブ形状とプロセス配置が決定する。
【０１３８】
第２の実施の形態の並列計算機システムによれば、並列計算機２００の中にクライアント３００から指定されたジョブ形状を収容できる空きノード群が存在しないとき、空きノード群の形状に応じてジョブ形状が変形され、ジョブにノードが割当てられる。これにより、ジョブが要求するノード総数に相当する空きノードが並列計算機２００に存在するにもかかわらず当該ジョブが待ち状態になることを抑制でき、並列計算機システムのノード稼働率が向上する。また、ノードの計算リソースを有効に活用することができ、並列計算機システムのスループットが向上する。また、ジョブの実行が開始されるまでの待機時間を削減することができ、ジョブの実行を要求したクライアント３００にとって、ジョブの要求から実行終了までのレスポンス時間を短縮することができる。
【０１３９】
また、複数の変形パターンが考えられるとき、各パターンについて評価値が算出され、評価値が変形前と近いパターンまたは最良のパターンが選択される。これにより、ジョブ形状を変形することによる処理性能の低下を軽減することができる。特に、評価値としてプロセス間の通信コストを示す総ホップ数を用いることで、プロセス間の通信がボトルネックになり得る場合であっても通信性能の低下を軽減できる。よって、他のジョブが終了するのを待ってジョブ形状を変形せずにジョブを開始するよりも、ジョブ形状を変形して早期にジョブを開始した方が、スループットやレスポンス時間が改善すると期待できる。
【０１４０】
なお、第１の実施の形態の情報処理は、管理装置２に用いられるプロセッサに、プログラムを実行させることで実現できる。第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体に記録できる。
【０１４１】
例えば、プログラムを記録した記録媒体を配布することで、プログラムを流通させることができる。また、ジョブ受付部１２０、ノード管理部１３０、割当算出部１４０に相当する機能を実現するプログラムを別個のプログラムとし、各プログラムを別個に配布してもよい。ジョブ受付部１２０、ノード管理部１３０、割当算出部１４０の機能が別個のコンピュータにより実現されてもよい。コンピュータは、例えば、記録媒体に記録されたプログラムを、ＲＡＭ１０２やＨＤＤ１０３に格納されているＤｉｓｋなどの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０１４２】
１ａ〜１ｘ  ノード
２  管理装置
３  処理要求
３ａ，３ｂ  形状情報
【図１】
2016004310.tif 000008
【図２】
2016004310.tif 000009
【図３】
2016004310.tif 000010
【図４】
2016004310.tif 000011
【図５】
2016004310.tif 000012
【図６】
2016004310.tif 000013
【図７】
2016004310.tif 000014
【図８】
2016004310.tif 000015
【図９】
2016004310.tif 000016
【図１０】
2016004310.tif 000017
【図１１】
2016004310.tif 000018
【図１２】
2016004310.tif 000019
【図１３】
2016004310.tif 000020