(57)【要約】      （修正有）【課題】配下のプロセスの監視負荷の低減及び計算ノードの利用効率向上を図ることが可能となる技術を提供する。【解決手段】所定計算をそれぞれ行う複数の計算プロセスと複数の監視プロセスとを生成し、各監視プロセスが自身の直下に配置された監視プロセス及び計算プロセスを監視する監視の階層構造を形成する並列プログラムを実行可能な複数の計算ノードを含む。監視プロセスが割り当てられた各計算ノードが、割り当てられた監視プロセスの配下の計算プロセスの総数の目標値である第１の目標値と、割り当てられた監視プロセスの直下に配置される監視プロセス及び計算プロセスの数の目標値である第２の目標値とに基づいて、監視の階層構造を変更する処理を行う。【選択図】図３
2015222476.tif 000002
【特許請求の範囲】
【請求項１】
所定計算をそれぞれ行う複数の計算プロセスと複数の監視プロセスとを生成し、各監視プロセスが自身の直下に配置された監視プロセス及び計算プロセスを監視する監視の階層構造を形成する並列プログラムを実行可能な複数の計算ノードであって、各計算ノードが、前記計算プロセスが割り当てられたときに前記計算プロセスとして動作し、前記監視プロセスが割り当てられたときに前記監視プロセスとして動作する複数の計算ノードを含み、
前記監視プロセスが割り当てられた各計算ノードが、割り当てられた監視プロセスの配下の計算プロセスの総数の目標値である第１の目標値と、前記割り当てられた監視プロセスの直下に配置される監視プロセス及び計算プロセスの数の目標値である第２の目標値とに基づいて、前記監視の階層構造を変更する処理を行う
ことを特徴とする並列計算機システム。
【請求項２】
前記監視プロセスが割り当てられた各計算ノードは、前記監視の階層構造を変更する処理として、前記割り当てられた監視プロセスの直下の監視プロセスの生成及び消滅、並びに前記直下の監視プロセスの生成及び消滅に伴う計算プロセスの配置変更を制御する
請求項１に記載の並列計算機システム。
【請求項３】
前記監視プロセスが割り当てられた各計算ノードは、前記割り当てられた監視プロセスの配下の計算プロセスの総数が前記第１の目標値を超過するときに、前記第１の目標値を超過する数の計算プロセスの配置位置を前記割り当てられた監視プロセスの上位プロセスに該当する監視プロセスの直下に変更することを決定する
請求項１又は２に記載の並列計算機システム。
【請求項４】
前記監視プロセスが割り当てられた各計算ノードは、前記割り当てられた監視プロセスの直下に計算プロセスが配置されており、且つ直下に配置された監視プロセス及び計算プロセスの数が前記第２の目標値を超過しており、さらに前記割り当てられた監視プロセスの直下に配下プロセス数が前記第２の目標値を下回る配下の監視プロセスが存在するときに、前記配下の監視プロセスの配下プロセス数が前記第２の目標値を超えない範囲で前記割り当てられた監視プロセスの直下にある計算プロセスの配置位置を前記配下の監視プロセスの直下に変更することを決定する
請求項１から３のいずれか１項に記載の並列計算機システム。
【請求項５】
前記監視プロセスが割り当てられた各計算ノードは、前記割り当てられた監視プロセスの直下に配置された監視プロセスの数が前記第２の目標値を下回っているが、前記割り当てられた監視プロセスの直下に配置された監視プロセス及び計算プロセスの数が前記第２の目標値を上回る場合には、前記割り当てられた監視プロセスの直下に新たな監視プロセスを生成し、前記割り当てられた監視プロセスの直下にある計算プロセスの一部又は全部の配置位置を前記新たな監視プロセスの直下に変更することを決定する
請求項１から４のいずれか１項に記載の並列計算機システム。
【請求項６】
前記監視プロセスが割り当てられた各計算ノードは、前記割り当てられた監視プロセスの直下に配置された或る監視プロセスの直下にある計算プロセスの配置位置を前記割り当てられた監視プロセスの直下に変更しても当該割り当てられた監視プロセスの直下に配置される監視プロセス及び計算プロセスの数が前記第２の目標値を超えないときに、前記或る監視プロセスを終了させて前記或る監視プロセスの直下にある計算プロセスの配置位置を前記割り当てられた監視プロセスの直下に変更することを決定する
請求項１から４のいずれか１項に記載の並列計算機システム。
【請求項７】
前記監視プロセスが割り当てられた各計算ノードは、前記第１の目標値を前記割り当てられた監視プロセス向けに供給された第２の目標値で除して求めた値を、前記割り当てられた監視プロセスの直下に配置された監視プロセスにおける第２の目標値に決定する
請求項１から６のいずれか１項に記載の並列計算機システム。
【請求項８】
前記監視プロセスが割り当てられた各計算ノードは、前記割り当てられた監視プロセスの直下に配置された監視プロセスの数が前記第２の目標値を超過するときに、前記直下に配置された監視プロセスの数が前記第２の目標値以下となるように、前記直下に配置された監視プロセスのうちの一部を終了させることを決定する
請求項１から７のいずれか１項に記載の並列計算機システム。
【請求項９】
複数の計算ノードによって実行される、所定計算をそれぞれ行う複数の計算プロセスと複数の監視プロセスとを生成し、各監視プロセスが自身の直下に配置された監視プロセス及び計算プロセスを監視する監視の階層構造を形成するプロセス制御プログラムであって、
各計算ノードに対し、
前記計算プロセスが割り当てられたときに前記計算プロセスとして動作する処理と、
前記監視プロセスが割り当てられたときに前記監視プロセスとして動作し、割り当てられた監視プロセスの配下の計算プロセスの総数の目標値である第１の目標値と、前記割り当てられた監視プロセスの直下に配置される監視プロセス及び計算プロセスの数の目標値である第２の目標値とに基づいて、前記監視の階層構造を変更する処理と
を実行させるプロセス制御プログラム。
【請求項１０】
複数の計算ノードによって実行される、所定計算をそれぞれ行う複数の計算プロセスと複数の監視プロセスとを生成し、各監視プロセスが自身の直下に配置された監視プロセス及び計算プロセスを監視する監視の階層構造を形成する並列プログラムを実行可能な複数の計算ノードを含む並列計算機システムの制御方法であって、
各計算ノードが、
前記計算プロセスが割り当てられたときに前記計算プロセスとして動作し、
前記監視プロセスが割り当てられたときに前記監視プロセスとして動作し、割り当てられた監視プロセスの配下の計算プロセスの総数の目標値である第１の目標値と、前記割り当てられた監視プロセスの直下に配置される監視プロセス及び計算プロセスの数の目標値である第２の目標値とに基づいて、前記監視の階層構造を変更する処理を行う
ことを含む並列計算機システムの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、並列計算機システム，プロセス制御プログラム，及び並列計算機システムの制御方法に関する。
【背景技術】
【０００２】
従来、複数の計算ノードを含む並列計算機システムにて使用されるプログラムとして、マスタワーカ型並列プログラムがある。マスタワーカ型並列プログラムには、単階層マスタワーカ型並列プログラムと、多階層マスタワーカ型並列プログラムとがある。
【０００３】
単層型マスタワーカ型並列プログラムでは、当該並列プログラムで実行する計算タスクが複数のサブタスクに分割される。各サブタスクは、計算機クラスタに属する任意の計算ノード上で実行可能である。実行が開始されたサブタスクは、計算ノードの異常（例えば、計算ノードのハードウェア故障や、ソフトウェア故障など）が発生しない限り、有限時間で終了する。
【０００４】
或るサブタスクの実行が他のサブタスクの実行結果に依存する場合も存在する。例えば、サブタスクＡがサブタスクＢの実行結果に依存している場合、サブタスクＢの実行終了後、サブタスクＡの実行が開始される。互いに依存関係のないサブタスクについては、同時に（並列に）実行可能である。
【０００５】
単階層マスタワーカ型並列プログラムでは、１つのマスタプロセスと、複数個のワーカプロセスが生成される。これらのプロセスは、並列プログラムとして利用可能な計算ノード(計算クラスタ上の全計算ノードが利用できる場合、ジョブと呼ばれる単位が割り当て
られた計算ノードのみが利用可能な場合などが考えられる) 上に生成される。
【０００６】
マスタプロセスは、サブタスクの管理・実行制御を行う。ワーカプロセスは、マスタプロセスからの依頼を受け、サブタスクの実行を行う。マスタプロセスは、実行開始可能なサブタスクを検索し、ワーカプロセスに当該サブタスクを実行するように依頼する。依頼を受けたワーカプロセスは、サブタスクの実行を開始し、サブタスクの実行が終了すると、マスタプロセスに終了及び実行を通知する。マスタプロセスは実行結果の集計を行う。すべてのサブタスクの実行終了を以て、並列プログラムのタスクが終了する。
【０００７】
マスタプロセスは、ワーカプロセスの状態（動作）監視も行う。マスタプロセスは、定期的にワーカプロセスと通信するなどの方法によって、サブタスクが正常に実行されているかどうかを検知することができる。計算ノードの異常などの理由によってサブタスクが異常終了した場合には、マスタプロセスは、異常終了したサブタスクを実行していたワーカプロセスが異常状態にあると判断する。そして、マスタプロセスは、異常状態と判断したワーカプロセスを利用可能なワーカプロセスから除外する。このとき、マスタプロセスは、異常状態と判断したワーカプロセスで実行していたサブタスクの実行を他のワーカプロセスに依頼する。
【０００８】
多階層マスタワーカ型並列プログラムでは、１つのマスタプロセスと、固定された階層構造を有する複数個のサブマスタプロセスと、複数個のワーカプロセスが生成される。マスタプロセスは、ワーカプロセスを直接監視するのではなく、サブマスタプロセスを監視する。サブマスタプロセスは、自身の配下にあるワーカプロセスを監視する。このような形式で、ワーカプロセス全体の監視が行われる。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１１−１１８８９９号公報
【特許文献２】特開２００５−２４２９８６号公報
【特許文献３】特開２００３−２８０９３３号公報
【特許文献４】特開２００８−２４３２１６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
単階層マスタワーカ型並列プログラムでは、単一のマスタプロセスがすべてのワーカプロセスを監視する。このため、ワーカプロセスの数に比例してマスタプロセスの監視負荷が増加する。したがって、大規模なマスタワーカ型並列プログラムを実行しようとすると、マスタプロセスの監視コストが膨大となるおそれがあった。これに対し、多階層マスタワーカ並列プログラムでは、マスタプロセス及びサブマスタプロセスのそれぞれが直接監視するプロセス数が減る。このため、一つのプロセスが担う監視負荷を単階層マスタワーカ並列プログラムよりも低減することができる。
【００１１】
しかしながら、多階層マスタワーカ型並列プログラムにも、以下の問題があった。すなわち、単階層マスタワーカ型並列プログラムでは、サブタスクの実行に関わらないプロセスはマスタプロセスのみである。このため、実際の計算処理を行わない計算ノードはマスタプロセスを実行する１つの計算ノードだけである。これに対し、多階層マスタワーカ型並列プログラムでは、マスタプロセスだけでなくサブマスタプロセスもサブタスクを実行しない。このように、多階層マスタワーカ並列プログラムでは、単階層マスタワーカプログラムよりも実際の計算処理を行わない計算ノード数が多くなるため、計算ノードの利用効率（ノード利用効率）が低下する問題があった。
【００１２】
本開示の目的は、プロセスの監視負荷の低減を可能とし、かつ計算ノードの利用効率を高めることを可能とする技術を提供することにある。
【課題を解決するための手段】
【００１３】
本開示の一態様は、所定計算をそれぞれ行う複数の計算プロセスと複数の監視プロセスとを生成し、各監視プロセスが自身の直下に配置された監視プロセス及び計算プロセスを監視する監視の階層構造を形成する並列プログラムを実行可能な複数の計算ノードであって、各計算ノードが、前記計算プロセスが割り当てられたときに前記計算プロセスとして動作し、前記監視プロセスが割り当てられたときに前記監視プロセスとして動作する複数の計算ノードを含み、
前記監視プロセスが割り当てられた各計算ノードが、割り当てられた監視プロセスの配下の計算プロセスの総数の目標値である第１の目標値と、前記割り当てられた監視プロセスの直下に配置される監視プロセス及び計算プロセスの数の目標値である第２の目標値とに基づいて、前記監視の階層構造を変更する処理を行う
ことを特徴とする並列計算機システムである。
【発明の効果】
【００１４】
本開示によれば、プロセスの監視負荷の低減を可能とし、かつ計算ノードの利用効率を高めることが可能となる。
【図面の簡単な説明】
【００１５】
【図１】図１は、並列計算機システムの一例を示す。
【図２】図２は、計算ノードの構成例を示す。
【図３】図３は、“ワーカプロセス総数”が“１００００”であり、“直下の配下プロセス数”が２であるときの監視の階層構造を模式的に示す。
【図４】図４は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図５】図５は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図６】図６は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図７】図７は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図８】図８は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図９】図９は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図１０】図１０は、サブマスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【図１１】図１１は、サブマスタプロセス（マスタプロセスを含む）の処理にあたって使用されるパラメータを示すテーブルを示す図である。
【図１２】図１２は、サブマスタプロセス（マスタプロセス含む）の処理に当たってサブマスタプロセスが管理するリスト群のテーブルを示す図である。
【図１３】図１３は、マスタプロセスとして動作する計算ノード（ＣＰＵ）における処理を示すフローチャートである。
【発明を実施するための形態】
【００１６】
以下、図面を参照して本発明の実施形態について説明する。実施形態の構成は例示であり、本発明は実施形態の構成に限定されない。
【００１７】
＜並列計算機システムの構成例＞  
図１は、マスタワーカ型並列プログラム（以下、単に「並列プログラム」と表記する）を実行する並列計算機システムの構成例を示す。並列計算機システムは、複数の計算ノードＮがネットワーク（ＮＷ）を介して接続された計算機クラスタを含む。
【００１８】
図２は、計算ノードＮの構成例を示す図である。計算ノードＮは、プロセッサ及びメモリを含むコンピュータである。例えば、パーソナルコンピュータ（ＰＣ）のような汎用のコンピュータ或いは専用のコンピュータが適用される。但し、並列計算機システムは、複数のプロセッサ及びメモリが内部ネットワークで接続されることによって形成された計算機クラスタを含む１又は２以上のコンピュータであっても良い。各計算ノードＮは、他の計算ノードＮの通信用のアドレスを知っており（記憶装置上に記憶しており）、各計算ノードＮ間で通信可能となっている。
【００１９】
図２において、計算ノードＮは、バスＢを介して接続されたCentral Processing Unit
（ＣＰＵ）１１と、メモリ１２と、ネットワーク（ＮＷ）との通信インタフェース（通信ＩＦ）１３と、入出力装置（コンソール）１４を含む。ＣＰＵ１１は、プロセッサ（制御装置）の一例である。
【００２０】
メモリ１２は、不揮発性記憶媒体と、揮発性記憶媒体とを含む。不揮発性記憶媒体は、例えば、Read Only Memory（ＲＯＭ），ハードディスク，Solid State Drive（ＳＳＤ）
，ＥＥＰＲＯＭ，フラッシュメモリなどであり、ＣＰＵ１１によって実行されるプログラムや、プログラムの実行に際して使用されるデータを記憶する。プログラムには、並列プログラム（プロセス制御プログラム）が含まれる。揮発性記憶媒体は、例えばRandom Acc
ess Memory（ＲＡＭ）であり、ＣＰＵ１１の作業領域として使用される。メモリ１２は、「記憶装置」、「記憶媒体」の一例である。
【００２１】
通信ＩＦ６は、通信に係る信号変換、プロトコル変換を司る装置である。ＣＰＵ１１は、メモリ１２に記憶された並列プログラムをロードして実行することによって、以下に説明するマスタプロセス，サブマスタプロセス，ワーカプロセスの何れかとして動作する。本実施形態では、マスタプロセス，サブマスタプロセス，及びワーカプロセスのそれぞれは、１つの計算ノードＮ上で動作する。計算ノードＮ同士は、ネットワーク（ＮＷ）を介してメッセージをやりとりすることで、プロセス間通信を行う。
【００２２】
入出力装置１４は、キー，ボタン，ポインティングデバイス（マウス，タッチパネル等）等の少なくとも１つで形成される入力装置と、ディスプレイ装置（表示装置）とを含む。入力装置は、オペレータ（ユーザ）による情報の入力に使用される。ディスプレイ装置は、情報を表示する。
【００２３】
＜並列プログラム＞
次に、実施形態に係る並列プログラムについて説明する。並列プログラムでは、投入されたマスタワーカ型ジョブ（以下単に「ジョブ」という）を実行するための計算タスクが複数のサブタスクに分割される。計算タスクは、並列プログラムの実行によって行われる「処理」の一例であり、サブタスクは、「処理の一部」、「計算」の一例である。
【００２４】
また、並列プログラムの実行に使用される複数の計算ノードＮ上で、マスタプロセス，サブマスタプロセス，ワーカプロセスが生成される。各計算ノードＮは、マスタプロセス，サブマスタプロセス，ワーカプロセスとして動作する。以下の説明において、マスタプロセス，サブマスタプロセス，ワーカプロセスを区別しない場合には、単に「プロセス」と表記することもある。
【００２５】
マスタプロセスは、サブタスクの管理及び実行制御を行う。すなわち、マスタプロセスは、ジョブの実行中の各時点で実行可能となったサブタスクを検索及び選択し、ワーカプロセスを生成する（ワーカプロセスを計算ノードＮに割り当てる）。ワーカプロセスは、選択されたサブタスクを実行し、実行結果をマスタプロセスに返す。ワーカプロセスは、実行結果の返却後、終了（消滅）する。サブマスタプロセスは、サブマスタプロセス自身の配下とされたワーカプロセスの管理（状態の監視（異常検出）、実行結果の受領など）を行う。
【００２６】
本実施形態に係る並列プログラムでは、マスタプロセス及びサブマスタプロセスによる監視の階層構造が形成される。すなわち、マスタプロセスを頂点として、階層構造を有する複数のサブマスタプロセスのツリーが形成される。マスタプロセス及び各サブマスタプロセスは、サブマスタプロセス及びワーカプロセスを直下の配下プロセス（子プロセス）として持つことができ、直下の配下プロセスを管理（監視）する。マスタプロセス及びサブマスタプロセスのそれぞれは、「監視プロセス」の一例であり、ワーカプロセスは「計算プロセス」の一例である。
【００２７】
本実施形態に係る並列プログラムでは、監視負荷の低減及び計算ノード利用効率の向上を図ることができるように、プロセス監視構造（監視の階層構造）の動的な変更が行われる。すなわち、本実施形態では、ジョブの実行中において、サブマスタプロセスの生成及び消滅に係る処理と、サブマスタプロセス間でのワーカプロセス管理権の委譲（階層構造におけるワーカプロセスの配置位置の変更）に係る処理とが実行される。
【００２８】
複数の計算ノードＮを計算資源としてジョブが割り当てられるとき、ジョブを実行可能
な計算ノードＮの群（計算ノード群）と、当該計算ノード群の使用時間とが決定される。このとき、ジョブが要求する計算資源の大きさに応じて、複数の計算ノードＮの全てがジョブに割り当てられることもあれば、複数の計算ノードＮの一部がジョブに割り当てられることもある。ジョブの実行中において、ジョブに割り当てられた計算ノード群をなす各計算ノードＮは、プロセスの割り当てに応じて、マスタプロセス，サブマスタプロセス，ワーカプロセスのいずれかとして動作することができる。
【００２９】
ジョブの実行中において、同時に（並列に）動作するワーカプロセスの個数は、計算タスクに係る計算の進捗によって常に変化し続ける。また、ワーカプロセスの個数に応じて、好適と考えられるマスタプロセス及びサブマスタプロセスによって形成される監視の階層構造は変化する。
【００３０】
例えば、監視対象のプロセス数が多いほど、監視に必要な計算資源やワーカプロセスで生じた異常の検出時間が増加する。さらに、ワーカプロセス数が膨大な場合では、監視に必要な計算資源の割り当てが行えない場合があり得る。ワーカプロセスの異常検出のための処理時間が増加する場合には、異常発生状態からの復帰処理や、サブタスク終了時の結果回収処理の即時性が低下する。逆に、監視用の階層数を増やした場合、ジョブの実行に利用可能な計算資源のうち、ワーカプロセスが利用可能な計算資源の割合が減少してしまう。
【００３１】
そこで、マスタプロセス及びサブマスタプロセスのそれぞれが直下の配下プロセスすべての死活判断（消滅させるか否か）に要する時間は、判断対象となるプロセス数に対して単調非減少であると仮定する。また、或る上位プロセスが下位に存する１つの配下プロセスを監視するために必要な時間は、当該配下プロセスが階層構造のどの位置に属するかに依存せず、ほぼ一定値であるとする。
【００３２】
上記のような仮定の下で、ジョブ実行中の各時点で存在するマスタプロセス及びサブマスタプロセスについて、直下の配下プロセス数ができるだけ均一になるように各サブマスタプロセスに対してサブマスタプロセス及びワーカプロセスが配置されれば、より効率的な監視が図られると考えられる。
【００３３】
なぜなら、直下の配下プロセス数が不均一であると、以下の問題が生じる。すなわち、サブマスタプロセスが周期的、或いは定期的な監視を行う場合において、或るサブマスタプロセスＸの配下のワーカプロセス数が他のサブマスタプロセスの配下のワーカプロセス数より多いと、サブマスタプロセスＸの監視処理の時間が他のサブマスタプロセスの監視処理の時間より長くなる。
【００３４】
例えば、サブマスタプロセスＸの監視対象の配下プロセス数が３であるのに対し、他のサブマスタプロセスの全ての直下の配下プロセスが２である場合を仮定する。この場合、１つの配下プロセスに対する監視処理の時間が一定値であると、サブマスタプロセスＸの監視処理の時間が他のサブマスタプロセスにおける監視処理の時間よりも長くなる。
【００３５】
この結果、１回のサブマスタプロセス全体の監視処理に要するトータルの時間が、サブマスタプロセスＸにおける監視処理の時間に引きずられて長くなってしまう。このような監視処理の長期化を回避するために、本実施形態に係る並列プログラムでは、直下の配下プロセス数が均一となるようにプロセス（サブマスタプロセス，ワーカプロセス）の配置が行われる。
【００３６】
或るプロセスの直下に存在する配下プロセスの個数が均一である場合、監視の階層構造を決定するパラメータは、（１）“ワーカプロセス総数”と、（２）“直下の配下プロセ
ス数”との２つとなる。階層の深さ(マスタプロセスとワーカプロセスとの間に存在する
サブマスタプロセスの数) は、上記２つのパラメータに依存して決定される。
【００３７】
本実施形態では、各サブマスタプロセスに対し、“配下のワーカプロセス総数（配下ワーカプロセス総数）”の目標値、及び、“直下の配下プロセス数”の目標値が通知される。通知を受けたサブマスタプロセスは、自身が管理するパラメータが通知された目標値以下となるように、サブマスタプロセス自身及びサブマスタプロセス自身の直下にある配下プロセス（サブマスタプロセス，ワーカプロセス）を制御する。配下ワーカプロセス総数の目標値は、「第１の目標値」の一例であり、直下の配下プロセス数の目標値は、「第２の目標値」の一例である。
【００３８】
各階層における“配下ワーカプロセス総数”の目標値は、ジョブ実行の各時点での“ワーカプロセス総数”と、“サブマスタプロセスの階層の深さ”とにより、自動的に決定することができる。例えば、サブマスタプロセス自身がマスタプロセスから数えてｎ（ｎは自然数）番目（ｎ階層目）のサブマスタプロセスである場合には、ワーカプロセスの総数をサブマスタプロセス自身の直下の配下プロセス数のｎ乗で割った数(小数点以下切り上
げ) で計算することができる。但し、上記計算において、マスタプロセスは０番目と数えられる。
【００３９】
図３は、例として、“ワーカプロセス総数”が“１００００”であり、“直下の配下プロセス数”が“２”であるときの監視の階層構造を模式的に示す。このケースでは、ｎ番目のサブマスタプロセスへの設定値（“配下ワーカプロセス総数”の目標値）は、１００００／２ｎ(小数点以下は切り上げ)で計算することができる。
【００４０】
すなわち、１番目（第１層）のサブマスタプロセスへの設定値は５０００、２番目（第２層）のサブマスタプロセスへの設定値は２５００, ... となる。１４番目（第１４層）以降は、設定値が１となる。後述するサブマスタプロセスでの処理に従えば、設定値が１のサブマスタプロセスは生成されないか消滅するので、上述したケースにおける“サブマスタプロセスの階層の深さ”は１３段となる。そして、第１３層に位置する各サブマスタプロセスの配下に１又は２のワーカプロセスが配置される。
【００４１】
“直下の配下プロセス数”の目標値として、マスタワーカ型ジョブの実現方法に応じた値が設定される。一般に、単一のマスタプロセス又はサブマスタプロセスが短時間で多くの直下の配下プロセスの監視を行うことが可能な場合には、当該目標値として大きな値を設定することが可能である。
【００４２】
“直下の配下プロセス数”の目標値の設定方法に制限はなく、ユーザが入出力装置１４を用いてマニュアルで設定してもよく、所定のアルゴリズムで自動的に設定されるようにしても良い。“直下の配下プロセス数”は、ジョブの実行中において固定的に使用されても良いが、ジョブの実行中に動的に変更されるようにしても良い。動的な変更も、マニュアルや所定アルゴリズムで実施することができる。
【００４３】
さらに、実施形態に係る並列プログラムでは、マスタプロセス及びサブマスタプロセスは、以下のような処理を行う。
（１）マスタプロセスは、ジョブ実行中の各時点において実行可能となったサブタスクを選択し、ワーカプロセスを生成し、生成したワーカプロセスに選択したサブタスクを実行させる。
【００４４】
（２）マスタプロセスは、“配下ワーカプロセス総数”の目標値および“直下の配下プロセス数”の目標値をマスタプロセスの配下プロセスに通知する。通知を受けたサブマス
タプロセスは、さらに配下のサブマスタプロセスに対し（存在する場合）、上記目標値の通知を行う。このようにして、サブマスタプロセスは、各目標値を配下のサブマスタプロセスに伝搬する。これによって、各目標値は、全てのサブマスタプロセスに伝搬される。但し、“配下ワーカプロセス総数”の目標値は、配下のサブマスタプロセスに適した値に更新される。
【００４５】
（３）目標値を通知されたサブマスタプロセスは、自プロセス（サブマスタプロセス自身）の“配下プロセス総数”が目標値を超過している場合には、サブマスタプロセス自身の上位プロセス（マスタプロセス、サブマスタプロセス）に対し、超過した分のワーカプロセスの管理を委譲する。管理を委譲された上位プロセス（上位のサブマスタプロセス）は、以下の処理を行う。すなわち、上位のサブマスタプロセスは、上位のサブマスタプロセス自身の直下のサブマスタプロセスであって、“配下ワーカプロセス総数”が目標値を下回っているサブマスタプロセスが存在すれば、当該サブマスタプロセスに超過分のワーカプロセスの管理を委譲する。このとき、管理を委譲可能な配下のサブマスタプロセスが存在しない場合には、管理を委譲されたサブマスタプロセスはさらに上位のサブマスタプロセスに管理を委譲する。
【００４６】
（４）サブマスタプロセスは、“配下サブマスタプロセス総数”は目標値以下であるが、“直下の配下プロセス数”が目標値を超過する場合には、サブマスタプロセス自身の直下にサブマスタプロセスを生成する。そして、サブマスタプロセスは、生成したサブマスタプロセスに超過分のワーカプロセスの管理を委譲する。
【００４７】
（５）或るサブマスタプロセスＡにおいて、サブマスタプロセスＡの配下にあるサブマスタプロセスＢの配下にあるワーカプロセスをサブマスタプロセスＡの配下に変更してもサブマスタプロセスＡが管理する“直下の配下プロセス数”を超過しない場合がある。この場合、当該サブマスタプロセスＡは、サブマスタプロセスＢの配下にあるワーカプロセスをサブマスタプロセスＡの配下に変更し、変更した配下プロセスの管理をサブマスタプロセスＡに委譲させる。このとき、サブマスタプロセスＢは、自発的な終了処理、または上位プロセスからの指示に従って終了する。
【００４８】
＜サブマスタプロセスにおける処理＞    
次に、サブマスタプロセスの処理例について説明する。図４〜図１０は、各サブマスタプロセスの処理例を示すフローチャートである。図１１は、サブマスタプロセス（マスタプロセスを含む）の処理にあたって使用されるパラメータを示すテーブルを示す図であり、図１２は、サブマスタプロセス（マスタプロセス含む）の処理に当たってサブマスタプロセスが管理するリスト群のテーブルを示す図である。
【００４９】
図４〜図１０に示す処理は、上記（３）〜（５）に示したサブマスタプロセスの具体的な処理内容を示す。フローチャートに示す処理は、サブマスタプロセスとして動作する計算ノードＮのＣＰＵ１１によって実行される。図１１に示すパラメータ及び図１２に示すリスト群は、サブマスタプロセスとして動作する計算ノードＮのメモリ１２に記憶される。
【００５０】
図１１において、サブマスタプロセス（マスタプロセス）として動作する計算ノードＮのメモリ１２には、パラメータとして、“num_child”，“num_descendant”，及び“num_child_descendant”が記憶される。“num_child”は、サブマスタプロセス（マスタプロセス）自身の直下の（子の）配下プロセスの数の目標値である。“num_child”は、「第
２の目標値」の一例である。
【００５１】
“num_descendant”は、マスタプロセス及び各サブマスタプロセスにおいて、その時点
で実行されている（または実行を開始しようとしている）配下ワーカプロセス総数を示し、配下のワーカプロセスの増減に応じて増減する値である。
【００５２】
“num_descendant”の値は、マスタプロセス及び各サブマスタプロセスで独自に計算される。マスタプロセスにおいては、新たにワーカプロセスを生成し、空き状態の計算ノードＮにワーカプロセスによるサブタスクの実行を依頼したときに、マスタプロセス自身が管理する“num_descendant”の値を増加させる。一方、マスタプロセスは、下位プロセスからワーカプロセスの終了通知を受信した場合に、マスタプロセス自身が管理する“num_descendant”の値を増加させる。
【００５３】
これに対し、サブマスタプロセスにおいては、上位プロセスからワーカプロセスの管理権が委譲された場合に、サブマスタプロセス自身が管理する“num_descendant”の値を増加させる。一方、サブマスタプロセスは、下位プロセスからワーカプロセスの終了通知を受信した場合に、サブマスタプロセス自身が管理する“num_descendant”の値を減少させる。
【００５４】
“num_child_descendant”は、サブマスタプロセス（マスタプロセス）の直下の（子の）サブマスタプロセスの配下のワーカプロセス総数の目標値を示す変数である。“num_child_descendant”は、「第１の目標値」の一例である。
【００５５】
図１２において、サブマスタプロセス（マスタプロセス）として動作する計算ノードＮのメモリ１２には、リスト群として、ワーカリスト“worker_list”と、サブマスタリス
ト“submaster_list”と、消滅サブマスタリスト“dead_submaster_list”とが記憶され
る。
【００５６】
ワーカリスト“worker_list”は、サブマスタプロセス自身の直下に配置されたワーカ
プロセスのリストである。サブマスタプロセスは、ワーカリストに登録された各ワーカプロセスに対する管理（監視など）を行う。ワーカリストには、サブマスタプロセスの直下に位置する各ワーカプロセスの情報（識別情報、属性情報など）が情報要素（要素ともいう）として登録される。図１２の例では、各ワーカプロセスａ，ｂ，ｃ・・・の情報が”worker_a”, “worker_b” “worker_c”,..として登録されている。
【００５７】
サブマスタリスト“submaster_list”は、サブマスタプロセス自身の直下に配置されたサブマスタプロセスのリストである。サブマスタリストは、情報要素として、直下にある各サブマスタプロセスに関する情報を含む。当該情報には、例えば、サブマスタプロセスの識別情報や、サブマスタプロセスの配下ワーカプロセスの数（子孫ワーカプロセス数）などが含まれる。子孫ワーカプロセス総数は、後述する処理において増減する。図１２の例では、各サブマスタプロセスａ，ｂ，ｃ・・・の情報が”sub_a”, “sub_b” “sub_c”,..として登録されている。
【００５８】
消滅サブマスタリスト“dead_submaster_list”は、サブマスタプロセス自身の配下の
サブマスタプロセスであって、終了（消滅）を決定したサブマスタプロセス（消滅サブマスタプロセス）のリストである。消滅サブマスタリストには、情報要素として、各消滅サブマスタプロセスの情報（サブマスタリストに登録されていた情報）が記憶される。図１２の例では、各サブマスタプロセスｘ，ｙ，ｚ・・・の情報が”sub_x”, “sub_y” “sub_z”,..として登録されている。
【００５９】
図４において、処理が開始されると、最初の００１において、サブマスタプロセス（ＣＰＵ１１）は、初期設定を行う。初期設定として、サブマスタプロセスは、メモリ１２に記憶された “num_child”及び “num_descendant”の各値を０に設定する。また、サブ
マスタプロセスは、ワーカリスト“worker_list”，サブマスタリスト“submaster_list
”及び消滅サブマスタリスト“dead_submaster_list”を空（ヌル）に設定する。
【００６０】
次の００２では、サブマスタプロセスは、ワーカリスト，サブマスタリスト，消滅サブマスタリストの各要素数がそれぞれ０（リストが空）であるか、又は親プロセスからのリクエストが受信可能か否かを判定する。００２の条件が満たされる場合には（００２，ＹＥＳ）、処理が００３に進み、条件が満たされない場合には（００２，ＮＯ）、処理が００９に進む。
【００６１】
ここに、“worker_list.length”は、ワーカリストの要素数であり、サブマスタプロセス自身の直下にあるワーカプロセス数を示す。“submaster_list.length”は、サブマス
タリストの要素数であり、サブマスタプロセスの直下にあるサブマスタプロセス数を示す。“dead_submaster_list.length”は、消滅サブマスタリストの要素数であり、消滅サブマスタプロセスの数を示す。要素数は、例えば、ＣＰＵ１１が各リストに記憶された要素数を計数することで得られる。要素数は、事前に算出してリスト中に記憶しておき、００２で参照するようにしても良い。
【００６２】
次の００３では、サブマスタプロセスは、親プロセスからのリクエストを含むメッセージが到来するまで処理を待機する状態となる。リクエストが受信されると、サブマスタプロセスは、当該リクエストを変数“recev_req”（親プロセスから来たリクエストの内容
）に代入する。
【００６３】
次の００４では、サブマスタプロセスは、変数“recev_req”に代入されたリクエスト
がサブマスタプロセス自身の「終了通知」であるか否かを判定する。このとき、リクエストが「終了通知」であれば（００４，ＹＥＳ）であれば、処理が００５（図５）に進む。これに対し、「終了通知」でなければ、処理が００８に進む。
【００６４】
００５では、サブマスタプロセスは、サブマスタリスト“submaster_list”に登録されている配下のサブマスタプロセスの全てに対して「終了通知」を送信する。サブマスタプロセス自身の終了に伴い、配下のサブマスタプロセスも終了させるためである。
【００６５】
次の００６において、サブマスタプロセスは、サブマスタリスト“submaster_list”に登録されている配下のサブマスタプロセスから終了レスポンスを受信する。すると、サブマスタプロセスは、当該終了レスポンスを送信したサブマスタプロセスをサブマスタリストから取り除く。このとき、サブマスタプロセスは、終了レスポンスを含むメッセージを適宜の手法で親プロセスに送信する。
【００６６】
次の００７で、サブマスタプロセスは、終了通知を送信した全てのサブマスタプロセスからの終了レスポンスを受信すると、親プロセスに対して終了通知（親からの終了通知に対する終了レスポンス）を送り、サブマスタプロセス自身を終了する。これにより、サブマスタプロセスは消滅する。
【００６７】
このように、サブマスタプロセスは、親プロセスから「終了通知」を受信した場合には、サブマスタプロセス自身の直下のサブマスタプロセスを終了させて、親プロセスに終了の報告を行った後に消滅する。なお、直下のサブマスタプロセスも、配下のサブマスタプロセスがあれば、終了通知を送信する（００４、００５）。結果として、或るサブマスタプロセスが消滅するときには、そのサブマスタプロセスが位置する階層より下位に位置する配下の（子孫の）サブマスタプロセスも消滅する。
【００６８】
図４に戻って、００４から００８に処理が進んだ場合、すなわち、「終了通知」以外の
リクエストが受信された場合には、００８において、次の処理が実行される。サブマスタプロセスは、メモリ１２に記憶された“num_child”の値を、リクエストで指定された直
下の配下プロセス数の目標値“recv_req.num_child”に設定（更新）する。また、サブマスタプロセスは、メモリ１２に記憶された “num_descendant”の値を、リクエストで指
定された“num_descendant”の値“recv_req.num_descendant”に設定（更新）する。
【００６９】
さらに、サブマスタプロセスは、リクエストに含まれたワーカリストを、サブマスタプロセス自身のワーカリストに追加する（worker_list.push(recv_req.worker_list)）。“worker_list.push”は、リクエスト中のワーカリストをサブマスタプロセスのワーカリストに追加する関数である。ワーカリストに登録されたワーカプロセスが、当該サブマスタプロセスの直下にある監視対象のワーカプロセスに該当する。ワーカリストの追加は、ＣＰＵ１１がリクエスト中の各ワーカプロセスの情報をメモリ１２上のワーカリストに要素として登録することで行われる。
【００７０】
次の００９以降で、サブマスタプロセスは、配下プロセス数の監視処理を行う。００９では、サブマスタプロセスは、サブマスタリスト“submaster_list”に登録されている配下サブマスタプロセスの情報を、子孫ワーカプロセスの数（各サブマスタプロセスの配下のワーカプロセスの総数）について昇順（少ない順）にソートする。００９の処理が終了すると、処理が０１０へ進む。なお、００９において、サブマスタリストがヌルであれば、そのまま０１０へ進む。
【００７１】
次の０１０（図６）では、サブマスタプロセスは、“num_child_descendant”の値を算出する。すなわち、サブマスタプロセスは、メモリ１２の“num_descendant”の値を メ
モリ１２の“num_child”の値で除した値を“num_child_descendant”として設定する（
メモリ１２に記憶する）。ここで、“div_ceil()”は、小数点以下を切り上げる除算を行うことを意味する。上記除算の結果として、小数点以下を切り上げた値が設定される。０１０の処理が、上述した“ワーカプロセス総数／（直下の配下プロセス数）ｎ”の演算に相当し、“num_child_descendant”の値が、直下のサブマスタプロセスに通知される「第１の目標値」となる。
【００７２】
次の０１１では、サブマスタプロセスは、サブマスタプロセス自身の直下にあるサブマスタプロセス数“submaster_list.length”がサブマスタプロセスの直下の配下プロセス
数の目標値“num_child”より大きいか否か（目標値を超過しているか否か）を判定する
。このとき、直下のサブマスタプロセス数が目標値を超過している場合（０１１，ＹＥＳ）には、処理が０１２に進み、そうでない場合（０１１，ＮＯ）には、処理が０１４（図７）に進む。
【００７３】
なお、０１１において、サブマスタリストが空（ヌル）であれば、“submaster_list.length”の値は０として扱われ、処理が０１４に進む。以降の処理においても、サブマス
タリストがヌルであれば、“submaster_list.length”の値は０として扱われる。
【００７４】
０１２では、サブマスタプロセスは、目標値“num_child”を超過したサブマスタプロ
セスを消滅させるために、サブマスタリスト“submaster_list”の先頭に登録されたサブマスタプロセス（０番目のサブマスタプロセス：submaster_list[0]）に対し、「終了通
知」を送信する。
【００７５】
次の０１３では、サブマスタプロセスは、サブマスタリスト“submaster_list”から０番目の要素（先頭の要素）を取り除き、消滅サブマスタリスト“dead_submaster_list”
に追加する。「終了通知」の送信先に該当するサブマスタプロセスからのレスポンスの待ち受けに使用するためである。
【００７６】
その後、処理が０１１に戻り、サブマスタプロセスは、再び直下のサブマスタプロセス数が目標値“num_child”を超過しているか否かを判定する。このとき、未だ目標値を超
過している場合には、サブマスタリストの先頭（submaster_list[0]）に対する０１２及
び０１３の処理が実行される。このようにして、サブマスタプロセス自身の直下のサブマスタプロセス数が目標値“num_child”以下になるまで、０１１〜０１３のループ処理が
繰り返される。
【００７７】
処理が図７の０１４に進んだ場合には、サブマスタプロセスは、サブマスタプロセス自身の直下にあるサブマスタプロセスの数“submaster_list.length”とサブマスタプロセ
ス自身の直下にあるワーカプロセスの数“worker_list.length”との和（直下の配下プロセス数（子プロセス数））を求める。サブマスタプロセスは、求めた直下の配下プロセス数が、サブマスタプロセス自身の直下の配下プロセス数の目標値“num_child”以下か否
かを判定する。このとき、直下の配下プロセス数が目標値を上回るとき（０１４，ＮＯ）には、処理が０２２（図８）に進む。これに対し、直下の配下プロセス数が目標値以下のとき（０１４，ＹＥＳ）には、処理が０１５に進む。
【００７８】
０１５では、サブマスタプロセスは、ループカウンタｉの値を０に設定する。また、サブマスタプロセスは、変数“new_num_child”として、現在の直下の配下プロセス数“worker_list.length＋submaster_list.length”を設定する。
【００７９】
０１６〜０２１の処理では、サブマスタリストのｉ番目（最初は先頭）から順に直下のサブマスタプロセスの配下プロセス数を検査する。サブマスタプロセスは、直下のサブマスタプロセスの配下ワーカプロセス数が所定条件を満たせば、当該サブマスタプロセスを消滅させる。さらに、サブマスタプロセスは、当該サブマスタプロセスの配下のワーカプロセスの配置位置をサブマスタプロセス自身の直下に引き上げる。
【００８０】
具体的に説明すると、０１６では、サブマスタプロセスは、ループカウンタｉの値が直下のサブマスタプロセス数“submaster_list.length”より小さいか否かを判定する。こ
のとき、ｉの値が直下のサブマスタプロセス数より小さいとき（０１６，ＹＥＳ）には、処理が０１７に進み、そうでないとき（０１６，ＮＯ）には、処理が０３３（図１０）に進む。当該処理は、サブマスタリストのｉ番目（最初は先頭（＝０））のサブマスタプロセスから順に、リスト中の全サブマスタプロセスについて０１７〜０２１のループ処理を行うことを意味する。以下、サブマスタリストにおけるｉ番目の要素（サブマスタプロセス）を“サブマスタプロセス[ｉ]”と表記する。
【００８１】
０１７では、サブマスタプロセスは、現在の直下の配下プロセス数“new_num_child”
とサブマスタプロセス[ｉ]の子孫のワーカプロセス総数“submaster_list[i].num_descendant”との和から１を減じたものを算出する。そして、サブマスタプロセスは、算出した値がサブマスタプロセス自身の直下の配下プロセス数の目標値“num_child”以下か否か
を判定する。このとき、算出値が目標値以下であれば（０１７，ＹＥＳ）、処理が０１８に進み、そうでなければ（０１７，ＮＯ）、処理が０２１に進む。
【００８２】
０１７の処理によって、現在の直下の配下プロセス数にサブマスタプロセス[ｉ]の配下ワーカプロセス総数を加えても目標値“num_child”を超えないか否かが検査される。目
標値を超えないことは、当該サブマスタプロセス[ｉ]の配下ワーカプロセスの管理を上位プロセスに委譲（移管）しても問題ない（目標値以下に収まる）ことを意味する。なお、上記算出値の算出において減じられる１は、管理権の委譲（ワーカプロセスの配置変更）に伴い消滅させるサブマスタプロセスの数を表している。
【００８３】
０１８では、サブマスタプロセスは、サブマスタプロセス[ｉ]に対して「終了通知」を送信する。次の０１９では、サブマスタプロセスは、サブマスタリストからｉ番目の要素（サブマスタプロセス[ｉ]）を取り除き、消滅サブマスタリスト“dead_submaster_list
”に追加する。
【００８４】
次の０２０では、現在の直下の配下プロセス数“new_num_child”に、サブマスタプロ
セス[ｉ]の子孫プロセス数からサブマスタプロセス[ｉ]の数（１）を減じたもの“（submaster_list[i].num_descendant）−１”を加える。
【００８５】
次の０２１では、サブマスタプロセスは、サブマスタリストにおいて次のサブマスタプロセスを指すようにループカウンタｉの値を設定する。その後、処理が０１６に戻る。その後、サブマスタリストの残りのサブマスタプロセスがあれば、０１７〜０２１の処理が実行される。
【００８６】
サブマスタリスト中の全てのサブマスタプロセスについて０１７〜０２１の処理が終了すると、０１６にてＮＯの判定がなされ、処理が０３３（図１０）に進む。なお、０１７の処理においてＮＯの判定がなされた場合には、以降の処理を終了して、処理が０３３に進むようにしても良い。
【００８７】
０２２（図８）に処理が進むと、サブマスタプロセスは、ループカウンタｉの値を０に設定する。次の０２３では、サブマスタプロセスは、ループカウンタｉの値が直下のサブマスタプロセス数“submaster_list.length”より小さいか否かを判定する。このとき、
ｉの値が直下のサブマスタプロセス数より小さいとき（０２３，ＹＥＳ）には、処理が０２４に進み、そうでないとき（０２３，ＮＯ）には、処理が０２９（図９）に進む。
【００８８】
以下の０２４〜０２８では、サブマスタプロセスは、自プロセスの直下のサブマスタプロセスに空きがあれば、当該サブマスタプロセスに自プロセスの直下のワーカプロセスの管理権を委譲する（配置変更を行う）ためのループ処理を実行する。
【００８９】
具体的には、０２４では、サブマスタプロセス[ｉ]の配下ワーカプロセス総数“submaster_list[i].num_descendant”が、サブマスタプロセス自身の直下のサブマスタプロセスの配下ワーカプロセス総数の目標値“num_child_descendant”未満であるかが判定される。このとき、サブマスタプロセス[ｉ]の配下ワーカプロセス総数が目標値未満であれば（０２４，ＹＥＳ）、処理が０２５に進み、そうでなければ（０２４，ＮＯ）、処理が０２８へ進む。
【００９０】
０２５へ処理が進むことは、サブマスタプロセス[ｉ]にさらなるワーカプロセスを管理する余裕があることを意味する。次の０２５では、サブマスタプロセスは、目標値“num_child_descendant”から“submaster_list[i].num_descendant”を減じた値を求める。この減算値は、サブマスタプロセス[ｉ]に対してさらに割り当て可能なワーカプロセスの数（余裕の数）を意味する。
【００９１】
サブマスタプロセスは、サブマスタプロセス自身の直下にあるワーカプロセスの数“worker_list.length”が上記の減算値以上であるか否かを判定する。このとき、ワーカプロセスの数が減算値以上であれば（０２５，ＹＥＳ）、処理が０２６に進み、そうでなければ（０２５，ＮＯ）、処理が０２７に進む。
【００９２】
０２６では、サブマスタプロセスは、ワーカリスト“worker_list”から、上記減算値
（余裕の数）と同数のワーカプロセスを取り除き、サブマスタプロセス[ｉ]に割り当てる。このとき、サブマスタプロセスは、サブマスタプロセス[ｉ]の子孫ワーカプロセス数を
割り当てたワーカプロセスの数だけ増加させる。その後、処理が０２８に進む。０２６の処理により、サブマスタプロセス[ｉ]の直下にある配下ワーカプロセス数が目標値“num_child_descendant”となる。
【００９３】
これに対し、０２７に処理が進んだ場合には、サブマスタプロセスは、ワーカリストにある全てのワーカプロセス（サブマスタプロセス自身の直下にある配下のワーカプロセスの全て）をサブマスタプロセス[ｉ]に割り当てる。サブマスタプロセス[ｉ]にある余裕の数がサブマスタプロセスの直下のワーカプロセス数より多いからである。このとき、サブマスタプロセスは、サブマスタプロセス[ｉ]の子孫ワーカプロセス数を割り当てたワーカプロセスの数だけ増加させる。その後、処理が０２８に進む。
【００９４】
０２８では、サブマスタプロセスは、サブマスタリストにおける次のサブマスタプロセスを指すようにｉの値を設定する。その後、処理が０２３に戻る。サブマスタプロセスの直下にある全てのサブマスタプロセスに関する０２４〜０２８の処理が終了すると、０２３にてＮＯの判定がなされ、処理が０２９（図９）に進む。
【００９５】
０２９では、サブマスタプロセスは、サブマスタプロセス自身の直下にあるサブマスタプロセスの数“submaster_list.length”がサブマスタプロセス自身の直下の配下プロセ
ス数の目標値“num_child”未満であるか否かを判定する（条件１）。また、サブマスタ
プロセスは、サブマスタプロセス自身の直下のプロセス数（submaster_list.length＋worker_list.length）が目標値“num_child”より大きいかを判定する（条件２）。
【００９６】
このとき、条件１及び条件２が共に満たされるとき（０２９，ＹＥＳ）には、処理が０３０に進み、そうでない場合（０２９，ＮＯ）には、処理が０３３（図１０）に進む。０３０に処理が進むことは、サブマスタプロセスの直下の配下プロセス数が目標値を超過している一方で、サブマスタプロセス自身の直下に新たなサブマスタプロセスを作成する余裕があることを意味する。
【００９７】
０３０では、サブマスタプロセスは、新たなサブマスタプロセスを作成する。次の０３１では、ワーカリスト（worker_list）からサブマスタプロセス自身の直下のサブマスタ
プロセスの配下ワーカプロセス総数の目標値（num_child_descendant）と同数のワーカプロセスを取り除き、新たなサブマスタプロセスに割り当てる（管理権を委譲する）。このとき、サブマスタプロセスは、新たなサブマスタプロセスの子孫ワーカプロセス数として、割り当てたワーカプロセスの数を設定する。
【００９８】
０３２では、サブマスタプロセスは、サブマスタリストの要素として、新たなサブマスタプロセスの情報をサブマスタリストに追加する。その後、サブマスタプロセスは、処理を０２９に戻す。０２９において再び条件１及び条件２が満たされる場合には（０２９，ＹＥＳ）、０３０〜０３２の処理が実行される。これに対し、０２９にてＮＯの判定がなされた場合には、処理が０３３（図１０）に進む。
【００９９】
０３３では、サブマスタプロセス自身の配下プロセスに送信するリクエストを生成する。すなわち、サブマスタプロセスは、“num_child”の送信リクエスト“send_req.num_child”として、サブマスタプロセス自身の直下の配下プロセス数の目標値“num_child”を設定する。また、サブマスタプロセスは、“num_descendant”の送信リクエスト“send_req.num_descendant”として、０１０で算出されメモリ１２に記憶した“num_child_descendant”の値を設定する。
【０１００】
さらに、サブマスタプロセスは、“worker_list”の送信リスト“send_req.worker_list”として、これまでの処理においてサブマスタプロセスと紐づけられた（サブマスタプ
ロセスに割り当てられた）ワーカプロセスの情報を設定する。
【０１０１】
次の０３４では、サブマスタリスト（submaster_list）中の各要素、すなわち、サブマスタリストに登録された各サブマスタプロセスに対して０３３で生成したリクエストを含むメッセージを送信する。但し、送信されるリクエストの内容は、各サブマスタプロセスに対するワーカプロセスの割り当て状況によって相違する。
【０１０２】
０３５では、サブマスタプロセスは、サブマスタリストの要素に該当するサブマスタプロセス、消滅サブマスタリストの要素に該当するサブマスタプロセスからのレスポンスを含むメッセージが到着していれば、当該レスポンスを受信する。レスポンスが終了レスポンスである場合には、サブマスタプロセスは、当該終了レスポンスの送信元のサブマスタプロセスを、サブマスタリスト又は消滅サブマスタリストから取り除く。
【０１０３】
また、サブマスタプロセスは、レスポンスの内容にワーカプロセスの情報（配下プロセスから管理が委譲されたワーカプロセスの管理情報）が含まれる場合には、当該ワーカプロセスの情報をワーカリストに追加する。また、サブマスタプロセスは、レスポンスにワーカプロセスによるサブタスクの実行結果が含まれる場合には、当該結果を結果リスト（result_list）に追加する。
【０１０４】
０３６では、サブマスタプロセスに到着したレスポンスとして、ワーカリスト中の要素に該当するワーカプロセスが終了レスポンス及びサブタスクの実行結果を受け取った場合には、サブマスタプロセスは、当該ワーカプロセスの情報をワーカリストから取り除くとともに、実行結果を結果リストに追加する。このように、マスタプロセスから依頼された処理の実行が終了したワーカプロセスは消滅したものとして扱われる。
【０１０５】
サブマスタプロセスは、ワーカプロセスの情報をワーカリストから取り除く場合には、サブマスタリストを参照し、当該ワーカプロセスを直下に有していたサブマスタプロセスの子孫ワーカプロセス数を減らす。このとき、サブマスタプロセスは、“num_descendant”の値を減少させる。
【０１０６】
０３７では、サブマスタプロセスは、サブマスタプロセス自身の親プロセス（サブマスタプロセス又はマスタプロセス）に結果リストの内容を送信する。結果リストの内容は、最終的にマスタプロセスに到達し、マスタプロセスはサブタスクの実行結果を集計する。
【０１０７】
また、サブマスタプロセスは、自プロセスの子孫ワーカプロセス数（配下ワーカプロセス数）が目標値“num_descendant”を超過している場合には、超過分の数に相当するワーカプロセスの情報をワーカリストから取り除く。取り除いた情報は、親プロセス（サブマスタプロセス又はマスタプロセス）に送信する。親プロセス（上位のサブマスタプロセス）において、ワーカリストから取り除かれた情報は、親プロセスのワーカリストに追加され、親プロセスの直下のワーカプロセスとして扱われる。０３７の処理が終了すると、処理が００２（図４）に戻る。
【０１０８】
＜マスタプロセスにおける処理＞  
マスタプロセスは、これまでに説明したサブマスタプロセスが有する機構に加え、サブタスクを選択する機構とワーカプロセスを生成する機構とを備えたプロセスである。サブマスタプロセスは、マスタプロセスによって生成されたワーカプロセスの管理権を受け取るだけであるが、マスタプロセスは、自らワーカプロセスを生成し、マスタプロセス自身の直下の配下にすることができる。
【０１０９】
マスタプロセスの具体的な処理は、図４〜図１０に示したサブマスタプロセスの処理と
ほぼ同様である。但し、以下の点で、サブマスタプロセスの処理と異なる。図１３は、マスタプロセスの処理例を示すフローチャートである。すなわち、図１３に示すように、図４の００２に相当する００２Ａにおいて、マスタプロセスは、「親プロセスからのリクエストが受信可能か」の判定に代えて、「新規のサブタスクが実行可能か否か」の判定を行う。このとき、新規のサブタスクが実行可能であれば（００２Ａ，ＹＥＳ）、００３Ａにおいて、実行可能なサブタスクについてワーカプロセスを生成する。
【０１１０】
次の００４Ａでは、マスタプロセスは、全てのサブタスクが終了したか否かの判定を行う。このとき、全てのサブタスクが終了している場合には（００４Ａ，ＹＥＳ）、マスタプロセスは、図５の００５〜００７の処理を実行し、処理を終了する。但し、マスタプロセスの上位プロセスは存在しない。このため、マスタプロセスは、００６における親プロセスへの終了レスポンスの転送や００７における親プロセスへの終了通知送信は行わない。
【０１１１】
００４Ａにおいて、全てのサブタスクが終了していない場合には（００４Ａ，ＮＯ）、マスタプロセスは、００８Ａにて、以下の処理を行う。すなわち、“num_child”の値と
して、上位プロセスから通知された値ではなく、マニュアル操作や所定アルゴリズムで設定された（メモリ１２に予め記憶されている）“直下の配下プロセス数”の値を“num_child”に設定する。また、マスタプロセスは、００３Ａにて生成したワーカプロセスの数
（ワーカプロセス総数）を“num_descendant”の値に設定する。さらに、００３Ａにて生成したワーカプロセスの情報をワーカリストに追加する。その後、処理が００９に進む。
【０１１２】
以上の処理を除き、マスタプロセスは、図６〜図１０に示したサブマスタプロセスの処理と同じ処理を行う。このため、詳細な説明は省略する。マスタプロセスは、００８Ａで設定した“num_child”及び “num_descendant”を用いて“num_child_descendant”を算出する（図６の０１０）。また、マスタプロセスは、００３Ａにて生成したワーカプロセスの数が“num_child”を上回っていれば、直下にサブマスタプロセスを生成する（図９
，０３０）。このとき、マスタプロセスは、該サブマスタプロセスに“num_child_descendant”の数のワーカプロセスを割り当てる（０３１）。
【０１１３】
さらに、マスタプロセスは、当該サブマスタプロセスに対して“num_child”及び “num_descendant”（０１０で算出した“num_child_descendant”）及びワーカリストのリクエストを送信（通知）する（図１０の０３３，０３４）。これによって、マスタプロセスの直下のサブマスタプロセスは、図４の００３でリクエストを受信することができる。さらに、直下のサブマスタプロセスは、００８で“num_child”及び“num_descendant”の
設定並びにワーカリストの追加を行うことができ、以降の処理を行うことが可能となる。
【０１１４】
＜並列プログラム実行時の動作＞  
ジョブを実行する並列プログラムの実行に際しては、例えば、ジョブ実行の開始時点での初期設定として、ジョブが割り当てられた複数の計算ノードＮ上で、マスタプロセスと、必要な数のサブマスタプロセス及びワーカプロセスが生成され、各計算ノードＮに割り当てられる。
【０１１５】
すなわち、ジョブ実行開始に当たり、或る計算ノードＮ上にマスタプロセスが生成され、マスタプロセスが開始時点で実行可能なサブタスクを選択し、ワーカプロセスを生成する（他の計算ノードにワーカプロセスを割り当て、実行を依頼する）（図１１，００３Ａ）。当該ワーカプロセスとして動作する計算ノードＮは、サブタスクを実行する。
【０１１６】
マスタプロセスは、ワーカプロセスの生成に係る処理を繰り返して、ジョブ実行開始時点でのワーカプロセス総数（例えば１００００）を求める（図１１，００３Ａ）。マスタ
プロセスは、予め設定された（メモリ１２に記憶された）「直下の配下プロセス数」（例えば２）を用いて、マスタプロセスの直下の（子の）各サブマスタプロセスに対する配下ワーカプロセス総数“５０００”を求める（図６，０１０）。
【０１１７】
マスタプロセスは、「直下の配下プロセス数＝２」に従って、２つのサブマスタプロセスを生成する（他の計算ノードＮにサブマスタプロセスを割り当てて当該サブマスタプロセスの実行を依頼する）（図８，０２２〜０２８のループ）。そして、マスタプロセスは５０００のワーカプロセスの管理（監視）を、各サブマスタプロセスに依頼する（図１０，０３３，０３４）。
【０１１８】
マスタプロセスの直下に位置する（マスタプロセスの子プロセスに該当する）各サブマスタプロセス（第１層）は、図４〜図１０に示した処理を行う。このとき、サブマスタプロセスは、００３（図４）において、マスタプロセスからリクエストを受信する。リクエストの内容は、“num_child=２”，“num_descendant＝５０００”，“worker_list（５
０００個分のワーカプロセスのリスト）”である。各サブマスタプロセスは、０１０（図６）において、“num_child_descendant＝２５００”を求める。そして、各サブマスタプロセスは、０２９〜０３２のループ（図９）において、サブマスタプロセス自身の直下に２つのサブマスタプロセス（第２層）を生成する（０３０）。マスタプロセスは、２５００個分のワーカプロセスの管理権を、各配下のサブマスタプロセス（第２層）に委譲する（０３１）。
【０１１９】
０３３及び０３４（図１０）で、リクエストが直下のサブマスタプロセスのそれぞれとして動作予定の計算ノードＮに送られ、各計算ノードＮがサブマスタプロセス（第２層）として動作することで、サブマスタプロセス（第２層）が動作する。生成された第２層のサブマスタプロセスは、図４〜図１０に示した処理を実行することで、さらに、配下に２つのサブマスタプロセス（第３層）を持つ状態となる。このような動作が繰り返されることで、図３に示したようなサブマスタプロセスの階層構造が形成されていく。このとき、ワーカプロセスの管理権は、下層のサブマスタプロセスに委譲される。
【０１２０】
第１３層の各サブマスタプロセスに通知される目標値は、“num_child＝２”，“num_descendant＝２”であり、ワーカリスト“worker_list”には、１個又は２個のワーカプロセスの情報が含まれた状態となる。この場合、０２９（図９）の条件は満たされないのでＮＯの判定がなされる。従って、第１４層のサブマスタプロセスは生成されず、第１３層に位置するサブマスタプロセス（８１９２個）が１００００個のワーカプロセスのうちの１個又は２個を監視する状態となる（図３参照）。
【０１２１】
０２２〜０２８の処理によって、マスタプロセス及び各サブマスタプロセスは、直下にサブマスタプロセスを生成してワーカプロセスの管理（監視）を依頼するので、自身の監視負荷を軽減（低減）することができる。そして、ワーカプロセスが最下層のサブマスタプロセスに配置された時点で、マスタプロセス及び各サブマスタプロセスが負担する監視コスト（監視対象のプロセス数）は目標値の２個以下に納まるので、各プロセスの監視コストを均一に分散することができる。すなわち、トータルの監視時間の長期化を抑えることができる。これは、ジョブ実行の高速化に貢献する。
【０１２２】
サブマスタプロセスは、図４〜図１０に示した処理の実行において、図６の０１１〜０１３のループ処理や、図７の０１４〜０２１の処理を実行することで、サブマスタプロセスを終了させることができる。これによって、サブマスタプロセスの終了によって空き状態となった計算ノードＮをワーカプロセスの実行に使用することができる。よって計算ノードの利用効率を高めることが可能となる。
【０１２３】
生成されたワーカプロセスがサブタスクを実行することで、ジョブの実行が進む。ワーカプロセスはサブタスクの実行が終了すると、実行結果を上位プロセス（サブマスタプロセス，マスタプロセス）に返却し、消滅する。一方、マスタプロセスは、未実行のサブタスク（例えば、或るサブタスクの実行結果を利用するサブタスク）が実行可能となると、当該サブタスクを実行するためのワーカプロセスを生成し、当該サブタスクを実行させる。
【０１２４】
このように、ジョブ実行の進行に伴い、複数の計算ノードＮ上に存在するワーカプロセスの総数は変化する。マスタプロセスは、適宜のタイミングにおいて、ワーカプロセス総数の変化に伴い更新した“num_descendant”を含むリクエストを下位プロセスに送信することができる。典型的には、マスタプロセスは、新たなワーカプロセスを生成した場合、当該ワーカプロセスをマスタプロセス自身の直下に配置し、“num_child”の値に従って
、当該ワーカプロセスの配置位置を下位プロセスに移動させる。或いは、ワーカプロセスの減少に基づき、階層数が減少するように更新した“num_descendant”を含むリクエストを下位プロセスに送信する。
【０１２５】
これによって、ジョブの実行に使用される計算ノード群のうち、マスタプロセス及びサブマスタプロセスが割り当てられた計算ノードＮの割合をワーカプロセスが割り当てられた計算ノードＮの割合より小さくすることができ、計算ノードＮが効率的に利用されている状態を維持することができる。また、新規のワーカプロセスのために計算ノードを空けておくことができる。  
【０１２６】
或いは、マスタプロセスは、ワーカプロセスの増減に応じて、適宜のタイミングで更新した“num_child”の値を含むリクエストを下位プロセスに送信することができる。例え
ば、ワーカプロセス数の減少に伴い“num_child”の値を増加させたり、ワーカプロセス
数の増加に伴い“num_child”の値を減少させたりすることができる。この場合でも、マ
スタプロセス及びサブマスタプロセスが監視する（直下に配置される）プロセス数は、マスタプロセス及びサブマスタプロセス間で均等となるので、監視コストの均一化が維持される。
【０１２７】
実施形態では、マスタプロセス，サブマスタプロセス，及びワーカプロセスによって形成される階層構造は、マスタプロセス及びサブマスタプロセスのそれぞれとして動作する複数の計算ノードＮのメモリ１２にて分散管理される。
【０１２８】
上述したように、マスタプロセス及びサブマスタプロセスは、直下の配下のプロセス（サブマスタプロセス，ワーカプロセス）の情報を、ワーカリスト“worker_list”，及び
サブマスタリスト“submaster_list”（図１２）で管理する。ワーカリスト“worker_list”，及びサブマスタリスト“submaster_list”は、マスタプロセスとして動作する計算
ノードＮ，サブマスタプロセスとして動作する計算ノードＮのそれぞれのメモリ１２に記憶される。
【０１２９】
マスタプロセス及びサブマスタプロセスのそれぞれは、自プロセスの直下にサブマスタプロセスを生成することができる。当該生成は、マスタプロセス又はサブマスタプロセスとして動作する計算ノードＮが空き状態の計算ノードＮに新たにサブマスタプロセスとして動作することを依頼することで行われる。マスタプロセスとして動作する計算ノードＮにおいて、他の各計算ノードＮのアドレスは既知である。このとき、マスタプロセス又はサブマスタプロセスを管理するサブマスタリスト（メモリ１２）の情報要素に新たなサブマスタプロセスの情報が追加される。これによって、階層構造が変更される。
【０１３０】
また、新たなサブマスタプロセスを生成したマスタプロセス又はサブマスタプロセスと
して動作する計算ノードＮ（ＣＰＵ１１）は、新たなサブマスタプロセスが管理するワーカプロセスの情報を送る。新たにサブマスタプロセスとして動作する計算ノードＮのＣＰＵ１１は、例えば、上記依頼の送信元アドレスから、新たなサブマスタプロセスの上位プロセスの存在位置を認識することができる。また、当該ＣＰＵ１１は、ワーカプロセスの情報をメモリ１２上のワーカリスト（図１２）に追加する。これによって、ワーカプロセスの配置位置が、上位プロセスから直下のサブマスタプロセスへ変更されたこととなる。
【０１３１】
マスタプロセス又はサブマスタプロセスとして動作する計算ノードＮ（ＣＰＵ１１）は、直下のサブマスタプロセスを消滅させる場合に、当該直下のサブマスタプロセスとして動作する計算ノードＮに終了通知を送信し、メモリ１２に記憶されたサブマスタリスト（図６）から、終了対象のサブマスタプロセスの情報を削除する。これによって、サブマスタプロセスが階層構造から消滅した状態となる。但し、消滅させるサブマスタプロセスへ終了通知を送ってから、その応答が受信されるまでの間は、当該サブマスタプロセスの情報が消滅サブマスタリスト（図１２）に登録される。
【０１３２】
さらに、サブマスタプロセスとして動作する計算ノードＮは、当該サブマスタプロセスの直下のワーカプロセスの位置を上位プロセスの直下に移動させる場合には、移動対象のワーカプロセスの情報を、上位プロセスとして動作する計算ノードＮに送る。このとき、当該計算ノードＮは、移動対象のワーカプロセスの情報をメモリ１２のワーカリスト（図１２）から削除する。一方、ワーカプロセスの情報を受信した計算ノードＮは、メモリ１２に記憶されたワーカリスト（図１２）にワーカプロセスの情報を追加する。これによって、ワーカプロセスの配置位置が上位プロセスへ変更される。このとき、例えば、ワーカプロセスの上位プロセスとして動作する計算ノードＮがワーカプロセスとして動作する計算ノードＮに通知を行うことで、当該計算ノードＮは、上位プロセスのアドレスを知ることができ、ワーカプロセスの終了時に、上位プロセスに終了通知を送ることができるようになる。終了通知を受けた上位プロセスのＣＰＵ１１は、終了通知に対応するワーカプロセスの情報をメモリ１２のワーカリストから削除する。これによって、階層構造から当該ワーカプロセスが消滅した状態となる。
【０１３３】
以上のように、各計算ノードＮは、通知や依頼の送信元のアドレスをメモリ１２で管理することで、階層構造上の上位プロセスを認識することができる。各計算ノードＮは、直下の配下のサブマスタプロセス及びワーカプロセスの情報をメモリ１２に記憶したサブマスタリスト及びワーカリストで管理する。そして、各計算ノードＮは、ワーカプロセスの情報を計算ノードＮ間でやりとりすることで、階層構造におけるワーカプロセスの配置位置を変更することができる。また、マスタプロセス又はサブマスタプロセスとして動作する各計算ノードＮが自ノードのメモリ１２に記憶されたサブマスタリストを更新する。これによって、階層構造上で、サブマスタプロセスが新たに発生したり、消滅したりする。
【０１３４】
実施形態によれば、マスタプロセス及びサブマスタプロセスのそれぞれ（監視プロセス）において、配下ワーカプロセスの総数の目標値（第１の目標値）と直下の配下プロセス数の目標値（第２の目標値）とに基づいて、監視の階層構造を変更する処理が実行される。これによって、ジョブ実行中に変化するワーカプロセス数に応じて、プロセス監視の即応性とノード利用効率のトレードオフ関係を考慮し、より良いプロセスの階層構造を維持することが可能となる。換言すれば、監視負荷を抑え且つ計算ノードの利用効率の向上を図ることができる。従って、並列計算機システムにおける計算資源の効率的な利用や、効率的な資源割当によるジョブ実行の高速化を図ることができる。
【符号の説明】
【０１３５】
Ｎ・・・計算ノード
１１・・・ＣＰＵ
１２・・・メモリ
１３・・・通信インタフェース
【図１】
2015222476.tif 000003
【図２】
2015222476.tif 000004
【図３】
2015222476.tif 000005
【図４】
2015222476.tif 000006
【図５】
2015222476.tif 000007
【図６】
2015222476.tif 000008
【図７】
2015222476.tif 000009
【図８】
2015222476.tif 000010
【図９】
2015222476.tif 000011
【図１０】
2015222476.tif 000012
【図１１】
2015222476.tif 000013
【図１２】
2015222476.tif 000014
【図１３】
2015222476.tif 000015