(57)【特許請求の範囲】
【請求項１】
単一の計算資源に対し、現在時刻より未来の第１の時刻に割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザに予め設定された資源配分の比に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
制御部を有することを特徴とする並列演算装置。
【請求項２】
前記制御部は、
算出した前記度合いと、現在時刻における前記各々のユーザの優先度とに基づいて、前記第１の時刻における前記各々のユーザの優先度を算出し、
算出した前記第１の時刻における前記各々のユーザの優先度に基づいて、前記複数のユーザから前記第１の時刻における計算資源を割り当てるジョブを有するユーザを決定することを特徴とする請求項１に記載の並列演算装置。
【請求項３】
前記制御部は、
前記第１の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が前記第１の時刻にあるか否かを判断し、
判断した判断結果に基づいて、前記ユーザが有するジョブに前記第１の時刻における計算資源を割り当てることを決定することを特徴とする請求項２に記載の並列演算装置。
【請求項４】
前記制御部は、
前記第１の時刻にあると判断した場合、前記第１の時刻または前記第１の時刻より未来の第２の時刻のいずれかの時刻における計算資源を割り当てるジョブを有するユーザを決定する際に用いる前記ユーザの優先度を上昇させる度合いと、現在時刻における前記ユーザの優先度と、前記第１の時刻における計算資源を割り当てることにより前記ユーザの優先度を低下させる度合いとに基づいて、前記いずれかの時刻における前記ユーザの優先度を算出することを特徴とする請求項３に記載の並列演算装置。
【請求項５】
前記制御部は、
前記第１の時刻にないと判断した場合、前記第１の時刻より未来の第２の時刻における前記各々のユーザの優先度に基づいて、前記複数のユーザから前記第２の時刻における計算資源を割り当てるジョブを有するユーザを決定することを特徴とする請求項３または４に記載の並列演算装置。
【請求項６】
前記制御部は、
前記第１の時刻における計算資源を割り当てることを決定したユーザが前記第２の時刻における計算資源を割り当てることを決定したユーザとは異なる場合、前記第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が前記第１の時刻にあるか否かを判断し、
判断した判断結果に基づいて、前記第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブに前記第１の時刻における計算資源を割り当てることを決定することを特徴とする請求項５に記載の並列演算装置。
【請求項７】
複数のプロセッサを有する並列演算システムであって、
前記複数のプロセッサのいずれかのプロセッサは、
現在時刻より未来の第１の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザに予め設定された資源配分の比に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
ことを特徴とする並列演算システム。
【請求項８】
コンピュータに、
単位時間が経過することにより複数のユーザの各々のユーザに予め設定された資源配分の比に応じて前記各々のユーザの優先度を上昇させる度合いを記憶する記憶部から前記度合いを読み出し、
現在時刻より未来の第１の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、読み出した前記度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
処理を実行させることを特徴とするジョブ制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列演算装置、並列演算システム、およびジョブ制御プログラムに関する。
【背景技術】
【０００２】
従来、複数のユーザからプロセッサの計算資源を割り当てるジョブを有するユーザを決定する際に用いる複数のユーザの各々のユーザの優先度を、時間経過に応じて上昇させる技術がある。関連する先行技術として、例えば、ジョブの計算資源への割り当てに応じ、ユーザごとの単位時間あたりの計算資源の利用可能量に応じた回復率に基づいて、時間経過に応じて優先度を上昇させるものがある。また、ユーザの予約履歴からユーザが予約を確定できる日時を算出し、履歴の多いユーザほど権利行使の日時から予約を確定できる日時までの期間を短期化することで、予約を獲得する機会を全ユーザに平均的に与える技術がある。また、ジョブの予測処理時間と入力された期限条件とに基づいてジョブの実行に要するポイントを算出し、算出したポイントに基づいて、ジョブの登録者の情報を更新する技術がある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−２７７０４１号公報
【特許文献２】特開２００４−２９５４７８号公報
【特許文献３】特開２００６−４８２７５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来技術によれば、現在時刻における各々のユーザの優先度を用いて未来時刻における計算資源をユーザが有するジョブに割り当てると、各々のユーザの資源配分を反映させて未来時刻における計算資源を割り当てることができない場合がある。具体的には、未来時刻における計算資源を割り当てる際、時間が経過していないので、各々のユーザの優先度を単位時間が経過することにより各々のユーザの資源配分に応じて上昇させることが考慮されず、各々のユーザの資源配分を反映させることができなくなる。
【０００５】
１つの側面では、本発明は、各々のユーザの資源配分を反映させて未来時刻における計算資源をユーザが有するジョブに割り当てることが可能になる並列演算装置、並列演算システム、およびジョブ制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一側面によれば、単一の計算資源に対し、現在時刻より未来の第１の時刻に割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザに予め設定された資源配分の比に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する並列演算装置、並列演算システム、およびジョブ制御プログラムが提案される。
【発明の効果】
【０００７】
本発明の一態様によれば、各ユーザの資源配分を反映させて未来時刻における計算資源を各ユーザが有するジョブに割り当てることが可能になるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、本実施の形態にかかる並列演算装置１０１の動作例を示す説明図である。
【図２】図２は、並列演算システム２００のハードウェア構成例を示すブロック図である。
【図３】図３は、管理ノード２０１のハードウェアの一例を示すブロック図である。
【図４】図４は、管理ノード２０１の機能構成例を示すブロック図である。
【図５】図５は、フェアシェア予約値により未来時刻の資源配分を行う際の一例を示す説明図である。
【図６】図６は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例を示す説明図（その１）である。
【図７】図７は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例を示す説明図（その２）である。
【図８】図８は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例を示す説明図（その３）である。
【図９】図９は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例を示す説明図（その４）である。
【図１０】図１０は、フェアシェア予約値の更新一覧の例を示す説明図である。
【図１１】図１１は、フェアシェア値により未来時刻の資源配分を行う際の一例を示す説明図である。
【図１２】図１２は、フェアシェア予約値制御処理手順の一例を示すフローチャートである。
【図１３】図１３は、フェアシェア値更新処理手順の一例を示すフローチャートである。
【図１４】図１４は、ジョブ割り当て処理手順の一例を示すフローチャート（その１）である。
【図１５】図１５は、ジョブ割り当て処理手順の一例を示すフローチャート（その２）である。
【図１６】図１６は、ユーザ選択処理手順の一例を示すフローチャートである。
【図１７】図１７は、フェアシェア予約値リスト初期化処理手順の一例を示すフローチャート（その１）である。
【図１８】図１８は、フェアシェア予約値リスト初期化処理手順の一例を示すフローチャート（その２）である。
【図１９】図１９は、フェアシェア予約値リスト更新処理手順の一例を示すフローチャートである。
【図２０】図２０は、イベント待ち処理手順の一例を示すフローチャート（その１）である。
【図２１】図２１は、イベント待ち処理手順の一例を示すフローチャート（その２）である。
【発明を実施するための形態】
【０００９】
以下に図面を参照して、開示の並列演算装置、並列演算システム、およびジョブ制御プログラムの実施の形態を詳細に説明する。
【００１０】
図１は、本実施の形態にかかる並列演算装置１０１の動作例を示す説明図である。並列演算装置１０１は、複数のユーザの各々のユーザが有するジョブに計算資源を割り当てるコンピュータである。例えば、並列演算装置１０１は、単一のプロセッサを有する計算機に対して、計算資源としてプロセッサを専有する時間をユーザが有するジョブに割り当てる。また、並列演算装置１０１は、複数のプロセッサを有する計算機に対して、計算資源として、プロセッサを専有する時間＊プロセッサの数をユーザが有するジョブに割り当てる。複数のプロセッサを有する計算機は、コアが複数搭載されたプロセッサを含む計算機でもよいし、シングルコアのプロセッサが並列されたプロセッサ群を含む計算機でもよいし、シングルコアのプロセッサを含む計算機が複数あってもよい。
【００１１】
また、単一または複数の演算装置を有する計算機は、並列演算装置１０１であってもよいし、他の装置であってもよい。他の装置としては、例えば、クラスタ化したパーソナル・コンピュータであってもよい。図１の記載では、説明を単純化するため、並列演算装置１０１が、シングルコアのプロセッサであるＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）が２つ並列されたプロセッサ群である場合を例に挙げて説明する。
【００１２】
また、ジョブとは、ユーザから見た処理の単位を示す。ジョブと似たような概念として、プログラムの実行単位であって、固有のメモリ空間を有するプロセスや、プログラムの実行単位であって、同一プロセスに属するもの同士でメモリ空間を共有するスレッド等がある。従って、並列演算装置１０１は、複数のジョブとして、複数のスレッドや複数のプロセスに計算資源を割り当ててもよい。
【００１３】
次に、ジョブに計算資源を割り当てる処理について説明する。ジョブを割り当てるジョブスケジューラは、ユーザの操作等によって投入されたジョブを、投入順序や予め決められた静的優先度によって並び変える。ここで、静的優先度は、ユーザの間の優先度である。そして、ジョブスケジューラは、ユーザの静的優先度に基づいて並び替えたジョブ順に、ジョブの要求する計算資源の空きを探して割り当てる。
【００１４】
ここで、静的優先度だけに従ってジョブを割り当てると、静的優先度の高いユーザが有するジョブや、あるユーザによって先に投入されたジョブによって計算資源が専有されてしまうことがある。そこで、ジョブスケジューラは、運用中に随時更新されるユーザの動的優先度を用いてジョブを割り当てる。具体的には、ジョブスケジューラは、ユーザが現在利用中の計算資源の量が多い場合や、現在実行中のジョブの実行時間が長い場合には、該当のユーザの動的優先度を低下させ、他のユーザの動的優先度を相対的に高くするように設定する。
【００１５】
動的優先度は、値が大きいほどユーザが有するジョブの割り当てを優先することを示してもよいし、値が小さいほど優先することを示してもよい。そして、動的優先度は、具体的な数値でもよいし、「高の高」、「高の中」、「高の低」、「中の高」、「中の中」、「中の低」、「低の高」、「低の中」、「低の低」のような階級であってもよい。
【００１６】
ここで、動的優先度を用いて現在時刻より未来の未来時刻の計算資源をジョブに割り当てて、ジョブの割り当てを予約することが考えられる。未来時刻の計算資源をジョブに割り当てることを、以下、単に、「未来割り当て」と呼称する場合がある。未来割り当てを行うことにより、例えば、未来時刻の中で動的優先度の高いジョブを割り当てていない空きの計算資源を特定することができる。そして、動的優先度の高いジョブの実行開始を遅延させないように、特定した空きの計算資源を動的優先度の低いジョブに割り当てるという、「バックフィル」と呼ばれる技術を行うことができる。また、未来割り当てを行うことにより、未来割り当てを行ったジョブを有するユーザに、ジョブの終了時刻を通知することができる。
【００１７】
しかしながら、現在時刻における各々のユーザの優先度を用いて未来時刻における計算資源をユーザが有するジョブに割り当てると、各々のユーザの資源配分を反映させて未来時刻における計算資源を割り当てることができない場合がある。具体的には、未来時刻における計算資源を割り当てる際、時間が経過していないので、各々のユーザの優先度を単位時間が経過することにより各々のユーザの資源配分に応じて上昇させることが考慮されず、各々のユーザの資源配分を反映させることができなくなる。また、各々のジョブに割り当てられた計算資源の量を監視することは、ジョブやプロセッサの個数が増加するにつれて困難なものになる。ここで、各々のユーザの資源配分を反映させたい理由としては、例えば、各々のユーザの資源配分を、ユーザＡが計算機を利用するために支払った金額と、ユーザＢが計算機を利用するために支払った金額との比率に近づけたいことがあげられる。
【００１８】
そこで、本実施の形態にかかる並列演算装置１０１は、単位時間が経過することにより各々のユーザの資源配分に応じて各々のユーザの優先度を上昇させる度合いに、現在時刻と未来時刻の差分を掛けた値を、未来時刻の計算資源の割当時に用いる値として算出する。これにより、並列演算装置１０１は、各々のユーザの資源配分を反映させて、未来時刻の資源配分を適正にすることができる。
【００１９】
ここで、各々のユーザの動的優先度を単位時間が経過することにより各々のユーザの資源配分に応じて上昇させる度合いは、ユーザの動的優先度が数値である場合、１より大きい値であって、ユーザの動的優先度に乗算する値である。また、この上昇させる度合いは、０より大きい値であって、ユーザの動的優先度に加える値でもよい。
【００２０】
例えば、動的優先度が、「高の高」、…、「低の低」のような階級であるとする。そして、ユーザＡ、Ｂの現在時刻における動的優先度がともに「低の低」であるとする。そして、上昇させる度合いを、ユーザＡが２階級であり、ユーザＢが１階級であるとする。
【００２１】
このとき、並列演算装置１０１は、現在時刻から３単位時間後の未来の時刻におけるユーザＡの動的優先度を上昇させる度合いを、ユーザＡの回復倍率２＊３単位時間＝６段階と算出する。そして、並列演算装置１０１は、現在時刻から３単位時間後の未来の時刻におけるユーザＡの動的優先度を、「低の低」から６段階あげた「高の低」に決定する。
【００２２】
同様に、並列演算装置１０１は、現在時刻から３単位時間後の未来の時刻におけるユーザＢの動的優先度を上昇させる度合いを、ユーザＢの回復倍率１＊３単位時間＝３段階と算出する。そして、並列演算装置１０１は、現在時刻から１単位時間後の未来の時刻におけるユーザＢの動的優先度を、「低の低」から３段階あげた「中の低」に決定する。そして、並列演算装置１０１は、現在時刻から３単位時間後の未来の時刻の計算資源を割り当てるユーザを、未来の時刻におけるユーザＡ、Ｂの優先度に基づいて決定する。
【００２３】
以下の説明では、現在時刻における動的優先度として、「フェアシェア値」と呼ばれる値を用いる場合について説明する。フェアシェア値は、フェアシェア初期値を上限としており、フェアシェア初期値よりも大きくなることはない値である。また、フェアシェア値は負の値となってもよい。フェアシェア値は、値が大きいほど優先してユーザが有するジョブを割り当てることを示す値である。そして、未来時刻における動的優先度を、以下、「フェアシェア予約値」と呼称する。また、各々のユーザが有するジョブに計算資源が割り当てられることによるユーザのフェアシェア値を低下させる度合いを、以下、「フェアシェア使用量」と呼称する場合がある。
【００２４】
そして、単位時間が経過することにより各々のユーザの資源配分に応じた各々のユーザの優先度を上昇させる度合いは、単位時間が経過することにより各ユーザで共通として優先度を上昇させる値に、各々のユーザの資源配分に応じた倍率を掛けたものとする。以下、単位時間が経過することにより各ユーザで共通として優先度を上昇させる値を、以下、「単位時間当たりの回復値」と呼称する。また、各々のユーザの資源配分に応じた倍率を、「ユーザの回復倍率」と呼称する。また、単位時間当たりの回復値とユーザの回復倍率とを掛けた値を、「単位時間当たりのユーザの回復値」と呼称する。
【００２５】
図１を用いて、並列演算装置１０１の処理を説明する。図１に示す並列演算装置１０１は、ＣＰＵ＃１とＣＰＵ＃２とを有する。また、並列演算装置１０１は、ユーザＡが有するジョブとユーザＢが有するジョブとを実行するものとする。また、符号１０２で示すように、ユーザＡの回復倍率とユーザＢの回復倍率との比を、２：１とする。従って、図１では、ユーザＡに割り当てられる計算資源が、ユーザＢに割り当てられる計算資源の２倍に近づくことを目標とする。
【００２６】
ここで、図１の例では、ユーザＡが有するジョブは、複数あってもよいし、単一のジョブを何度も実行するものでもよいし、単一のジョブを同時に実行するものでもよい。ユーザＢが有するジョブも同様であるとする。そして、ジョブの１回の実行の際には、ジョブは、１００秒×１ＣＰＵ＝１００の計算資源を要求するものとする。また、説明の簡略化のため、ユーザＡのフェアシェア値とユーザＢのフェアシェア値とが同値である場合、並列演算装置１０１は、ユーザＢが有するジョブに優先して計算資源を割り当てるものとする。
【００２７】
また、単位時間当たりの回復値を、０．５とする。従って、単位時間当たりのユーザＡの回復値は、１となる。また、単位時間当たりのユーザＢの回復値は、０．５となる。また、図１の例では、現在時刻ｔ０におけるユーザＡのフェアシェア値が３００であり、ユーザＢのフェアシェア値が２５０であるとする。図１では、現在時刻および未来時刻における計算資源の割り当てを、フェアシェア予約値を用いて行う例を示す。現在時刻におけるフェアシェア予約値は、フェアシェア値と同一の値を有する。
【００２８】
図１に示すグラフ１０３は、フェアシェア予約値に従って各々のユーザが有するジョブに計算資源を割り当てた際のフェアシェア予約値の時系列変化を示す。また、枠１０４は、計算資源を模式したものである。グラフ１０３の横軸は、時刻を示す。グラフ１０３の縦軸は、フェアシェア予約値を示す。また、グラフ１０３は、ユーザＡのフェアシェア予約値の時系列変化を実線で示すとともに、ユーザＢのフェアシェア予約値の時系列変化を破線で示す。
【００２９】
現在時刻ｔ０＝０［秒］において、並列演算装置１０１は、ユーザＡのフェアシェア予約値が３００であり、ユーザＢのフェアシェア予約値が２５０であるため、ユーザＡが有するジョブに時刻ｔ０における計算資源を割り当てることを決定する。そして、時刻ｔ０には、ユーザＡが有するジョブが要求する計算資源があるため、並列演算装置１０１は、ユーザＡが有するジョブに、ＣＰＵ＃２の０〜１００［秒］を割り当てることを決定する。そして、並列演算装置１０１は、時刻ｔ０以降におけるユーザＡのフェアシェア予約値を１００減じる。例えば、並列演算装置１０１は、時刻ｔ０におけるユーザＡのフェアシェア予約値を、３００−１００＝２００とする。
【００３０】
新たなジョブに計算資源を割り当てる際には、並列演算装置１０１は、また現在時刻から割り当てが可能かを判断する。現在時刻ｔ０＝０［秒］において、並列演算装置１０１は、ユーザＡのフェアシェア予約値が２００であり、ユーザＢのフェアシェア予約値が２５０であるため、ユーザＢが有するジョブに時刻ｔ０における計算資源を割り当てることを決定する。そして、時刻ｔ０には、ユーザＢが有するジョブが要求する計算資源があるため、並列演算装置１０１は、ユーザＢが有するジョブに、ＣＰＵ＃１の０〜１００［秒］を割り当てることを決定する。そして、並列演算装置１０１は、時刻ｔ０以降におけるユーザＢのフェアシェア予約値を１００減じる。例えば、並列演算装置１０１は、時刻ｔ０におけるユーザＢのフェアシェア予約値を、２５０−１００＝１５０とする。
【００３１】
前述したように、新たなジョブに計算資源を割り当てる際には、並列演算装置１０１は、また現在時刻から割り当てが可能かを判断する。現在時刻ｔ０＝０［秒］において、並列演算装置１０１は、ユーザＡのフェアシェア予約値が２００であり、ユーザＢのフェアシェア予約値が１５０であるため、ユーザＡが有するジョブに時刻ｔ０における計算資源を割り当てることを決定する。
【００３２】
しかしながら、時刻ｔ０には、ユーザＡが有するジョブが要求する計算資源がないため、並列演算装置１０１は、時刻ｔ０の未来となる第１の時刻として、時刻ｔ１＝１００［秒］における計算資源を割り当てるジョブを有するユーザを決定する。この際、並列演算装置１０１は、時刻ｔ１におけるフェアシェア予約値を算出するために用いる時刻ｔ１におけるフェアシェア予約値を上昇させる値を、単位時間当たりのユーザの回復値と、時刻ｔ１と現在時刻との差分とを掛けた値として算出する。図１の例では、並列演算装置１０１は、時刻ｔ１におけるユーザＡのフェアシェア予約値を上昇させる値を、１＊（１００−０）＝１００と算出する。また、並列演算装置１０１は、時刻ｔ１におけるユーザＢのフェアシェア予約値を上昇させる値を、０．５＊（１００−０）＝５０と算出する。
【００３３】
そして、並列演算装置１０１は、時刻ｔ１における各々のユーザのフェアシェア予約値を上昇させる値と現在時刻におけるフェアシェア予約値との和を、時刻ｔ１における各々のユーザのフェアシェア予約値として算出する。図１の例では、並列演算装置１０１は、時刻ｔ１におけるユーザＡのフェアシェア予約値を、２００＋１００＝３００と算出する。並列演算装置１０１は、時刻ｔ１におけるユーザＢのフェアシェア予約値を、１５０＋５０＝２００と算出する。
【００３４】
ここで、時刻ｔ１における各々のユーザのフェアシェア予約値を算出した際の現在時刻は、厳密には、時刻ｔ１における各々のユーザのフェアシェア予約値を上昇させる値を算出した際の現在時刻から少し進んだ時刻となる。しかしながら、２つの現在時刻の差は微小であるから、２つの現在時刻におけるフェアシェア予約値は、同一値であるものとして扱ってよい。
【００３５】
そして、並列演算装置１０１は、時刻ｔ１＝１００［秒］における各々のユーザにおけるフェアシェア予約値に基づいて、時刻ｔ１における計算資源を割り当てるジョブを有するユーザを決定する。図１の例では、並列演算装置１０１は、ユーザＡのフェアシェア予約値が３００であり、ユーザＢのフェアシェア予約値が２００であるため、ユーザＢが有するジョブに時刻ｔ１における計算資源を割り当てることを決定する。そして、時刻ｔ１には、ユーザＡが有するジョブが要求する計算資源があるため、並列演算装置１０１は、ユーザＡが有するジョブに、ＣＰＵ＃２の時刻ｔ１＝１００〜２００［秒］を割り当てることを決定する。
【００３６】
そして、並列演算装置１０１は、未割り当てのジョブがなくなるまで繰り返す。グラフ１０３では、未来時刻ｔ２＝２００〜ｔ３＝３００［秒］の割り当てと、未来時刻ｔ３＝３００〜ｔ４＝４００［秒］の割り当てとを行った例を示す。未来時刻ｔ１〜ｔ４において、ユーザＡとユーザＢとのジョブの割り当て率は、４：２＝２：１であり、図１の例では、ユーザＡに割り当てられる計算資源が、ユーザＢに割り当てられる計算資源の２倍となる。このように、並列演算装置１０１は、各々のユーザのフェアシェア予約値に基づいて未来時刻の計算資源を用いることにより、各々のユーザの資源配分を反映した資源配分を行うことができる。
【００３７】
なお、上述した説明では、並列演算装置１０１は、各々のユーザのフェアシェア予約値に基づいて未来時刻の計算資源を割り当てたが、一人以上のユーザを有する各々のユーザグループのフェアシェア予約値に基づいて計算資源を割り当ててもよい。また、上述した説明では、並列演算装置１０１は、時刻ｔ１における各々のユーザのフェアシェア予約値を上昇させる値を算出した後、時刻ｔ１における各々のユーザのフェアシェア予約値を算出したが、これに限らない。例えば、時刻ｔ１における各々のユーザのフェアシェア予約値を上昇させる値を算出する装置と、時刻ｔ１における各々のユーザのフェアシェア予約値を算出する装置とが異なってもよい。次に、並列演算装置１０１を、並列演算システム２００に適用した例を図２に示す。
【００３８】
図２は、並列演算システム２００のハードウェア構成例を示すブロック図である。並列演算システム２００は、管理ノード２０１と、複数のノードとして、ノード＃１〜＃ｎを有する。ｎは、２以上の整数である。ここで、管理ノード２０１は、図１で示した並列演算装置１０１に相当する。ノード＃１〜＃ｎは、図１における、ＣＰＵ＃１、２に相当する。管理ノード２０１とノード＃１〜＃ｎとは、インターコネクト２０２により接続される。並列演算システム２００は、例えば、スーパーコンピュータである。
【００３９】
管理ノード２０１は、管理ノード２０１とノード＃１〜＃ｎとのうちの少なくともノード＃１〜＃ｎをジョブに割り当てる装置である。ノード＃１〜＃ｎは、割り当てられたノードを実行する装置である。以降の説明では、管理ノード２０１は、ノード単位でジョブを割り当てるものとする。
【００４０】
図３は、管理ノード２０１のハードウェアの一例を示すブロック図である。図３において、管理ノード２０１は、ＣＰＵ３０１と、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、を含む。また、管理ノード２０１は、ディスクドライブ３０４およびディスク３０５と、通信インターフェース３０６と、を含む。また、ＣＰＵ３０１〜ディスクドライブ３０４、通信インターフェース３０６はバス３０７によってそれぞれ接続される。
【００４１】
ＣＰＵ３０１は、管理ノード２０１の全体の制御を司る演算処理装置である。また、管理ノード２０１は、複数のＣＰＵを有してもよい。ＲＯＭ３０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ３０３は、ＣＰＵ３０１のワークエリアとして使用される揮発性メモリである。
【００４２】
ディスクドライブ３０４は、ＣＰＵ３０１の制御に従ってディスク３０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ３０４には、例えば、磁気ディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク３０５は、ディスクドライブ３０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ３０４が磁気ディスクドライブである場合、ディスク３０５には、磁気ディスクを採用することができる。また、ディスクドライブ３０４が光ディスクドライブである場合、ディスク３０５には、光ディスクを採用することができる。また、ディスクドライブ３０４がソリッドステートドライブである場合、ディスク３０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００４３】
通信インターフェース３０６は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース３０６は、通信回線を通じてネットワークを介して他の装置に接続される。通信インターフェース３０６には、例えば、モデムやＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）アダプタなどを採用することができる。
【００４４】
また、並列演算システム２００の管理者が、管理ノード２０１を直接操作する場合、管理ノード２０１は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。また、図示していないが、ノード＃１〜＃ｎも、管理ノード２０１と同様のハードウェアを有する。
【００４５】
（管理ノード２０１の機能構成例）
図４は、管理ノード２０１の機能構成例を示すブロック図である。管理ノード２０１は、制御部４００を有する。制御部４００は、読出部４０１と、算出部４０２と、決定部４０３と、判断部４０４と、割当部４０５とを有する。制御部４００は、記憶装置に記憶されたプログラムをＣＰＵ３０１が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、ディスク３０５などである。また、各部の処理結果は、ＣＰＵ３０１のレジスタや、ＣＰＵ３０１のキャッシュメモリ等に格納される。
【００４６】
また、管理ノード２０１は、記憶部４１１にアクセス可能である。記憶部４１１は、ＲＡＭ３０３、ディスク３０５といった記憶装置である。記憶部４１１は、各ユーザのフェアシェア初期値と、単位時間当たりの回復値と、各ユーザの回復倍率と、各ユーザのフェアシェア値と、未来時刻における各ユーザのフェアシェア予約値をまとめたフェアシェア予約値リストとを有する。
【００４７】
また、記憶部４１１は、本実施の形態による未来時刻におけるジョブの割り当て状況を示すスケジューリング情報を記憶する。また、スケジューリング情報は、現在時刻におけるジョブの割り当て状況を含んでもよい。例えば、図１の例を用いると、スケジューリング情報は、ユーザＡが有するジョブをＣＰＵ＃２の現在時刻ｔ０〜未来時刻ｔ１に割り当てることと、…、ユーザＢが有するジョブをＣＰＵ＃１の未来時刻ｔ３〜未来時刻ｔ４に割り当てることを示す。
【００４８】
フェアシェア予約値リストは、並列演算システム２００の管理者によって予め指定されたフェアシェア予約値間隔ごとに作成された配列である。フェアシェア予約値リストの各配列要素は、各配列要素の時刻を格納するメンバｔｔと、各々のユーザのフェアシェア予約値を格納する配列メンバｆｓを持つ。ｆｓは、ユーザごとの配列となる。フェアシェア予約値リストの先頭の要素には、現在時刻の情報が格納される。また、フェアシェア予約値リストの２番目以降の配列要素には、フェアシェア予約値間隔後の時刻の情報が格納される。
【００４９】
読出部４０１は、単位時間当たりのユーザの回復値を記憶部４１１から読み出す。
【００５０】
算出部４０２は、第１の時刻における計算資源を割り当てるジョブを有するユーザを決定する際に用いる各々のユーザのフェアシェア予約値を上昇させる値を、読み出した単位時間当たりのユーザの回復値と、現在時刻と第１の時刻との差分とに基づいて算出する。
【００５１】
また、算出部４０２は、算出した各々のユーザのフェアシェア予約値を上昇させる値と、現在時刻における各々のユーザのフェアシェア予約値とに基づいて、第１の時刻における各々のユーザのフェアシェア予約値を算出してもよい。例えば、算出部４０２が、ユーザＡのフェアシェア予約値を上昇させる値が１００であると算出したとする。そして、現在時刻におけるユーザＡのフェアシェア予約値が２００であるとする。このとき、算出部４０２は、第１の時刻における各々のユーザのフェアシェア予約値を、１００＋２００＝３００であると算出する。算出部４０２は、算出したフェアシェア予約値を、フェアシェア予約値リストのうちのユーザと時刻とが対応する要素に格納する。
【００５２】
決定部４０３は、算出部４０２が算出した第１の時刻における各々のユーザのフェアシェア予約値に基づいて、複数のユーザから第１の時刻における計算資源を割り当てるジョブを有するユーザを決定する。例えば、決定部４０３は、第１の時刻におけるフェアシェア予約値が最も大きい値を有するユーザを、第１の時刻における計算資源を割り当てるジョブを有するユーザとして決定する。または、決定部４０３は、第１の時刻におけるフェアシェア予約値が最も大きい値を有するユーザが複数存在する場合、発行が早いジョブを有するユーザを、第１の時刻における計算資源を割り当てるジョブを有するユーザとして決定してもよい。
【００５３】
判断部４０４は、決定部４０３が第１の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が第１の時刻にあるか否かを判断する。具体的には、判断部４０４は、スケジューリング情報を参照して、第１の時刻における空き計算資源を特定する。そして、判断部４０４は、特定した空き資源が、決定したユーザが有するジョブが要求する計算資源を満たすか否かを判断する。
【００５４】
そして、決定部４０３は、判断部４０４が判断した判断結果に基づいて、ユーザが有するジョブに第１の時刻における計算資源を割り当てることを決定してもよい。割り当てることを決定した場合、決定部４０３は、ユーザが有するジョブに第１の時刻における計算資源を割り当てることをスケジューリング情報に記憶する。
【００５５】
そして、判断部４０４が、決定したユーザが有するジョブが要求する計算資源が第１の時刻にあると判断したとする。このとき、管理ノード２０１は、決定したユーザの第１の時刻または第１の時刻より未来の第２の時刻のいずれかの時刻におけるフェアシェア予約値を、第１の時刻における計算資源を割り当てることによるフェアシェア使用量分下げることになる。具体的には、算出部４０２は、いずれかの時刻におけるユーザのフェアシェア予約値を上昇させる値と、現在時刻におけるユーザのフェアシェア予約値と、フェアシェア使用量とに基づいて、いずれかの時刻におけるユーザのフェアシェア予約値を算出する。
【００５６】
例えば、図１の例を用いると、管理ノード２０１が、ユーザＡが有するジョブに第１の時刻として未来時刻である未来時刻ｔ１＝１００［秒］〜ｔ２＝２００［秒］を割り当てたとする。そして、未来時刻ｔ１におけるユーザＡのフェアシェア予約値を上昇させる値が、１＊１００＝１００であるとする。また、現在時刻ｔ０におけるフェアシェア予約値が２００であるとする。そして、フェアシェア使用量を１００とする。
【００５７】
この場合、算出部４０２は、現在時刻ｔ０におけるフェアシェア予約値と未来時刻ｔ１におけるユーザＡのフェアシェア予約値を上昇させる値とを加えた値からフェアシェア使用量を減じた値を、未来時刻ｔ１におけるユーザＡのフェアシェア予約値として算出する。すなわち、算出部４０２は、未来時刻ｔ１におけるユーザＡのフェアシェア予約値を、２００＋１００−１００＝２００であると算出する。
【００５８】
同様に、第１の時刻より未来の第２の時刻となる未来時刻ｔ２におけるユーザＡのフェアシェア予約値を上昇させる値が、１＊２００＝２００であるとする。算出部４０２は、現在時刻ｔ０におけるフェアシェア予約値と未来時刻ｔ２におけるユーザＡのフェアシェア予約値を上昇させる値とを加えた値からフェアシェア使用量を減じた値を、未来時刻ｔ２におけるユーザＡのフェアシェア予約値として算出する。すなわち、算出部４０２は、未来時刻ｔ１におけるユーザＡのフェアシェア予約値を、２００＋２００−１００＝３００であると算出する。
【００５９】
また、判断部４０４が、決定したユーザが有するジョブが要求する計算資源が第１の時刻にないと判断したとする。このとき、決定部４０３は、第１の時刻より未来の第２の時刻における各々のユーザのフェアシェア予約値に基づいて、複数のユーザから第２の時刻における計算資源を割り当てるジョブを有するユーザを決定してもよい。
【００６０】
また、第１の時刻における計算資源を割り当てることを決定したユーザが第２の時刻における計算資源を割り当てることを決定したユーザとは異なったとする。この場合、判断部４０４は、第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が第１の時刻にあるか否かを判断する。
【００６１】
また、決定部４０３は、判断した判断結果に基づいて、第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブに第１の時刻における計算資源を割り当てることを決定してもよい。具体的には、判断部４０４は、スケジューリング情報を参照して、第１の時刻における空き計算資源を特定する。そして、判断部４０４は、特定した空き資源が、第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源を満たすか否かを判断する。
【００６２】
割当部４０５は、スケジューリング情報を参照して、割り当てを決定したジョブの割り当て時刻となった際に、該当のジョブをノードに割り当てる。
【００６３】
次に、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア更新例について、図５〜図１０を用いて説明する。図５〜図１０の例では、実行待ちのジョブは、ジョブ番号の昇順に投入されるものとする。そして、ジョブ番号ｊ１、ｊ２、ｊ５、ｊ６、ｊ９のジョブは、ユーザＡが投入したジョブであり、ジョブ番号ｊ３、ｊ４、ｊ７、ｊ８、ｊ１０のジョブはユーザＢが投入したジョブである。また、全てのジョブにおいて、各ジョブが要求する計算資源は、１００ノード＊１００［秒］＝１００００とし、専有使用時間＝１００［秒］を使い切って終了するものとする。ここで、前述したジョブの条件は、分りやすく説明するためのものであり、各ジョブは、個別の計算資源、個別の専有使用時間を有してもよい。また、並列演算システム２００が有するノードの個数は、２００であるとする。
【００６４】
そして、フェアシェア初期値は、ユーザＡ、ユーザＢともに６００００とする。また、現在時刻ｔ０におけるユーザＡのフェアシェア値は、４００００であるとする。また、現在時刻ｔ０におけるユーザＢのフェアシェア値は、４５０００であるとする。そして、単位時間当たりの回復値は、５０とする。そして、ユーザの回復倍率は、ユーザＡとユーザＢとで１：１の比となるように、ユーザＡの回復倍率＝１、ユーザＢの回復倍率＝１とする。図５〜図１０では、ユーザＡ、Ｂに対して公平に計算資源が配分されることが目標となる。また、図５〜図１０内に示した（１）〜（１０）および、図５〜図１０に対する説明における（１）〜（１０）は、ジョブの割り当て順番を示す。
【００６５】
図５は、フェアシェア予約値により未来時刻の資源配分を行う際の一例を示す説明図である。また、図６〜図９は、それぞれ、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例を示す説明図（その１）〜（その４）である。具体的には、図６〜図９では、ジョブを割り当てていない状態が続く場合と、（１）〜（１０）の後とのフェアシェア予約値を示すグラフ６０１〜６０３、７０１〜７０３、８０１〜８０３、９０１、９０２を示す。グラフ６０１〜６０３、７０１〜７０３、８０１〜８０３、９０１、９０２の横軸は、時刻を示し、縦軸はフェアシェア予約値を示す。また、グラフ６０１〜６０３、７０１〜７０３、８０１〜８０３、９０１、９０２における太い点線がユーザＡのフェアシェア予約値を示し、太い実線がユーザＢのフェアシェア予約値を示す。
【００６６】
図５では、現在時刻ｔ０、未来時刻ｔ１〜未来時刻ｔ５までに割り当てられるジョブの順番が、図５の（１）〜（１０）で示される。ここで、未来時刻ｔ１は、現在時刻ｔ０から専有使用時間が経過した場合の未来の時刻である。そして、２以上の整数ｎについて、未来時刻ｔ（ｎ）は、未来時刻ｔ（ｎ−１）から専有使用時間が経過した場合の未来時刻である。
【００６７】
図６の（ａ）では、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、ジョブを割り当てていない状態が続く場合における、各時刻のフェアシェア予約値を示すグラフ６０１を表示する。グラフ６０１に示すように、現在時刻ｔ０では、ユーザＡのフェアシェア予約値が４００００であり、ユーザＢのフェアシェア予約値が４５０００であるため、ユーザＢのフェアシェア予約値の方が高くなる。そして、グラフ６０１に示すように、ユーザＡのフェアシェア予約値は、現在時刻ｔ０以降について、専有使用時間の経過のたびに５０＊１００ノード＝５０００回復して、未来時刻ｔ４にフェアシェア初期値に到達することになる。同様に、ユーザＢのフェアシェア予約値は、現在時刻ｔ０以降について、専有使用時間の経過のたびに５０＊１００ノード＝５０００回復して、未来時刻ｔ３に、フェアシェア初期値に到達することになる。
【００６８】
管理ノード２０１は、現在時刻ｔ０におけるユーザＢのフェアシェア予約値がユーザＡのフェアシェア予約値より高いため、図５の（１）として、ユーザＢのジョブｊ３を選択して現在時刻ｔ０に割り当て可能か判断する。この場合、現在時刻ｔ０に要求された空き計算資源が存在するため、管理ノード２０１は、ジョブｊ３に空き計算資源を割り当てる。
【００６９】
図６の（ｂ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（１）でジョブｊ３を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ６０２を示す。グラフ６０２が示すように、管理ノード２０１は、ジョブｊ３に現在時刻ｔ０における空き計算資源を割り当てたため、ジョブｊ３のオーナとなるユーザＢの現在時刻ｔ０以降全ての未来時刻についてフェアシェア予約値を１００００減じる。例えば、ユーザＢの現在時刻ｔ０におけるフェアシェア使用値は、４５０００−１００００＝３５０００となる。また、ユーザＢの未来時刻ｔ１におけるフェアシェア使用値は、５００００−１００００＝４００００となる。ユーザＡのフェアシェア予約値については、グラフ６０１で示したままとなる。
【００７０】
次のジョブの割り当てでは、管理ノード２０１は、もう一度現在時刻ｔ０から処理を始める。図５の（１）について、管理ノード２０１がジョブｊ３を割り当てたため、現在時刻ｔ０では、ユーザＡのフェアシェア予約値が４００００であり、ユーザＢのフェアシェア予約値が３５０００となっており、ユーザＡのフェアシェア予約値の方が高くなる。このため、管理ノード２０１は、図５の（２）として、ユーザＡのジョブｊ１を選択して現在時刻ｔ０に割り当て可能か判断する。この場合、現在時刻ｔ０に要求された空き計算資源が存在するので、管理ノード２０１は、ジョブｊ１に空き計算資源を割り当てる。
【００７１】
図６の（ｃ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（２）でジョブｊ１を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ６０３を示す。グラフ６０３が示すように、管理ノード２０１は、ジョブｊ１に現在時刻ｔ０における空き計算資源を割り当てたため、ジョブｊ１のオーナであるユーザＡの現在時刻ｔ０以降全ての未来時刻についてフェアシェア予約値を１００００減じる。例えば、ユーザＡの現在時刻ｔ０におけるフェアシェア使用値は、４００００−１００００＝３００００となる。また、ユーザＡの未来時刻ｔ１におけるフェアシェア使用値は、４５０００−１００００＝３５０００となる。ユーザＢのフェアシェア予約値については、グラフ６０２で示したままとなる。
【００７２】
次のジョブの割り当てでは、管理ノード２０１は、もう一度現在時刻ｔ０から処理を始める。図５の（２）について、ジョブｊ１が割り当てられたため、現在時刻ｔ０では、ユーザＡのフェアシェア予約値が３００００であり、ユーザＢのフェアシェア予約値が３５０００であるため、ユーザＢのフェアシェア予約値の方が高くなる。このため、管理ノード２０１は、ユーザＢのジョブｊ４を選択して現在時刻ｔ０に割当て可能か判断する。この場合、現在時刻ｔ０に要求された空き計算資源がないため、管理ノード２０１は、割り当て不可と判断する。
【００７３】
現在時刻ｔ０に割り当てられないため、管理ノード２０１は、現在時刻ｔ０の次の未来時刻となる未来時刻ｔ１のフェアシェア予約値を参照する。未来時刻ｔ１では、ユーザＡのフェアシェア予約値が３５０００であり、ユーザＢのフェアシェア予約値が４００００であるため、ユーザＢのフェアシェア予約値が高い状態が続く。このため、管理ノード２０１は、ユーザＢのジョブｊ４を選択して未来時刻ｔ１に割り当て可能か判断する。この場合、未来時刻ｔ１に要求された空き計算資源が存在するので、図５の（３）として、ジョブｊ４に空き計算資源を割り当てる。
【００７４】
図７の（ａ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（３）でジョブｊ４を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ７０１を示す。グラフ７０１が示すように、管理ノード２０１は、ジョブｊ４に時刻ｔ１における空き計算資源を割り当てたため、ジョブｊ４のオーナであるユーザＢの未来時刻ｔ１以降全ての未来時刻についてフェアシェア予約値を１００００減じる。例えば、ユーザＢの未来時刻ｔ１におけるフェアシェア使用値は、４００００−１００００＝３００００となる。また、ユーザＢの未来時刻ｔ２におけるフェアシェア使用値は、４５０００−１００００＝３５０００となる。ユーザＡのフェアシェア予約値については、グラフ６０３で示したままとなる。
【００７５】
次のジョブの割り当てでは、管理ノード２０１は、もう一度現在時刻ｔ０から処理を始める。図５の（３）について、ジョブｊ４は未来時刻ｔ１に割り当てられたため、現在時刻ｔ０のフェアシェア予約値に変更はない。従って、ユーザＡのフェアシェア予約値が３００００であり、ユーザＢのフェアシェア予約値が３５０００であるため、ユーザＢのフェアシェア予約値が高くなる。このため、管理ノード２０１は、ユーザＢのジョブｊ７を選択して現在時刻ｔ０に割り当て可能か判断する。この場合、現在時刻ｔ０に要求された空き計算資源がないため、管理ノード２０１は、割り当て不可と判断する。
【００７６】
現在時刻ｔ０に割り当てられないため、管理ノード２０１は、次の未来時刻ｔ１のフェアシェア予約値を参照する。未来時刻ｔ１では、ユーザＡのフェアシェア予約値が３５０００であり、ユーザＢのフェアシェア予約値が３００００であるため、ユーザＡのフェアシェア予約値の方が高くなる。優先するユーザがユーザＢからユーザＡに変更されると、管理ノード２０１は、今度はユーザＡのジョブを選択して現在時刻ｔ０から割り当て可能かをチェックすることになる。ここで、未来時刻ｔ１までのフェアシェア予約値は、ユーザＡよりユーザＢの方が高くなっていたが、ユーザＢのジョブは割り当て不可だったので、未来時刻ｔ１より前の時刻において割り当て可能かを判断しても無駄となる。そこで、管理ノード２０１は、優先するユーザが切り替わった時刻をユーザ優先度変更時刻ｃｔｔに記憶しておき、時刻ｃｔｔまではフェアシェア予約値の判断を行わずユーザＡを優先して処理してもよい。これにより、管理ノード２０１は、無駄な処理を省いて、時刻ｃｔｔにおけるユーザＡのジョブ割り当てを可能にする。
【００７７】
現在時刻ｔ０はｃｔｔ＝未来時刻ｔ１よりも前なので、管理ノード２０１は、フェアシェア予約値の判断を行わず、ユーザＡを優先してのジョブｊ２を選択し、現在時刻ｔ０に割り当て可能か判断する。この場合、現在時刻ｔ０に要求された空き計算資源がないため、管理ノード２０１は、割り当て不可と判断する。
【００７８】
そして、現在時刻ｔ０に割り当てられないため、次の未来時刻ｔ１に割り当て可能かを判断することになるが、未来時刻ｔ１はｃｔｔ＝未来時刻ｔ１よりも前ではないので、管理ノード２０１は、フェアシェア予約値の判断を行うことになる。未来時刻ｔ１のフェアシェア予約値を参照すると、ユーザＡのフェアシェア予約値が３５０００であり、ユーザＢのフェアシェア予約値が３００００であるから、ユーザＡのフェアシェア予約値の方が高く、優先するユーザに変更はない。この結果、管理ノード２０１は、引き続きユーザＡを優先してジョブｊ２を選択して、未来時刻ｔ１に割り当て可能か判断する。この場合、未来時刻ｔ１に要求された空き計算資源が存在するので、管理ノード２０１は、図５の（４）として、ジョブｊ２に空き計算資源を割り当てる。
【００７９】
図７の（ｂ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（４）でジョブｊ２を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ７０２を示す。グラフ７０２が示すように、管理ノード２０１は、ジョブｊ２に時刻ｔ１における空き計算資源を割り当てたため、ジョブｊ２のオーナであるユーザＡの未来時刻ｔ１以降全ての未来時刻についてフェアシェア予約値を１００００減じる。例えば、ユーザＡの未来時刻ｔ１におけるフェアシェア使用値は、３５０００−１００００＝２５０００となる。また、ユーザＡの未来時刻ｔ２におけるフェアシェア使用値は、４００００−１００００＝３００００となる。ユーザＢのフェアシェア予約値については、グラフ７０１で示したままとなる。
【００８０】
以降のジョブの割り当ても同様に、管理ノード２０１は、現在時刻ｔ０から処理を始め、各未来時刻のフェアシェア予約値を参照して優先するユーザを切り替えることにより、順番にジョブを割り当てる。
【００８１】
具体的には、管理ノード２０１は、図５の（５）と図５の（６）として、ユーザＢのジョブｊ７とユーザＡのジョブｊ５とに未来時刻ｔ２における空き計算資源を割り当てる。そして、図７の（ｃ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（５）でジョブｊ７を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ７０３を示す。また、図８の（ａ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（６）でジョブｊ５を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ８０１を示す。
【００８２】
また、管理ノード２０１は、図５の（７）と図５の（８）として、ユーザＢのジョブｊ８とユーザＡのジョブｊ６とに未来時刻ｔ３における空き計算資源を割り当てる。そして、図８の（ｂ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（７）でジョブｊ８を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ８０２を示す。また、図８の（ｃ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（８）でジョブｊ６を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ８０３を示す。
【００８３】
また、管理ノード２０１は、図５の（９）と図５の（１０）として、ユーザＢのジョブｊ１０とユーザＡのジョブｊ９とに未来時刻ｔ４における空き計算資源を割り当てる。そして、図９の（ａ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（９）でジョブｊ１０を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ９０１を示す。また、図９の（ｂ）は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図５の（１０）でジョブｊ９を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ９０２を示す。
【００８４】
ジョブｊ１〜ｊ１０の未来割り当ての結果、図５〜図９で示すように、ユーザＡ、ユーザＢのジョブが、現在時刻ｔ０〜未来時刻ｔ４のそれぞれで、公平に割り当てられることがわかる。このように、管理ノード２０１は、未来割り当てする予約ジョブに対して目標通り計算資源を公平に配分する制御を行うことができる。
【００８５】
図１０は、フェアシェア予約値の更新一覧の例を示す説明図である。図１０では、図５〜図９で示したフェアシェア予約値の更新状況の一覧を示す表１００１を示す。具体的には、表１００１は、現在時刻ｔ０、未来時刻ｔ１〜ｔ９ごとに、ジョブを割り当てる前と、図５の（１）〜（１０）の後とにおけるユーザＡとユーザＢとのフェアシェア予約値を示す。
【００８６】
次に、図５〜図１０で説明したフェアシェア予約値による未来時刻の資源配分の効果の比較として、フェアシェア値により未来時刻の資源配分を行う際の例を、図１１を用いて示す。
【００８７】
図１１は、フェアシェア値により未来時刻の資源配分を行う際の一例を示す説明図である。図１１の例では、計算資源を割り当てる装置が、現在時刻と未来時刻とにおける計算資源をジョブに割り当てるスケジューリング処理を行うものとする。また、図１１の例では、実行待ちのジョブは、ジョブ番号の昇順に投入されるものとする。そして、ユーザＡが投入したジョブと、ユーザＢが投入したジョブについては、図５〜図１０と同一とする。また、各ジョブが要求する計算資源についてと、フェアシェア初期値と、現在時刻ｔ０におけるユーザＡ、Ｂのフェアシェア値と、単位時間当たりの回復値と、ユーザＡ、Ｂの回復倍率とは、図５〜図１０と同一であるとする。回復倍率がユーザＡ：ユーザＢ＝１：１であるため、公平に計算資源が配分されることが目標となる。
【００８８】
また、図１１では、現在時刻ｔ０、未来時刻ｔ１〜未来時刻ｔ５までに割り当てられるジョブの順番が、図１１の（１）〜（１０）で示される。
【００８９】
計算資源を割り当てる装置は、現在時刻ｔ０におけるユーザＢのフェアシェア値がユーザＡのフェアシェア値より高いため、図１１の（１）として、ユーザＢのジョブｊ３を選択して現在時刻ｔ０に割り当て可能か判断する。この場合、現在時刻ｔ０に要求された空き計算資源が存在するため、計算資源を割り当てる装置は、ジョブｊ３に空き計算資源を割り当てる。
【００９０】
ここで、計算資源を割り当てる装置は、現在時刻を含めた未来割り当てする予約ジョブが存在する間、ジョブ実行開始によるフェアシェア値の変更を待たず、次々に未来割り当て処理を継続する。従って、ジョブｊ３が割り当てられた後のフェアシェア値は、ユーザＡのフェアシェア値が４００００であり、ユーザＢのフェアシェア値が４５０００と変わらない。この結果、ユーザＢのフェアシェア値が高いままであるから、計算資源を割り当てる装置は、図１１の（２）として、ユーザＢのジョブｊ４を選択して、ジョブｊ４に現在時刻ｔ０における空き計算資源を割り当てる。
【００９１】
この時点で現在時刻ｔ０における全ての計算資源が割り当て済みとなるが、未来割り当てする予約ジョブはまだ残っているので、計算資源を割り当てる装置は、スケジューリング処理を継続する。次に計算資源の空きが発生するのはジョブｊ３とジョブｊ４とが実行終了する予定である未来時刻ｔ１のタイミングとなる。
【００９２】
ジョブｊ４が割り当てられた後のフェアシェア値も同様に変わらないので、ユーザＡのフェアシェア値が４００００であり、ユーザＢのフェアシェア値が４５０００となる。この結果、ユーザＢのフェアシェア値が高いままであるから、計算資源を割り当てる装置は、図１１の（３）として、ユーザＢのジョブｊ７を選択して、ジョブｊ７に未来時刻ｔ１における空き計算資源を割り当てる。ジョブｊ７が割り当てられた後のフェアシェア値も同様に変わらないので、計算資源を割り当てる装置は、図１１の（４）として、ユーザＢのジョブｊ８を選択して、ジョブｊ８に未来時刻ｔ１における空き計算資源を割り当てる。
【００９３】
この時点で未来時刻ｔ１の全ての計算資源が割り当て済みとなるが、未来割り当てする予約ジョブはまだ残っているので、計算資源を割り当てる装置は、スケジューリング処理を継続する。次に計算資源の空きが発生するのは、ジョブｊ７とジョブｊ８とが実行終了する予定である未来時刻ｔ２のタイミングとなる。
【００９４】
ジョブｊ８が割り当てられた後のフェアシェア値も同様に変わらないので、計算資源を割り当てる装置は、ユーザＢのジョブｊ１０を選択して、図１１の（５）として、ジョブｊ１０に未来時刻ｔ２における空き計算資源を割り当てる。ジョブｊ１０が割り当てられた後のフェアシェア値も同様に変わらないので、ユーザＢのフェアシェア値が高いままである。しかしながら、残っている未来割り当てする予約ジョブはユーザＡのジョブだけになるので、計算資源を割り当てる装置は、図１１の（６）として、ユーザＡのジョブｊ１を選択して、ジョブｊ１に未来時刻ｔ２における空き計算資源を割り当てる。
【００９５】
以降、計算資源を割り当てる装置は、同様に残っているユーザＡのジョブに、未来時刻ｔ３または未来時刻ｔ４における計算資源を割り当てる。具体的には、計算資源を割り当てる装置は、図１１の（７）と（８）として、ユーザＡのジョブｊ２とジョブｊ５とに未来時刻ｔ３における空き計算資源を割り当てる。また、計算資源を割り当てる装置は、図１１の（９）と（１０）として、ユーザＡのジョブｊ６とジョブｊ９とに未来時刻ｔ４における空き計算資源を割り当てる。
【００９６】
図１１におけるジョブの割り当て結果を見ると、計算資源を割り当てる装置は、ユーザＢの全てのジョブが先に未来割り当て予約した後、ユーザＡの全てのジョブが未来割り当て予約することになる。このように、フェアシェア値により未来時刻の資源配分を行うと、公平な計算資源の配分制御を行えない。
【００９７】
次に、図１２〜図２１を用いて、図４〜図１０で説明したフェアシェア予約値による未来時刻の資源配分を行うフェアシェア予約値制御処理を、管理ノード２０１が実行するフローチャートを示す。図１２〜図２１で示すフローチャートでは、説明の簡略化のため、図５〜図９で示した動作を行う初期設定を行うこととする。
【００９８】
図１２は、フェアシェア予約値制御処理手順の一例を示すフローチャートである。フェアシェア予約値制御処理は、フェアシェア予約値を制御する処理である。
【００９９】
管理ノード２０１は、初期値を設定する（ステップＳ１２０１）。具体的には、管理ノード２０１は、初期値として、ユーザＡ、Ｂのフェアシェア初期値を、ともに６００００に設定する。また、管理ノード２０１は、初期値として、単位時間当たりの回復値を、５０に設定する。また、管理ノード２０１は、初期値として、ユーザの回復倍率を、ユーザＡ、ユーザＢともに１に設定する。また、管理ノード２０１は、初期値として、空きノード数を全ノードの個数とする。また、管理ノード２０１は、初期値として、フェアシェア値更新時刻を現在時刻に設定する。
【０１００】
また、管理ノード２０１は、フェアシェア予約値間隔を１００に設定する。ここで、現在時刻以降は、ＵＴＣ（Ｃｏｏｒｄｉｎａｔｅｄ  Ｕｎｉｖｅｒｓａｌ  Ｔｉｍｅ）の０（１９７０年１月１日００：００：００）からの指定秒数間隔とする。例えば、現在時刻が００：０１：１０であり、フェアシェア予約値間隔を１００［秒］とした場合、各フェアシェア予約値リストに設定される時刻は、以下のようになる。
【０１０１】
フェアシェア予約値リスト［０］．ｔｔ＝００：０１：１０（現在時刻）
フェアシェア予約値リスト［１］．ｔｔ＝００：０１：４０（１００秒）
フェアシェア予約値リスト［２］．ｔｔ＝００：０３：２０（２００秒）
フェアシェア予約値リスト［３］．ｔｔ＝００：０５：００（３００秒）
…
【０１０２】
また、管理ノード２０１は、初期値として、ｆｓ＿ｎｕｍを１００に設定する。ここで、ｆｓ＿ｎｕｍは、フェアシェア予約値リストの配列数となる。そして、管理ノード２０１は、ｆｓ＿ｎｕｍ＊フェアシェア予約値間隔までの未来時刻まで、ジョブの割り当てが行える。そして、管理ノード２０１は、初期値として、フェアシェア予約値リスト［ｆｓ＿ｎｕｍ］の記憶領域をＲＡＭ３０３上に確保する。これにより、管理ノード２０１は、フェアシェア予約値リスト［０］〜［ｆｓ＿ｎｕｍ−１］の記憶領域を確保する。
【０１０３】
また、管理ノード２０１は、初期値として、ユーザＡフェアシェア値にユーザＡフェアシェア初期値を設定する。同様に、管理ノード２０１は、初期値として、ユーザＢフェアシェア値にユーザＢフェアシェア初期値を設定する。
【０１０４】
次に、管理ノード２０１は、フェアシェア予約値リスト初期化処理を実行する（ステップＳ１２０２）。フェアシェア予約値リスト初期化処理は、図１７、図１８で説明する。そして、管理ノード２０１は、未割り当てのジョブがあるか否かを判断する（ステップＳ１２０３）。未割り当てのジョブがある場合（ステップＳ１２０３：Ｙｅｓ）、管理ノード２０１は、ジョブ割り当て処理を実行する（ステップＳ１２０４）。そして、管理ノード２０１は、ジョブ割り当て処理の戻り値をｊｉｄに設定する。ジョブ割り当て処理は、図１４、図１５で説明する。
【０１０５】
次に、管理ノード２０１は、ｊｉｄが０より大きいか否かを判断する（ステップＳ１２０５）。ｊｉｄが０より大きい場合（ステップＳ１２０５：Ｙｅｓ）、管理ノード２０１は、ｊｉｄを引数として、フェアシェア予約値リスト更新処理を実行する（ステップＳ１２０６）。フェアシェア予約値リスト更新処理は、図１９で説明する。そして、管理ノード２０１は、ステップＳ１２０３の処理に移行する。
【０１０６】
一方、未割り当てのジョブがない場合（ステップＳ１２０３：Ｎｏ）、または、ｊｉｄが０以下である場合（ステップＳ１２０５：Ｎｏ）、管理ノード２０１は、イベント待ち処理を実行する（ステップＳ１２０７）。そして、管理ノード２０１は、イベント待ち処理の戻り値をｅｅに設定する。イベント待ち処理は、図２０、図２１で説明する。次に、管理ノード２０１は、ｅｅが再スケジュールイベントか否かを判断する（ステップＳ１２０８）。
【０１０７】
ｅｅが再スケジュールイベントである場合（ステップＳ１２０８：Ｙｅｓ）、管理ノード２０１は、未来割り当てジョブを未割り当て状態に設定する（ステップＳ１２０９）。次に、管理ノード２０１は、フェアシェア値更新処理を実行する（ステップＳ１２１０）。フェアシェア値更新処理は、図１３で説明する。そして、管理ノード２０１は、フェアシェア予約値リスト初期化処理を実行する（ステップＳ１２１１）。次に、管理ノード２０１は、ステップＳ１２０３の処理に移行する。
【０１０８】
一方、ｅｅが再スケジュールイベントでない場合（ステップＳ１２０８：Ｎｏ）、管理ノード２０１は、ｅｅがスケジューラ停止イベントか否かを判断する（ステップＳ１２１２）。ｅｅがスケジューラ停止イベントでない場合（ステップＳ１２１２：Ｎｏ）、管理ノード２０１は、ステップＳ１２０３の処理に移行する。一方、ｅｅがスケジューラ停止イベントである場合（ステップＳ１２１２：Ｙｅｓ）、管理ノード２０１は、フェアシェア予約値制御処理を終了する。フェアシェア予約値制御処理を実行することにより、管理ノード２０１は、フェアシェア予約値を制御して、未来時刻における計算資源を割り当てることができる。
【０１０９】
図１３は、フェアシェア値更新処理手順の一例を示すフローチャートである。フェアシェア値更新処理は、フェアシェア値を更新する処理である。
【０１１０】
管理ノード２０１は、ｔｔを現在時刻−フェアシェア値更新時刻に設定する（ステップＳ１３０１）。次に、管理ノード２０１は、ユーザＡフェアシェア回復量を単位時間当たりの回復値＊ユーザＡ回復倍率＊ｔｔに設定する（ステップＳ１３０２）。また、管理ノード２０１は、ユーザＢフェアシェア回復量を単位時間当たりの回復値＊ユーザＢ回復倍率＊ｔｔに設定する（ステップＳ１３０３）。次に、管理ノード２０１は、ユーザＡフェアシェア値をユーザＡフェアシェア値＋ユーザＡフェアシェア回復量に設定する（ステップＳ１３０４）。また、管理ノード２０１は、ユーザＢフェアシェア値をユーザＢフェアシェア値＋ユーザＢフェアシェア回復量に設定する（ステップＳ１３０５）。そして、管理ノード２０１は、フェアシェア値更新時刻を現在時刻に設定する（ステップＳ１３０６）。
【０１１１】
ステップＳ１３０６の処理終了後、管理ノード２０１は、フェアシェア値更新処理を終了する。フェアシェア値更新処理を実行することにより、管理ノード２０１は、時間経過によるフェアシェア値の回復を行うことができる。
【０１１２】
図１４は、ジョブ割り当て処理手順の一例を示すフローチャート（その１）である。また、図１５は、ジョブ割り当て処理手順の一例を示すフローチャート（その２）である。ジョブ割り当て処理は、ジョブに計算資源を割り当てる処理である。
【０１１３】
管理ノード２０１は、ｐｉｉ［ユーザＡ］に０を設定するとともに、ｐｉｉ［ユーザＢ］に０を設定する（ステップＳ１４０１）。ここで、ｐｉｉは、フェアシェア予約値リストのユーザごとの処理対象のインデックスを記憶する配列である。管理ノード２０１は、ステップＳ１４０１の処理において、現在時刻であるインデックス＝０を処理する。次に、管理ノード２０１は、ｊｉｄに０を設定するとともに、ｃｔｔに−１を設定する（ステップＳ１４０２）。ｊｉｄは、割り当てを行うジョブ番号が格納される。また、割り当てを行うジョブがない場合、ｊｉｄは０が格納される。ｃｔｔは、図５の（３）で説明した、ユーザ優先度変更時刻である。
【０１１４】
そして、管理ノード２０１は、ｕｎａｌｌｏｃ＿ｊｉｄ［ユーザＡ］にユーザＡの未割り当て最小ジョブ番号を設定する（ステップＳ１４０３）。また、管理ノード２０１は、ｕｎａｌｌｏｃ＿ｊｉｄ［ユーザＢ］にユーザＢの未割り当て最小ジョブ番号を設定する（ステップＳ１４０４）。ここで、ｕｎａｌｌｏｃ＿ｊｉｄは、ユーザごとの割り当て候補となるジョブ番号を記憶する配列である。
【０１１５】
次に、管理ノード２０１は、第１引数を０として、第２引数をｕｎａｌｌｏｃ＿ｊｉｄ［ユーザＡ］の値として、第３引数をｕｎａｌｌｏｃ＿ｊｉｄ［ユーザＢ］の値として、ユーザ選択処理を実行する（ステップＳ１４０５）。そして、管理ノード２０１は、ｕｕにユーザ選択処理の戻り値を設定する。ユーザ選択処理は、図１６で説明する。
【０１１６】
次に、管理ノード２０１は、ｐｉｉ［ｕｕ］がｆｓ＿ｎｕｍより小さいか否かを判断する（ステップＳ１４０６）。ｐｉｉ［ｕｕ］がｆｓ＿ｎｕｍより小さい場合（ステップＳ１４０６：Ｙｅｓ）、管理ノード２０１は、ｔｔにフェアシェア予約値リスト［ｉｉ［ｕｕ］］．ｔｔの値を設定する（ステップＳ１４０７）。そして、管理ノード２０１は、ｕｎａｌｌｏｃ＿ｊｉｄ［ｕｕ］の要求ノード数と、専有使用時間とを満たす空きノードが時刻ｔｔにあるか否かを判断する（ステップＳ１４０８）。
【０１１７】
専有使用時間とを満たす空きノードが時刻ｔｔにない場合（ステップＳ１４０８：Ｎｏ）、管理ノード２０１は、ｐｉｉ［ｕｕ］をインクリメントする（ステップＳ１４０９）。このように、優先すべきユーザｕｕのジョブが割り当てられなかった場合に、ｐｉｉ［ｕｕ］をインクリメントすることにより、管理ノード２０１は、ユーザｕｕについてジョブが割り当てられなかったことを再び判断するという無駄な処理を省くことができる。一方、専有使用時間とを満たす空きノードが時刻ｔｔにある場合（ステップＳ１４０８：Ｙｅｓ）、管理ノード２０１は、ｊｉｄにｕｎａｌｌｏｃ＿ｊｉｄ［ｕｕ］の値を設定する（ステップＳ１４１０）。
【０１１８】
ステップＳ１４０９の処理終了後、管理ノード２０１は、ｐｉｉ［ｕｕ］がｆｓ＿ｎｕｍより小さいか否かを判断する（ステップＳ１４１１）。ステップＳ１４１０の処理終了後、または、ｐｉｉ［ｕｕ］がｆｓ＿ｎｕｍ以上である場合（ステップＳ１４０６：Ｎｏ、ステップＳ１４１１：Ｎｏ）、管理ノード２０１は、ジョブ割り当て処理を終了する。ここで、管理ノード２０１は、ジョブ割り当て処理の戻り値として、ｊｉｄの値を出力する。
【０１１９】
一方、ｐｉｉ［ｕｕ］がｆｓ＿ｎｕｍより小さい場合（ステップＳ１４１１：Ｙｅｓ）、管理ノード２０１は、ｐｉｉ［ｕｕ］がｃｔｔより小さいか否かを判断する（ステップＳ１５０１）。ｐｉｉ［ｕｕ］がｃｔｔより小さい場合（ステップＳ１５０１：Ｙｅｓ）、優先すべきユーザが切り替わった時刻ｃｔｔより前であり、優先すべきユーザが切り替わることはないので、管理ノード２０１は、ステップＳ１４０７の処理に移行する。
【０１２０】
一方、ｐｉｉ［ｕｕ］がｃｔｔ以上である場合（ステップＳ１５０１：Ｎｏ）、管理ノード２０１は、第１引数をｐｉｉ［ｕｕ］として、第２引数をｕｎａｌｌｏｃ＿ｊｉｄ［ユーザＡ］として、第３引数をｕｎａｌｌｏｃ＿ｊｉｄ［ユーザＢ］として、ユーザ選択処理を実行する（ステップＳ１５０２）。そして、管理ノード２０１は、ｒｅｔにユーザ選択処理の戻り値を設定する。そして、管理ノード２０１は、ｒｅｔの値とｕｕの値とが同一か否かを判断する（ステップＳ１５０３）。ｒｅｔの値とｕｕの値とが同一である場合（ステップＳ１５０３：Ｙｅｓ）、管理ノード２０１は、ステップＳ１４０７の処理に移行する。
【０１２１】
一方、ｒｅｔの値とｕｕの値とが同一でない場合（ステップＳ１５０３：Ｎｏ）、優先すべきユーザが切り替わったことを示すため、管理ノード２０１は、ｃｔｔにｐｉｉ［ｕｕ］の値を設定する（ステップＳ１５０４）。そして、管理ノード２０１は、ｕｕにｒｅｔの値を設定する（ステップＳ１５０５）。次に、管理ノード２０１は、ステップＳ１４０７の処理に移行する。ジョブ割り当て処理を実行することにより、管理ノード２０１は、未来時刻における計算資源を割り当てることができる。
【０１２２】
図１６は、ユーザ選択処理手順の一例を示すフローチャートである。ユーザ選択処理は、計算資源の割り当てを優先するユーザを選択する処理である。ここで、ユーザ選択処理は、第１引数として処理対象となる時刻のインデックスｉｉと、第２引数としてユーザＡのジョブ番号ｊｉｄ＿ａと、第３引数としてユーザＢのジョブ番号ｊｉｄ＿ｂとを、呼び元の関数から受け付ける。
【０１２３】
管理ノード２０１は、ｆｓ＿ａにフェアシェア予約値リスト［ｉｉ］．ｆｓ［ユーザＡ］を設定する（ステップＳ１６０１）。また、管理ノード２０１は、ｆｓ＿ｂにフェアシェア予約値リスト［ｉｉ］．ｆｓ［ユーザＢ］を設定する（ステップＳ１６０２）。次に、管理ノード２０１は、ｆｓ＿ａとｆｓ＿ｂとが同一か否かを判断する（ステップＳ１６０３）。ｆｓ＿ａとｆｓ＿ｂとが異なる場合（ステップＳ１６０３：Ｎｏ）、管理ノード２０１は、ｆｓ＿ａがｆｓ＿ｂより大きいか否かを判断する（ステップＳ１６０４）。ｆｓ＿ａがｆｓ＿ｂより大きい場合（ステップＳ１６０４：Ｙｅｓ）、管理ノード２０１は、ｕｕにユーザＡを設定する（ステップＳ１６０５）。
【０１２４】
一方、ｆｓ＿ａがｆｓ＿ｂ以下である場合（ステップＳ１６０４：Ｎｏ）、ステップＳ１６０３の処理がＮｏであるため、すなわち、ｆｓ＿ａがｆｓ＿ｂ未満である場合、管理ノード２０１は、ｕｕにユーザＢを設定する（ステップＳ１６０６）。
【０１２５】
一方、ｆｓ＿ａとｆｓ＿ｂとが同一である場合（ステップＳ１６０３：Ｙｅｓ）、管理ノード２０１は、ｊｉｄ＿ａがｊｉｄ＿ｂより大きいか否かを判断する（ステップＳ１６０７）。ｊｉｄ＿ａがｊｉｄ＿ｂ以下である場合（ステップＳ１６０７：Ｎｏ）、管理ノード２０１は、ｕｕにユーザＡを設定する（ステップＳ１６０８）。一方、ｊｉｄ＿ａがｊｉｄ＿ｂより大きい場合（ステップＳ１６０７：Ｙｅｓ）、管理ノード２０１は、ｕｕにユーザＢを設定する（ステップＳ１６０９）。
【０１２６】
ステップＳ１６０５、ステップＳ１６０６、ステップＳ１６０８、ステップＳ１６０９のうちのいずれかの処理終了後、管理ノード２０１は、ユーザ選択処理を終了する。ここで、管理ノード２０１は、ｕｕを、ユーザ選択処理の戻り値として出力する。ユーザ選択処理を実行することにより、管理ノード２０１は、資源配分に応じた回復倍率により算出されたフェアシェア予約値を用いて、優先すべきユーザを選択することができる。
【０１２７】
図１７は、フェアシェア予約値リスト初期化処理手順の一例を示すフローチャート（その１）である。図１８は、フェアシェア予約値リスト初期化処理手順の一例を示すフローチャート（その２）である。フェアシェア予約値リスト初期化処理は、フェアシェア予約値リストを初期化する処理である。
【０１２８】
管理ノード２０１は、ｉｉに０を設定するとともに、ｔｔに現在時刻を設定する（ステップＳ１７０１）。ここで、フェアシェア予約値リスト初期化処理におけるｉｉは、フェアシェア予約値リストの処理対象のインデックスの値を記憶する変数である。
【０１２９】
次に、管理ノード２０１は、ｆｓ＿ａにユーザＡのフェアシェア値を設定する（ステップＳ１７０２）。また、管理ノード２０１は、ｆｓ＿ｂにユーザＢのフェアシェア値を設定する（ステップＳ１７０３）。
【０１３０】
そして、管理ノード２０１は、ｉｉがｆｓ＿ｎｕｍより小さいか否かを判断する（ステップＳ１７０４）。ｉｉがｆｓ＿ｎｕｍ以上である場合（ステップＳ１７０４：Ｎｏ）、管理ノード２０１は、フェアシェア予約値リスト初期化処理を終了する。一方、ｉｉがｆｓ＿ｎｕｍより小さい場合（ステップＳ１７０４：Ｙｅｓ）、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｔｔにｔｔの値を設定する（ステップＳ１７０５）。そして、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｆｓ［ユーザＡ］にｆｓ＿ａの値を設定する（ステップＳ１７０６）。また、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｆｓ［ユーザＢ］にｆｓ＿ｂの値を設定する（ステップＳ１７０７）。
【０１３１】
次に、管理ノード２０１は、ｔｔに、「ＩＮＴ（現在時刻／フェアシェア予約値間隔）＊フェアシェア予約値間隔」の計算結果となる値を設定する（ステップＳ１７０８）。ここで、ＩＮＴ（）は、引数の数値の小数を切り捨てる関数である。そして、管理ノード２０１は、ｉｉをインクリメントする（ステップＳ１７０９）。
【０１３２】
次に、管理ノード２０１は、ｉｉがｆｓ＿ｎｕｍより小さいか否かを判断する（ステップＳ１８０１）。ｉｉがｆｓ＿ｎｕｍ以上である場合（ステップＳ１８０１：Ｎｏ）、管理ノード２０１は、フェアシェア予約値リスト初期化処理を終了する。一方、ｉｉがｆｓ＿ｎｕｍより小さい場合（ステップＳ１８０１：Ｙｅｓ）、管理ノード２０１は、ｔｔに、フェアシェア予約値間隔の値を追加する（ステップＳ１８０２）。そして、管理ノード２０１は、ｆｓ＿ａに、「単位時間当たりの回復値＊ユーザＡ回復倍率＊（ｔｔ−フェアシェア予約値リスト［ｉｉ−１］．ｔｔ）」の計算結果の値を追加する（ステップＳ１８０３）。また、管理ノード２０１は、ｆｓ＿ｂに、「単位時間当たりの回復値＊ユーザＢ回復倍率＊（ｔｔ−フェアシェア予約値リスト［ｉｉ−１］．ｔｔ）」の計算結果の値を追加する（ステップＳ１８０４）。
【０１３３】
次に、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｔｔにｔｔの値を設定する（ステップＳ１８０５）。そして、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｆｓ［ユーザＡ］に、ｆｓ＿ａの値を設定する（ステップＳ１８０６）。また、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｆｓ［ユーザＢ］にｆｓ＿ｂの値を設定する（ステップＳ１８０７）。そして、管理ノード２０１は、ｉｉをインクリメントする（ステップＳ１８０８）。そして、管理ノード２０１は、ステップＳ１８０１の処理に移行する。フェアシェア予約値リスト初期化処理を実行することにより、管理ノード２０１は、フェアシェア予約値リストを初期化することができる。
【０１３４】
図１９は、フェアシェア予約値リスト更新処理手順の一例を示すフローチャートである。フェアシェア予約値リスト更新処理は、フェアシェア予約値リストを更新する処理である。ここで、フェアシェア予約値リスト更新処理は、引数として、処理対象となるジョブ番号ｊｉｄを呼び元の関数から受け付ける。
【０１３５】
管理ノード２０１は、ｉｉに０を設定する（ステップＳ１９０１）。次に、管理ノード２０１は、ｎｏｄｅにｊｉｄ番号のジョブの要求ノード数を設定する（ステップＳ１９０２）。そして、管理ノード２０１は、ｅｌａｐｓｅにｊｉｄ番号のジョブの専有使用時間を設定する（ステップＳ１９０３）。次に、管理ノード２０１は、ｓｓをｊｉｄ番号のジョブの割り当て時刻に設定する（ステップＳ１９０４）。そして、管理ノード２０１は、ｕｕにｊｉｄ番号のジョブのユーザＩＤを設定する（ステップＳ１９０５）。次に、管理ノード２０１は、フェアシェア使用量にｎｏｄｅ＊ｅｌａｐｓｅの計算結果の値を設定する（ステップＳ１９０６）。
【０１３６】
そして、管理ノード２０１は、ｉｉがｆｓ＿ｎｕｍより小さいか否かを判断する（ステップＳ１９０７）。ｉｉがｆｓ＿ｎｕｍより小さい場合（ステップＳ１９０７：Ｙｅｓ）、管理ノード２０１は、フェアシェア予約値リスト［ｉｉ］．ｔｔがｓｓ以上であるか否かを判断する（ステップＳ１９０８）。フェアシェア予約値リスト［ｉｉ］．ｔｔがｓｓ以上である場合（ステップＳ１９０８：Ｙｅｓ）、管理ノード２０１は、フェアシェア使用量をフェアシェア予約値リスト［ｉｉ］．ｆｓ［ｕｕ］から減じる（ステップＳ１９０９）。
【０１３７】
ステップＳ１９０９の処理終了後、または、フェアシェア予約値リスト［ｉｉ］．ｔｔがｓｓ未満である場合（ステップＳ１９０８：Ｎｏ）、管理ノード２０１は、ｉｉをインクリメントする（ステップＳ１９１０）。そして、管理ノード２０１は、ステップＳ１９０７の処理に移行する。ｉｉがｆｓ＿ｎｕｍ以上である場合（ステップＳ１９０７：Ｎｏ）、管理ノード２０１は、フェアシェア予約値リスト更新処理を終了する。フェアシェア予約値リスト更新処理を実行することにより、管理ノード２０１は、フェアシェア予約値リストのうちの未来時刻ｓｓ以降のフェアシェア予約値を減じることができる。
【０１３８】
図２０は、イベント待ち処理手順の一例を示すフローチャート（その１）である。図２１は、イベント待ち処理手順の一例を示すフローチャート（その２）である。イベント待ち処理は、受け付けイベントに応じた処理を行うものである。
【０１３９】
管理ノード２０１は、ｅｅに受け付けイベントを設定する（ステップＳ２００１）。ここで、受け付けイベントは、新規ジョブ投入イベント、ジョブ実行開始イベント、ジョブ実行終了イベント、再スケジューリングイベント、スケジューラ停止イベントのいずれかである。
【０１４０】
次に、管理ノード２０１は、ｅｅがジョブ実行開始イベントか否かを判断する（ステップＳ２００２）。ｅｅがジョブ実行開始イベントである場合（ステップＳ２００２：Ｙｅｓ）、管理ノード２０１は、ｊｉｄに実行開始するジョブ番号を設定する（ステップＳ２００３）。次に、管理ノード２０１は、ｎｏｄｅにｊｉｄ番号のジョブの要求ノード数を設定する（ステップＳ２００４）。さらに、管理ノード２０１は、ｅｌａｐｓｅにｊｉｄ番号のジョブの専有使用時間を設定する（ステップＳ２００５）。次に、管理ノード２０１は、フェアシェア使用量にｎｏｄｅ＊ｅｌａｐｓｅの計算結果の値を設定する（ステップＳ２００６）。
【０１４１】
そして、管理ノード２０１は、ｕｕにｊｉｄ番号のジョブのユーザＩＤを設定する（ステップＳ２００７）。次に、管理ノード２０１は、ユーザｕｕフェアシェア値からフェアシェア使用量を減じる（ステップＳ２００８）。そして、管理ノード２０１は、ｊｉｄ番号のジョブを割り当てたノードに対して、ｊｉｄ番号のジョブの実行を開始させる（ステップＳ２００９）。そして、管理ノード２０１は、イベント待ち処理を終了する。
【０１４２】
一方、ｅｅがジョブ実行開始イベントでない場合（ステップＳ２００２：Ｎｏ）、管理ノード２０１は、ｅｅがジョブ実行終了イベントか否かを判断する（ステップＳ２１０１）。ｅｅがジョブ実行終了イベントである場合（ステップＳ２１０１：Ｙｅｓ）、管理ノード２０１は、ｊｉｄに実行終了したジョブ番号を設定する（ステップＳ２１０２）。次に、管理ノード２０１は、ｎｏｄｅにｊｉｄ番号のジョブの要求ノード数を設定する（ステップＳ２１０３）。そして、管理ノード２０１は、ｅｌａｐｓｅにｊｉｄ番号のジョブの専有使用時間を設定する（ステップＳ２１０４）。次に、管理ノード２０１は、ｓｓにｊｉｄ番号のジョブの実行開始時刻を設定する（ステップＳ２１０５）。次に、管理ノード２０１は、ｕｕにｊｉｄ番号のジョブのユーザＩＤを設定する（ステップＳ２１０６）。そして、管理ノード２０１は、フェアシェア返却量に「ｎｏｄｅ＊（ｅｌａｐｓｅ−（現在時刻−ｓｓ））」の計算結果の値を設定する（ステップＳ２１０７）。次に、管理ノード２０１は、フェアシェア返却量をユーザｕｕフェアシェア値に追加する（ステップＳ２１０８）。
【０１４３】
ステップＳ２１０８の処理終了後、または、ｅｅがジョブ実行終了イベントでない場合（ステップＳ２１０１：Ｎｏ）、管理ノード２０１は、イベント待ち処理を終了する。ここで、管理ノード２０１は、ｅｅを、イベント待ち処理の戻り値として出力する。イベント待ち処理を実行することにより、管理ノード２０１は、受け付けイベントに応じた処理を行うことができる。
【０１４４】
以上説明したように、管理ノード２０１によれば、単位時間当たりの各々のユーザの回復値に、現在時刻と未来時刻の差分を掛けた値を、未来時刻の計算資源の割当時に用いる値として算出する。これにより、管理ノード２０１は、各々のユーザの資源配分を反映させて、未来時刻の資源配分を適正にすることができる。
【０１４５】
また、管理ノード２０１によれば、第１の時刻におけるフェアシェア予約値を上昇させる値と現在時刻におけるフェアシェア予約値とから求めた第１の時刻におけるフェアシェア予約値を用いて、第１の時刻における計算資源を用いるユーザを決定してもよい。これにより、管理ノード２０１は、第１の時刻における計算資源を、ユーザの資源配分に応じて割り当てることができる。
【０１４６】
また、管理ノード２０１によれば、第１の時刻における計算資源を用いるユーザが有するジョブが要求する計算資源が未来時刻にある場合、ユーザが有するジョブに第１の時刻における計算資源を割り当てることを決定してもよい。これにより、管理ノード２０１は、第１の時刻における計算資源を用いるユーザが有するジョブを第１の時刻となった際に、確実にノードに割り当てることができる。
【０１４７】
また、第１の時刻における計算資源を用いるユーザが有するジョブが要求する計算資源が未来時刻にあるとする。このとき、管理ノード２０１によれば、第１の時刻におけるユーザのフェアシェア予約値を、第１の時刻におけるユーザのフェアシェア予約値を上昇させる値と、現在時刻におけるユーザのフェアシェア値と、フェアシェア使用量とに基づいて算出してもよい。また、管理ノード２０１によれば、第２の時刻におけるユーザのフェアシェア予約値を、第２の時刻におけるユーザのフェアシェア予約値を上昇させる値と、現在時刻におけるユーザのフェアシェア値と、フェアシェア使用量とに基づいて算出してもよい。ここで、第２の時刻は、第１の時刻より未来の時刻である。
【０１４８】
これにより、管理ノード２０１は、第１の時刻でジョブを割り当てたユーザはフェアシェア予約値が下がり、第１の時刻以降でジョブを割り当てにくくなるため、第１の時刻以降で、ユーザ間で公平に割り当てることができる。
【０１４９】
また、第１の時刻における計算資源を用いるユーザが有するジョブが要求する計算資源が未来時刻にないとする。このとき、管理ノード２０１によれば、第１の時刻より未来の第２の時刻における各々のユーザの優先度に基づいて、複数のユーザから第２の時刻における計算資源を割り当てるジョブを有するユーザを決定してもよい。これにより、管理ノード２０１は、管理ノード２０１は、第２の時刻における計算資源を、ユーザの資源配分に応じて割り当てることができる。
【０１５０】
また、第１の時刻における計算資源を割り当てることを決定したユーザが第２の時刻における計算資源を割り当てることを決定したユーザとは異なったとする。ここで、第２の時刻に計算資源を割り当てることを決定したユーザを、別のユーザと呼ぶ。第１の時刻の計算資源が割り当てられずに第２の時刻で優先すべきユーザが変わった場合、第１の時刻における計算資源はまだ空いており、別のユーザが有するジョブならば割り当てられる可能性がある。そこで、管理ノード２０１は、別のユーザが発行したジョブが要求する計算資源が第１の時刻にあるか否かを判断し、判断した判断結果に基づいて、別のユーザが有するジョブに前記第１の時刻における計算資源を割り当てることを決定してもよい。これにより、管理ノード２０１は、空きの第１の時刻における計算資源が割り当てられる機会を増やして、第１の時刻における計算資源を有効に活用することができる。
【０１５１】
なお、本実施の形態で説明したジョブ制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ジョブ制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本ジョブ制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１５２】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５３】
（付記１）現在時刻より未来の第１の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
制御部を有することを特徴とする並列演算装置。
【０１５４】
（付記２）前記制御部は、
算出した前記度合いと、現在時刻における前記各々のユーザの優先度とに基づいて、前記第１の時刻における前記各々のユーザの優先度を算出し、
算出した前記第１の時刻における前記各々のユーザの優先度に基づいて、前記複数のユーザから前記第１の時刻における計算資源を割り当てるジョブを有するユーザを決定することを特徴とする付記１に記載の並列演算装置。
【０１５５】
（付記３）前記制御部は、
前記第１の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が前記第１の時刻にあるか否かを判断し、
判断した判断結果に基づいて、前記ユーザが有するジョブに前記第１の時刻における計算資源を割り当てることを決定することを特徴とする付記２に記載の並列演算装置。
【０１５６】
（付記４）前記制御部は、
前記第１の時刻にあると判断した場合、前記第１の時刻または前記第１の時刻より未来の第２の時刻のいずれかの時刻における計算資源を割り当てるジョブを有するユーザを決定する際に用いる前記ユーザの優先度を上昇させる度合いと、現在時刻における前記ユーザの優先度と、前記第１の時刻における計算資源を割り当てることにより前記ユーザの優先度を低下させる度合いとに基づいて、前記いずれかの時刻における前記ユーザの優先度を算出することを特徴とする付記３に記載の並列演算装置。
【０１５７】
（付記５）前記制御部は、
前記第１の時刻にないと判断した場合、前記第１の時刻より未来の第２の時刻における前記各々のユーザの優先度に基づいて、前記複数のユーザから前記第２の時刻における計算資源を割り当てるジョブを有するユーザを決定することを特徴とする付記３または４に記載の並列演算装置。
【０１５８】
（付記６）前記制御部は、
前記第１の時刻における計算資源を割り当てることを決定したユーザが前記第２の時刻における計算資源を割り当てることを決定したユーザとは異なる場合、前記第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が前記第１の時刻にあるか否かを判断し、
判断した判断結果に基づいて、前記第２の時刻における計算資源を割り当てることを決定したユーザが有するジョブに前記第１の時刻における計算資源を割り当てることを決定することを特徴とする付記５に記載の並列演算装置。
【０１５９】
（付記７）複数のプロセッサを有する並列演算システムであって、
前記複数のプロセッサのいずれかのプロセッサは、
現在時刻より未来の第１の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
ことを特徴とする並列演算システム。
【０１６０】
（付記８）コンピュータに、
単位時間が経過することにより複数のユーザの各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いを記憶する記憶部から前記度合いを読み出し、
現在時刻より未来の第１の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、読み出した前記度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
処理を実行させることを特徴とするジョブ制御プログラム。
【０１６１】
（付記９）コンピュータが、
単位時間が経過することにより複数のユーザの各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いを記憶する記憶部から前記度合いを読み出し、
現在時刻より未来の第１の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、読み出した前記度合いと、現在時刻と前記第１の時刻との差分とに基づいて算出する、
処理を実行することを特徴とするジョブ制御方法。
【符号の説明】
【０１６２】
１０１  並列演算装置
２００  並列演算システム
４００  制御部
４０１  読出部
４０２  算出部
４０３  決定部
４０４  判断部
４０５  割当部
４１１  記憶部
【図１】
0006540107.tif 000002
【図２】
0006540107.tif 000003
【図３】
0006540107.tif 000004
【図４】
0006540107.tif 000005
【図５】
0006540107.tif 000006
【図６】
0006540107.tif 000007
【図７】
0006540107.tif 000008
【図８】
0006540107.tif 000009
【図９】
0006540107.tif 000010
【図１０】
0006540107.tif 000011
【図１１】
0006540107.tif 000012
【図１２】
0006540107.tif 000013
【図１３】
0006540107.tif 000014
【図１４】
0006540107.tif 000015
【図１５】
0006540107.tif 000016
【図１６】
0006540107.tif 000017
【図１７】
0006540107.tif 000018
【図１８】
0006540107.tif 000019
【図１９】
0006540107.tif 000020
【図２０】
0006540107.tif 000021
【図２１】
0006540107.tif 000022