以下に図面を参照して、開示の並列演算装置、並列演算システム、およびジョブ制御プログラムの実施の形態を詳細に説明する。
図1は、本実施の形態にかかる並列演算装置101の動作例を示す説明図である。並列演算装置101は、複数のユーザの各々のユーザが有するジョブに計算資源を割り当てるコンピュータである。例えば、並列演算装置101は、単一のプロセッサを有する計算機に対して、計算資源としてプロセッサを専有する時間をユーザが有するジョブに割り当てる。また、並列演算装置101は、複数のプロセッサを有する計算機に対して、計算資源として、プロセッサを専有する時間*プロセッサの数をユーザが有するジョブに割り当てる。複数のプロセッサを有する計算機は、コアが複数搭載されたプロセッサを含む計算機でもよいし、シングルコアのプロセッサが並列されたプロセッサ群を含む計算機でもよいし、シングルコアのプロセッサを含む計算機が複数あってもよい。
また、単一または複数の演算装置を有する計算機は、並列演算装置101であってもよいし、他の装置であってもよい。他の装置としては、例えば、クラスタ化したパーソナル・コンピュータであってもよい。図1の記載では、説明を単純化するため、並列演算装置101が、シングルコアのプロセッサであるCPU(Central Processing Unit)が2つ並列されたプロセッサ群である場合を例に挙げて説明する。
また、ジョブとは、ユーザから見た処理の単位を示す。ジョブと似たような概念として、プログラムの実行単位であって、固有のメモリ空間を有するプロセスや、プログラムの実行単位であって、同一プロセスに属するもの同士でメモリ空間を共有するスレッド等がある。従って、並列演算装置101は、複数のジョブとして、複数のスレッドや複数のプロセスに計算資源を割り当ててもよい。
次に、ジョブに計算資源を割り当てる処理について説明する。ジョブを割り当てるジョブスケジューラは、ユーザの操作等によって投入されたジョブを、投入順序や予め決められた静的優先度によって並び変える。ここで、静的優先度は、ユーザの間の優先度である。そして、ジョブスケジューラは、ユーザの静的優先度に基づいて並び替えたジョブ順に、ジョブの要求する計算資源の空きを探して割り当てる。
ここで、静的優先度だけに従ってジョブを割り当てると、静的優先度の高いユーザが有するジョブや、あるユーザによって先に投入されたジョブによって計算資源が専有されてしまうことがある。そこで、ジョブスケジューラは、運用中に随時更新されるユーザの動的優先度を用いてジョブを割り当てる。具体的には、ジョブスケジューラは、ユーザが現在利用中の計算資源の量が多い場合や、現在実行中のジョブの実行時間が長い場合には、該当のユーザの動的優先度を低下させ、他のユーザの動的優先度を相対的に高くするように設定する。
動的優先度は、値が大きいほどユーザが有するジョブの割り当てを優先することを示してもよいし、値が小さいほど優先することを示してもよい。そして、動的優先度は、具体的な数値でもよいし、「高の高」、「高の中」、「高の低」、「中の高」、「中の中」、「中の低」、「低の高」、「低の中」、「低の低」のような階級であってもよい。
ここで、動的優先度を用いて現在時刻より未来の未来時刻の計算資源をジョブに割り当てて、ジョブの割り当てを予約することが考えられる。未来時刻の計算資源をジョブに割り当てることを、以下、単に、「未来割り当て」と呼称する場合がある。未来割り当てを行うことにより、例えば、未来時刻の中で動的優先度の高いジョブを割り当てていない空きの計算資源を特定することができる。そして、動的優先度の高いジョブの実行開始を遅延させないように、特定した空きの計算資源を動的優先度の低いジョブに割り当てるという、「バックフィル」と呼ばれる技術を行うことができる。また、未来割り当てを行うことにより、未来割り当てを行ったジョブを有するユーザに、ジョブの終了時刻を通知することができる。
しかしながら、現在時刻における各々のユーザの優先度を用いて未来時刻における計算資源をユーザが有するジョブに割り当てると、各々のユーザの資源配分を反映させて未来時刻における計算資源を割り当てることができない場合がある。具体的には、未来時刻における計算資源を割り当てる際、時間が経過していないので、各々のユーザの優先度を単位時間が経過することにより各々のユーザの資源配分に応じて上昇させることが考慮されず、各々のユーザの資源配分を反映させることができなくなる。また、各々のジョブに割り当てられた計算資源の量を監視することは、ジョブやプロセッサの個数が増加するにつれて困難なものになる。ここで、各々のユーザの資源配分を反映させたい理由としては、例えば、各々のユーザの資源配分を、ユーザAが計算機を利用するために支払った金額と、ユーザBが計算機を利用するために支払った金額との比率に近づけたいことがあげられる。
そこで、本実施の形態にかかる並列演算装置101は、単位時間が経過することにより各々のユーザの資源配分に応じて各々のユーザの優先度を上昇させる度合いに、現在時刻と未来時刻の差分を掛けた値を、未来時刻の計算資源の割当時に用いる値として算出する。これにより、並列演算装置101は、各々のユーザの資源配分を反映させて、未来時刻の資源配分を適正にすることができる。
ここで、各々のユーザの動的優先度を単位時間が経過することにより各々のユーザの資源配分に応じて上昇させる度合いは、ユーザの動的優先度が数値である場合、1より大きい値であって、ユーザの動的優先度に乗算する値である。また、この上昇させる度合いは、0より大きい値であって、ユーザの動的優先度に加える値でもよい。
例えば、動的優先度が、「高の高」、…、「低の低」のような階級であるとする。そして、ユーザA、Bの現在時刻における動的優先度がともに「低の低」であるとする。そして、上昇させる度合いを、ユーザAが2階級であり、ユーザBが1階級であるとする。
このとき、並列演算装置101は、現在時刻から3単位時間後の未来の時刻におけるユーザAの動的優先度を上昇させる度合いを、ユーザAの回復倍率2*3単位時間=6段階と算出する。そして、並列演算装置101は、現在時刻から3単位時間後の未来の時刻におけるユーザAの動的優先度を、「低の低」から6段階あげた「高の低」に決定する。
同様に、並列演算装置101は、現在時刻から3単位時間後の未来の時刻におけるユーザBの動的優先度を上昇させる度合いを、ユーザBの回復倍率1*3単位時間=3段階と算出する。そして、並列演算装置101は、現在時刻から1単位時間後の未来の時刻におけるユーザBの動的優先度を、「低の低」から3段階あげた「中の低」に決定する。そして、並列演算装置101は、現在時刻から3単位時間後の未来の時刻の計算資源を割り当てるユーザを、未来の時刻におけるユーザA、Bの優先度に基づいて決定する。
以下の説明では、現在時刻における動的優先度として、「フェアシェア値」と呼ばれる値を用いる場合について説明する。フェアシェア値は、フェアシェア初期値を上限としており、フェアシェア初期値よりも大きくなることはない値である。また、フェアシェア値は負の値となってもよい。フェアシェア値は、値が大きいほど優先してユーザが有するジョブを割り当てることを示す値である。そして、未来時刻における動的優先度を、以下、「フェアシェア予約値」と呼称する。また、各々のユーザが有するジョブに計算資源が割り当てられることによるユーザのフェアシェア値を低下させる度合いを、以下、「フェアシェア使用量」と呼称する場合がある。
そして、単位時間が経過することにより各々のユーザの資源配分に応じた各々のユーザの優先度を上昇させる度合いは、単位時間が経過することにより各ユーザで共通として優先度を上昇させる値に、各々のユーザの資源配分に応じた倍率を掛けたものとする。以下、単位時間が経過することにより各ユーザで共通として優先度を上昇させる値を、以下、「単位時間当たりの回復値」と呼称する。また、各々のユーザの資源配分に応じた倍率を、「ユーザの回復倍率」と呼称する。また、単位時間当たりの回復値とユーザの回復倍率とを掛けた値を、「単位時間当たりのユーザの回復値」と呼称する。
図1を用いて、並列演算装置101の処理を説明する。図1に示す並列演算装置101は、CPU#1とCPU#2とを有する。また、並列演算装置101は、ユーザAが有するジョブとユーザBが有するジョブとを実行するものとする。また、符号102で示すように、ユーザAの回復倍率とユーザBの回復倍率との比を、2:1とする。従って、図1では、ユーザAに割り当てられる計算資源が、ユーザBに割り当てられる計算資源の2倍に近づくことを目標とする。
ここで、図1の例では、ユーザAが有するジョブは、複数あってもよいし、単一のジョブを何度も実行するものでもよいし、単一のジョブを同時に実行するものでもよい。ユーザBが有するジョブも同様であるとする。そして、ジョブの1回の実行の際には、ジョブは、100秒×1CPU=100の計算資源を要求するものとする。また、説明の簡略化のため、ユーザAのフェアシェア値とユーザBのフェアシェア値とが同値である場合、並列演算装置101は、ユーザBが有するジョブに優先して計算資源を割り当てるものとする。
また、単位時間当たりの回復値を、0.5とする。従って、単位時間当たりのユーザAの回復値は、1となる。また、単位時間当たりのユーザBの回復値は、0.5となる。また、図1の例では、現在時刻t0におけるユーザAのフェアシェア値が300であり、ユーザBのフェアシェア値が250であるとする。図1では、現在時刻および未来時刻における計算資源の割り当てを、フェアシェア予約値を用いて行う例を示す。現在時刻におけるフェアシェア予約値は、フェアシェア値と同一の値を有する。
図1に示すグラフ103は、フェアシェア予約値に従って各々のユーザが有するジョブに計算資源を割り当てた際のフェアシェア予約値の時系列変化を示す。また、枠104は、計算資源を模式したものである。グラフ103の横軸は、時刻を示す。グラフ103の縦軸は、フェアシェア予約値を示す。また、グラフ103は、ユーザAのフェアシェア予約値の時系列変化を実線で示すとともに、ユーザBのフェアシェア予約値の時系列変化を破線で示す。
現在時刻t0=0[秒]において、並列演算装置101は、ユーザAのフェアシェア予約値が300であり、ユーザBのフェアシェア予約値が250であるため、ユーザAが有するジョブに時刻t0における計算資源を割り当てることを決定する。そして、時刻t0には、ユーザAが有するジョブが要求する計算資源があるため、並列演算装置101は、ユーザAが有するジョブに、CPU#2の0〜100[秒]を割り当てることを決定する。そして、並列演算装置101は、時刻t0以降におけるユーザAのフェアシェア予約値を100減じる。例えば、並列演算装置101は、時刻t0におけるユーザAのフェアシェア予約値を、300−100=200とする。
新たなジョブに計算資源を割り当てる際には、並列演算装置101は、また現在時刻から割り当てが可能かを判断する。現在時刻t0=0[秒]において、並列演算装置101は、ユーザAのフェアシェア予約値が200であり、ユーザBのフェアシェア予約値が250であるため、ユーザBが有するジョブに時刻t0における計算資源を割り当てることを決定する。そして、時刻t0には、ユーザBが有するジョブが要求する計算資源があるため、並列演算装置101は、ユーザBが有するジョブに、CPU#1の0〜100[秒]を割り当てることを決定する。そして、並列演算装置101は、時刻t0以降におけるユーザBのフェアシェア予約値を100減じる。例えば、並列演算装置101は、時刻t0におけるユーザBのフェアシェア予約値を、250−100=150とする。
前述したように、新たなジョブに計算資源を割り当てる際には、並列演算装置101は、また現在時刻から割り当てが可能かを判断する。現在時刻t0=0[秒]において、並列演算装置101は、ユーザAのフェアシェア予約値が200であり、ユーザBのフェアシェア予約値が150であるため、ユーザAが有するジョブに時刻t0における計算資源を割り当てることを決定する。
しかしながら、時刻t0には、ユーザAが有するジョブが要求する計算資源がないため、並列演算装置101は、時刻t0の未来となる第1の時刻として、時刻t1=100[秒]における計算資源を割り当てるジョブを有するユーザを決定する。この際、並列演算装置101は、時刻t1におけるフェアシェア予約値を算出するために用いる時刻t1におけるフェアシェア予約値を上昇させる値を、単位時間当たりのユーザの回復値と、時刻t1と現在時刻との差分とを掛けた値として算出する。図1の例では、並列演算装置101は、時刻t1におけるユーザAのフェアシェア予約値を上昇させる値を、1*(100−0)=100と算出する。また、並列演算装置101は、時刻t1におけるユーザBのフェアシェア予約値を上昇させる値を、0.5*(100−0)=50と算出する。
そして、並列演算装置101は、時刻t1における各々のユーザのフェアシェア予約値を上昇させる値と現在時刻におけるフェアシェア予約値との和を、時刻t1における各々のユーザのフェアシェア予約値として算出する。図1の例では、並列演算装置101は、時刻t1におけるユーザAのフェアシェア予約値を、200+100=300と算出する。並列演算装置101は、時刻t1におけるユーザBのフェアシェア予約値を、150+50=200と算出する。
ここで、時刻t1における各々のユーザのフェアシェア予約値を算出した際の現在時刻は、厳密には、時刻t1における各々のユーザのフェアシェア予約値を上昇させる値を算出した際の現在時刻から少し進んだ時刻となる。しかしながら、2つの現在時刻の差は微小であるから、2つの現在時刻におけるフェアシェア予約値は、同一値であるものとして扱ってよい。
そして、並列演算装置101は、時刻t1=100[秒]における各々のユーザにおけるフェアシェア予約値に基づいて、時刻t1における計算資源を割り当てるジョブを有するユーザを決定する。図1の例では、並列演算装置101は、ユーザAのフェアシェア予約値が300であり、ユーザBのフェアシェア予約値が200であるため、ユーザBが有するジョブに時刻t1における計算資源を割り当てることを決定する。そして、時刻t1には、ユーザAが有するジョブが要求する計算資源があるため、並列演算装置101は、ユーザAが有するジョブに、CPU#2の時刻t1=100〜200[秒]を割り当てることを決定する。
そして、並列演算装置101は、未割り当てのジョブがなくなるまで繰り返す。グラフ103では、未来時刻t2=200〜t3=300[秒]の割り当てと、未来時刻t3=300〜t4=400[秒]の割り当てとを行った例を示す。未来時刻t1〜t4において、ユーザAとユーザBとのジョブの割り当て率は、4:2=2:1であり、図1の例では、ユーザAに割り当てられる計算資源が、ユーザBに割り当てられる計算資源の2倍となる。このように、並列演算装置101は、各々のユーザのフェアシェア予約値に基づいて未来時刻の計算資源を用いることにより、各々のユーザの資源配分を反映した資源配分を行うことができる。
なお、上述した説明では、並列演算装置101は、各々のユーザのフェアシェア予約値に基づいて未来時刻の計算資源を割り当てたが、一人以上のユーザを有する各々のユーザグループのフェアシェア予約値に基づいて計算資源を割り当ててもよい。また、上述した説明では、並列演算装置101は、時刻t1における各々のユーザのフェアシェア予約値を上昇させる値を算出した後、時刻t1における各々のユーザのフェアシェア予約値を算出したが、これに限らない。例えば、時刻t1における各々のユーザのフェアシェア予約値を上昇させる値を算出する装置と、時刻t1における各々のユーザのフェアシェア予約値を算出する装置とが異なってもよい。次に、並列演算装置101を、並列演算システム200に適用した例を図2に示す。
図2は、並列演算システム200のハードウェア構成例を示すブロック図である。並列演算システム200は、管理ノード201と、複数のノードとして、ノード#1〜#nを有する。nは、2以上の整数である。ここで、管理ノード201は、図1で示した並列演算装置101に相当する。ノード#1〜#nは、図1における、CPU#1、2に相当する。管理ノード201とノード#1〜#nとは、インターコネクト202により接続される。並列演算システム200は、例えば、スーパーコンピュータである。
管理ノード201は、管理ノード201とノード#1〜#nとのうちの少なくともノード#1〜#nをジョブに割り当てる装置である。ノード#1〜#nは、割り当てられたノードを実行する装置である。以降の説明では、管理ノード201は、ノード単位でジョブを割り当てるものとする。
図3は、管理ノード201のハードウェアの一例を示すブロック図である。図3において、管理ノード201は、CPU301と、ROM(Read−Only Memory)302と、RAM(Random Access Memory)303と、を含む。また、管理ノード201は、ディスクドライブ304およびディスク305と、通信インターフェース306と、を含む。また、CPU301〜ディスクドライブ304、通信インターフェース306はバス307によってそれぞれ接続される。
CPU301は、管理ノード201の全体の制御を司る演算処理装置である。また、管理ノード201は、複数のCPUを有してもよい。ROM302は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。RAM303は、CPU301のワークエリアとして使用される揮発性メモリである。
ディスクドライブ304は、CPU301の制御に従ってディスク305に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ304には、例えば、磁気ディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク305は、ディスクドライブ304の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ304が磁気ディスクドライブである場合、ディスク305には、磁気ディスクを採用することができる。また、ディスクドライブ304が光ディスクドライブである場合、ディスク305には、光ディスクを採用することができる。また、ディスクドライブ304がソリッドステートドライブである場合、ディスク305には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
通信インターフェース306は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース306は、通信回線を通じてネットワークを介して他の装置に接続される。通信インターフェース306には、例えば、モデムやLAN(Local Area Network)アダプタなどを採用することができる。
また、並列演算システム200の管理者が、管理ノード201を直接操作する場合、管理ノード201は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。また、図示していないが、ノード#1〜#nも、管理ノード201と同様のハードウェアを有する。
(管理ノード201の機能構成例)
図4は、管理ノード201の機能構成例を示すブロック図である。管理ノード201は、制御部400を有する。制御部400は、読出部401と、算出部402と、決定部403と、判断部404と、割当部405とを有する。制御部400は、記憶装置に記憶されたプログラムをCPU301が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図3に示したROM302、RAM303、ディスク305などである。また、各部の処理結果は、CPU301のレジスタや、CPU301のキャッシュメモリ等に格納される。
また、管理ノード201は、記憶部411にアクセス可能である。記憶部411は、RAM303、ディスク305といった記憶装置である。記憶部411は、各ユーザのフェアシェア初期値と、単位時間当たりの回復値と、各ユーザの回復倍率と、各ユーザのフェアシェア値と、未来時刻における各ユーザのフェアシェア予約値をまとめたフェアシェア予約値リストとを有する。
また、記憶部411は、本実施の形態による未来時刻におけるジョブの割り当て状況を示すスケジューリング情報を記憶する。また、スケジューリング情報は、現在時刻におけるジョブの割り当て状況を含んでもよい。例えば、図1の例を用いると、スケジューリング情報は、ユーザAが有するジョブをCPU#2の現在時刻t0〜未来時刻t1に割り当てることと、…、ユーザBが有するジョブをCPU#1の未来時刻t3〜未来時刻t4に割り当てることを示す。
フェアシェア予約値リストは、並列演算システム200の管理者によって予め指定されたフェアシェア予約値間隔ごとに作成された配列である。フェアシェア予約値リストの各配列要素は、各配列要素の時刻を格納するメンバttと、各々のユーザのフェアシェア予約値を格納する配列メンバfsを持つ。fsは、ユーザごとの配列となる。フェアシェア予約値リストの先頭の要素には、現在時刻の情報が格納される。また、フェアシェア予約値リストの2番目以降の配列要素には、フェアシェア予約値間隔後の時刻の情報が格納される。
読出部401は、単位時間当たりのユーザの回復値を記憶部411から読み出す。
算出部402は、第1の時刻における計算資源を割り当てるジョブを有するユーザを決定する際に用いる各々のユーザのフェアシェア予約値を上昇させる値を、読み出した単位時間当たりのユーザの回復値と、現在時刻と第1の時刻との差分とに基づいて算出する。
また、算出部402は、算出した各々のユーザのフェアシェア予約値を上昇させる値と、現在時刻における各々のユーザのフェアシェア予約値とに基づいて、第1の時刻における各々のユーザのフェアシェア予約値を算出してもよい。例えば、算出部402が、ユーザAのフェアシェア予約値を上昇させる値が100であると算出したとする。そして、現在時刻におけるユーザAのフェアシェア予約値が200であるとする。このとき、算出部402は、第1の時刻における各々のユーザのフェアシェア予約値を、100+200=300であると算出する。算出部402は、算出したフェアシェア予約値を、フェアシェア予約値リストのうちのユーザと時刻とが対応する要素に格納する。
決定部403は、算出部402が算出した第1の時刻における各々のユーザのフェアシェア予約値に基づいて、複数のユーザから第1の時刻における計算資源を割り当てるジョブを有するユーザを決定する。例えば、決定部403は、第1の時刻におけるフェアシェア予約値が最も大きい値を有するユーザを、第1の時刻における計算資源を割り当てるジョブを有するユーザとして決定する。または、決定部403は、第1の時刻におけるフェアシェア予約値が最も大きい値を有するユーザが複数存在する場合、発行が早いジョブを有するユーザを、第1の時刻における計算資源を割り当てるジョブを有するユーザとして決定してもよい。
判断部404は、決定部403が第1の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が第1の時刻にあるか否かを判断する。具体的には、判断部404は、スケジューリング情報を参照して、第1の時刻における空き計算資源を特定する。そして、判断部404は、特定した空き資源が、決定したユーザが有するジョブが要求する計算資源を満たすか否かを判断する。
そして、決定部403は、判断部404が判断した判断結果に基づいて、ユーザが有するジョブに第1の時刻における計算資源を割り当てることを決定してもよい。割り当てることを決定した場合、決定部403は、ユーザが有するジョブに第1の時刻における計算資源を割り当てることをスケジューリング情報に記憶する。
そして、判断部404が、決定したユーザが有するジョブが要求する計算資源が第1の時刻にあると判断したとする。このとき、管理ノード201は、決定したユーザの第1の時刻または第1の時刻より未来の第2の時刻のいずれかの時刻におけるフェアシェア予約値を、第1の時刻における計算資源を割り当てることによるフェアシェア使用量分下げることになる。具体的には、算出部402は、いずれかの時刻におけるユーザのフェアシェア予約値を上昇させる値と、現在時刻におけるユーザのフェアシェア予約値と、フェアシェア使用量とに基づいて、いずれかの時刻におけるユーザのフェアシェア予約値を算出する。
例えば、図1の例を用いると、管理ノード201が、ユーザAが有するジョブに第1の時刻として未来時刻である未来時刻t1=100[秒]〜t2=200[秒]を割り当てたとする。そして、未来時刻t1におけるユーザAのフェアシェア予約値を上昇させる値が、1*100=100であるとする。また、現在時刻t0におけるフェアシェア予約値が200であるとする。そして、フェアシェア使用量を100とする。
この場合、算出部402は、現在時刻t0におけるフェアシェア予約値と未来時刻t1におけるユーザAのフェアシェア予約値を上昇させる値とを加えた値からフェアシェア使用量を減じた値を、未来時刻t1におけるユーザAのフェアシェア予約値として算出する。すなわち、算出部402は、未来時刻t1におけるユーザAのフェアシェア予約値を、200+100−100=200であると算出する。
同様に、第1の時刻より未来の第2の時刻となる未来時刻t2におけるユーザAのフェアシェア予約値を上昇させる値が、1*200=200であるとする。算出部402は、現在時刻t0におけるフェアシェア予約値と未来時刻t2におけるユーザAのフェアシェア予約値を上昇させる値とを加えた値からフェアシェア使用量を減じた値を、未来時刻t2におけるユーザAのフェアシェア予約値として算出する。すなわち、算出部402は、未来時刻t1におけるユーザAのフェアシェア予約値を、200+200−100=300であると算出する。
また、判断部404が、決定したユーザが有するジョブが要求する計算資源が第1の時刻にないと判断したとする。このとき、決定部403は、第1の時刻より未来の第2の時刻における各々のユーザのフェアシェア予約値に基づいて、複数のユーザから第2の時刻における計算資源を割り当てるジョブを有するユーザを決定してもよい。
また、第1の時刻における計算資源を割り当てることを決定したユーザが第2の時刻における計算資源を割り当てることを決定したユーザとは異なったとする。この場合、判断部404は、第2の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が第1の時刻にあるか否かを判断する。
また、決定部403は、判断した判断結果に基づいて、第2の時刻における計算資源を割り当てることを決定したユーザが有するジョブに第1の時刻における計算資源を割り当てることを決定してもよい。具体的には、判断部404は、スケジューリング情報を参照して、第1の時刻における空き計算資源を特定する。そして、判断部404は、特定した空き資源が、第2の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源を満たすか否かを判断する。
割当部405は、スケジューリング情報を参照して、割り当てを決定したジョブの割り当て時刻となった際に、該当のジョブをノードに割り当てる。
次に、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア更新例について、図5〜図10を用いて説明する。図5〜図10の例では、実行待ちのジョブは、ジョブ番号の昇順に投入されるものとする。そして、ジョブ番号j1、j2、j5、j6、j9のジョブは、ユーザAが投入したジョブであり、ジョブ番号j3、j4、j7、j8、j10のジョブはユーザBが投入したジョブである。また、全てのジョブにおいて、各ジョブが要求する計算資源は、100ノード*100[秒]=10000とし、専有使用時間=100[秒]を使い切って終了するものとする。ここで、前述したジョブの条件は、分りやすく説明するためのものであり、各ジョブは、個別の計算資源、個別の専有使用時間を有してもよい。また、並列演算システム200が有するノードの個数は、200であるとする。
そして、フェアシェア初期値は、ユーザA、ユーザBともに60000とする。また、現在時刻t0におけるユーザAのフェアシェア値は、40000であるとする。また、現在時刻t0におけるユーザBのフェアシェア値は、45000であるとする。そして、単位時間当たりの回復値は、50とする。そして、ユーザの回復倍率は、ユーザAとユーザBとで1:1の比となるように、ユーザAの回復倍率=1、ユーザBの回復倍率=1とする。図5〜図10では、ユーザA、Bに対して公平に計算資源が配分されることが目標となる。また、図5〜図10内に示した(1)〜(10)および、図5〜図10に対する説明における(1)〜(10)は、ジョブの割り当て順番を示す。
図5は、フェアシェア予約値により未来時刻の資源配分を行う際の一例を示す説明図である。また、図6〜図9は、それぞれ、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例を示す説明図(その1)〜(その4)である。具体的には、図6〜図9では、ジョブを割り当てていない状態が続く場合と、(1)〜(10)の後とのフェアシェア予約値を示すグラフ601〜603、701〜703、801〜803、901、902を示す。グラフ601〜603、701〜703、801〜803、901、902の横軸は、時刻を示し、縦軸はフェアシェア予約値を示す。また、グラフ601〜603、701〜703、801〜803、901、902における太い点線がユーザAのフェアシェア予約値を示し、太い実線がユーザBのフェアシェア予約値を示す。
図5では、現在時刻t0、未来時刻t1〜未来時刻t5までに割り当てられるジョブの順番が、図5の(1)〜(10)で示される。ここで、未来時刻t1は、現在時刻t0から専有使用時間が経過した場合の未来の時刻である。そして、2以上の整数nについて、未来時刻t(n)は、未来時刻t(n−1)から専有使用時間が経過した場合の未来時刻である。
図6の(a)では、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、ジョブを割り当てていない状態が続く場合における、各時刻のフェアシェア予約値を示すグラフ601を表示する。グラフ601に示すように、現在時刻t0では、ユーザAのフェアシェア予約値が40000であり、ユーザBのフェアシェア予約値が45000であるため、ユーザBのフェアシェア予約値の方が高くなる。そして、グラフ601に示すように、ユーザAのフェアシェア予約値は、現在時刻t0以降について、専有使用時間の経過のたびに50*100ノード=5000回復して、未来時刻t4にフェアシェア初期値に到達することになる。同様に、ユーザBのフェアシェア予約値は、現在時刻t0以降について、専有使用時間の経過のたびに50*100ノード=5000回復して、未来時刻t3に、フェアシェア初期値に到達することになる。
管理ノード201は、現在時刻t0におけるユーザBのフェアシェア予約値がユーザAのフェアシェア予約値より高いため、図5の(1)として、ユーザBのジョブj3を選択して現在時刻t0に割り当て可能か判断する。この場合、現在時刻t0に要求された空き計算資源が存在するため、管理ノード201は、ジョブj3に空き計算資源を割り当てる。
図6の(b)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(1)でジョブj3を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ602を示す。グラフ602が示すように、管理ノード201は、ジョブj3に現在時刻t0における空き計算資源を割り当てたため、ジョブj3のオーナとなるユーザBの現在時刻t0以降全ての未来時刻についてフェアシェア予約値を10000減じる。例えば、ユーザBの現在時刻t0におけるフェアシェア使用値は、45000−10000=35000となる。また、ユーザBの未来時刻t1におけるフェアシェア使用値は、50000−10000=40000となる。ユーザAのフェアシェア予約値については、グラフ601で示したままとなる。
次のジョブの割り当てでは、管理ノード201は、もう一度現在時刻t0から処理を始める。図5の(1)について、管理ノード201がジョブj3を割り当てたため、現在時刻t0では、ユーザAのフェアシェア予約値が40000であり、ユーザBのフェアシェア予約値が35000となっており、ユーザAのフェアシェア予約値の方が高くなる。このため、管理ノード201は、図5の(2)として、ユーザAのジョブj1を選択して現在時刻t0に割り当て可能か判断する。この場合、現在時刻t0に要求された空き計算資源が存在するので、管理ノード201は、ジョブj1に空き計算資源を割り当てる。
図6の(c)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(2)でジョブj1を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ603を示す。グラフ603が示すように、管理ノード201は、ジョブj1に現在時刻t0における空き計算資源を割り当てたため、ジョブj1のオーナであるユーザAの現在時刻t0以降全ての未来時刻についてフェアシェア予約値を10000減じる。例えば、ユーザAの現在時刻t0におけるフェアシェア使用値は、40000−10000=30000となる。また、ユーザAの未来時刻t1におけるフェアシェア使用値は、45000−10000=35000となる。ユーザBのフェアシェア予約値については、グラフ602で示したままとなる。
次のジョブの割り当てでは、管理ノード201は、もう一度現在時刻t0から処理を始める。図5の(2)について、ジョブj1が割り当てられたため、現在時刻t0では、ユーザAのフェアシェア予約値が30000であり、ユーザBのフェアシェア予約値が35000であるため、ユーザBのフェアシェア予約値の方が高くなる。このため、管理ノード201は、ユーザBのジョブj4を選択して現在時刻t0に割当て可能か判断する。この場合、現在時刻t0に要求された空き計算資源がないため、管理ノード201は、割り当て不可と判断する。
現在時刻t0に割り当てられないため、管理ノード201は、現在時刻t0の次の未来時刻となる未来時刻t1のフェアシェア予約値を参照する。未来時刻t1では、ユーザAのフェアシェア予約値が35000であり、ユーザBのフェアシェア予約値が40000であるため、ユーザBのフェアシェア予約値が高い状態が続く。このため、管理ノード201は、ユーザBのジョブj4を選択して未来時刻t1に割り当て可能か判断する。この場合、未来時刻t1に要求された空き計算資源が存在するので、図5の(3)として、ジョブj4に空き計算資源を割り当てる。
図7の(a)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(3)でジョブj4を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ701を示す。グラフ701が示すように、管理ノード201は、ジョブj4に時刻t1における空き計算資源を割り当てたため、ジョブj4のオーナであるユーザBの未来時刻t1以降全ての未来時刻についてフェアシェア予約値を10000減じる。例えば、ユーザBの未来時刻t1におけるフェアシェア使用値は、40000−10000=30000となる。また、ユーザBの未来時刻t2におけるフェアシェア使用値は、45000−10000=35000となる。ユーザAのフェアシェア予約値については、グラフ603で示したままとなる。
次のジョブの割り当てでは、管理ノード201は、もう一度現在時刻t0から処理を始める。図5の(3)について、ジョブj4は未来時刻t1に割り当てられたため、現在時刻t0のフェアシェア予約値に変更はない。従って、ユーザAのフェアシェア予約値が30000であり、ユーザBのフェアシェア予約値が35000であるため、ユーザBのフェアシェア予約値が高くなる。このため、管理ノード201は、ユーザBのジョブj7を選択して現在時刻t0に割り当て可能か判断する。この場合、現在時刻t0に要求された空き計算資源がないため、管理ノード201は、割り当て不可と判断する。
現在時刻t0に割り当てられないため、管理ノード201は、次の未来時刻t1のフェアシェア予約値を参照する。未来時刻t1では、ユーザAのフェアシェア予約値が35000であり、ユーザBのフェアシェア予約値が30000であるため、ユーザAのフェアシェア予約値の方が高くなる。優先するユーザがユーザBからユーザAに変更されると、管理ノード201は、今度はユーザAのジョブを選択して現在時刻t0から割り当て可能かをチェックすることになる。ここで、未来時刻t1までのフェアシェア予約値は、ユーザAよりユーザBの方が高くなっていたが、ユーザBのジョブは割り当て不可だったので、未来時刻t1より前の時刻において割り当て可能かを判断しても無駄となる。そこで、管理ノード201は、優先するユーザが切り替わった時刻をユーザ優先度変更時刻cttに記憶しておき、時刻cttまではフェアシェア予約値の判断を行わずユーザAを優先して処理してもよい。これにより、管理ノード201は、無駄な処理を省いて、時刻cttにおけるユーザAのジョブ割り当てを可能にする。
現在時刻t0はctt=未来時刻t1よりも前なので、管理ノード201は、フェアシェア予約値の判断を行わず、ユーザAを優先してのジョブj2を選択し、現在時刻t0に割り当て可能か判断する。この場合、現在時刻t0に要求された空き計算資源がないため、管理ノード201は、割り当て不可と判断する。
そして、現在時刻t0に割り当てられないため、次の未来時刻t1に割り当て可能かを判断することになるが、未来時刻t1はctt=未来時刻t1よりも前ではないので、管理ノード201は、フェアシェア予約値の判断を行うことになる。未来時刻t1のフェアシェア予約値を参照すると、ユーザAのフェアシェア予約値が35000であり、ユーザBのフェアシェア予約値が30000であるから、ユーザAのフェアシェア予約値の方が高く、優先するユーザに変更はない。この結果、管理ノード201は、引き続きユーザAを優先してジョブj2を選択して、未来時刻t1に割り当て可能か判断する。この場合、未来時刻t1に要求された空き計算資源が存在するので、管理ノード201は、図5の(4)として、ジョブj2に空き計算資源を割り当てる。
図7の(b)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(4)でジョブj2を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ702を示す。グラフ702が示すように、管理ノード201は、ジョブj2に時刻t1における空き計算資源を割り当てたため、ジョブj2のオーナであるユーザAの未来時刻t1以降全ての未来時刻についてフェアシェア予約値を10000減じる。例えば、ユーザAの未来時刻t1におけるフェアシェア使用値は、35000−10000=25000となる。また、ユーザAの未来時刻t2におけるフェアシェア使用値は、40000−10000=30000となる。ユーザBのフェアシェア予約値については、グラフ701で示したままとなる。
以降のジョブの割り当ても同様に、管理ノード201は、現在時刻t0から処理を始め、各未来時刻のフェアシェア予約値を参照して優先するユーザを切り替えることにより、順番にジョブを割り当てる。
具体的には、管理ノード201は、図5の(5)と図5の(6)として、ユーザBのジョブj7とユーザAのジョブj5とに未来時刻t2における空き計算資源を割り当てる。そして、図7の(c)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(5)でジョブj7を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ703を示す。また、図8の(a)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(6)でジョブj5を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ801を示す。
また、管理ノード201は、図5の(7)と図5の(8)として、ユーザBのジョブj8とユーザAのジョブj6とに未来時刻t3における空き計算資源を割り当てる。そして、図8の(b)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(7)でジョブj8を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ802を示す。また、図8の(c)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(8)でジョブj6を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ803を示す。
また、管理ノード201は、図5の(9)と図5の(10)として、ユーザBのジョブj10とユーザAのジョブj9とに未来時刻t4における空き計算資源を割り当てる。そして、図9の(a)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(9)でジョブj10を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ901を示す。また、図9の(b)は、フェアシェア予約値により未来時刻の資源配分を行う際のフェアシェア予約値の更新例として、図5の(10)でジョブj9を割り当てた後における、各時刻のフェアシェア予約値を示すグラフ902を示す。
ジョブj1〜j10の未来割り当ての結果、図5〜図9で示すように、ユーザA、ユーザBのジョブが、現在時刻t0〜未来時刻t4のそれぞれで、公平に割り当てられることがわかる。このように、管理ノード201は、未来割り当てする予約ジョブに対して目標通り計算資源を公平に配分する制御を行うことができる。
図10は、フェアシェア予約値の更新一覧の例を示す説明図である。図10では、図5〜図9で示したフェアシェア予約値の更新状況の一覧を示す表1001を示す。具体的には、表1001は、現在時刻t0、未来時刻t1〜t9ごとに、ジョブを割り当てる前と、図5の(1)〜(10)の後とにおけるユーザAとユーザBとのフェアシェア予約値を示す。
次に、図5〜図10で説明したフェアシェア予約値による未来時刻の資源配分の効果の比較として、フェアシェア値により未来時刻の資源配分を行う際の例を、図11を用いて示す。
図11は、フェアシェア値により未来時刻の資源配分を行う際の一例を示す説明図である。図11の例では、計算資源を割り当てる装置が、現在時刻と未来時刻とにおける計算資源をジョブに割り当てるスケジューリング処理を行うものとする。また、図11の例では、実行待ちのジョブは、ジョブ番号の昇順に投入されるものとする。そして、ユーザAが投入したジョブと、ユーザBが投入したジョブについては、図5〜図10と同一とする。また、各ジョブが要求する計算資源についてと、フェアシェア初期値と、現在時刻t0におけるユーザA、Bのフェアシェア値と、単位時間当たりの回復値と、ユーザA、Bの回復倍率とは、図5〜図10と同一であるとする。回復倍率がユーザA:ユーザB=1:1であるため、公平に計算資源が配分されることが目標となる。
また、図11では、現在時刻t0、未来時刻t1〜未来時刻t5までに割り当てられるジョブの順番が、図11の(1)〜(10)で示される。
計算資源を割り当てる装置は、現在時刻t0におけるユーザBのフェアシェア値がユーザAのフェアシェア値より高いため、図11の(1)として、ユーザBのジョブj3を選択して現在時刻t0に割り当て可能か判断する。この場合、現在時刻t0に要求された空き計算資源が存在するため、計算資源を割り当てる装置は、ジョブj3に空き計算資源を割り当てる。
ここで、計算資源を割り当てる装置は、現在時刻を含めた未来割り当てする予約ジョブが存在する間、ジョブ実行開始によるフェアシェア値の変更を待たず、次々に未来割り当て処理を継続する。従って、ジョブj3が割り当てられた後のフェアシェア値は、ユーザAのフェアシェア値が40000であり、ユーザBのフェアシェア値が45000と変わらない。この結果、ユーザBのフェアシェア値が高いままであるから、計算資源を割り当てる装置は、図11の(2)として、ユーザBのジョブj4を選択して、ジョブj4に現在時刻t0における空き計算資源を割り当てる。
この時点で現在時刻t0における全ての計算資源が割り当て済みとなるが、未来割り当てする予約ジョブはまだ残っているので、計算資源を割り当てる装置は、スケジューリング処理を継続する。次に計算資源の空きが発生するのはジョブj3とジョブj4とが実行終了する予定である未来時刻t1のタイミングとなる。
ジョブj4が割り当てられた後のフェアシェア値も同様に変わらないので、ユーザAのフェアシェア値が40000であり、ユーザBのフェアシェア値が45000となる。この結果、ユーザBのフェアシェア値が高いままであるから、計算資源を割り当てる装置は、図11の(3)として、ユーザBのジョブj7を選択して、ジョブj7に未来時刻t1における空き計算資源を割り当てる。ジョブj7が割り当てられた後のフェアシェア値も同様に変わらないので、計算資源を割り当てる装置は、図11の(4)として、ユーザBのジョブj8を選択して、ジョブj8に未来時刻t1における空き計算資源を割り当てる。
この時点で未来時刻t1の全ての計算資源が割り当て済みとなるが、未来割り当てする予約ジョブはまだ残っているので、計算資源を割り当てる装置は、スケジューリング処理を継続する。次に計算資源の空きが発生するのは、ジョブj7とジョブj8とが実行終了する予定である未来時刻t2のタイミングとなる。
ジョブj8が割り当てられた後のフェアシェア値も同様に変わらないので、計算資源を割り当てる装置は、ユーザBのジョブj10を選択して、図11の(5)として、ジョブj10に未来時刻t2における空き計算資源を割り当てる。ジョブj10が割り当てられた後のフェアシェア値も同様に変わらないので、ユーザBのフェアシェア値が高いままである。しかしながら、残っている未来割り当てする予約ジョブはユーザAのジョブだけになるので、計算資源を割り当てる装置は、図11の(6)として、ユーザAのジョブj1を選択して、ジョブj1に未来時刻t2における空き計算資源を割り当てる。
以降、計算資源を割り当てる装置は、同様に残っているユーザAのジョブに、未来時刻t3または未来時刻t4における計算資源を割り当てる。具体的には、計算資源を割り当てる装置は、図11の(7)と(8)として、ユーザAのジョブj2とジョブj5とに未来時刻t3における空き計算資源を割り当てる。また、計算資源を割り当てる装置は、図11の(9)と(10)として、ユーザAのジョブj6とジョブj9とに未来時刻t4における空き計算資源を割り当てる。
図11におけるジョブの割り当て結果を見ると、計算資源を割り当てる装置は、ユーザBの全てのジョブが先に未来割り当て予約した後、ユーザAの全てのジョブが未来割り当て予約することになる。このように、フェアシェア値により未来時刻の資源配分を行うと、公平な計算資源の配分制御を行えない。
次に、図12〜図21を用いて、図4〜図10で説明したフェアシェア予約値による未来時刻の資源配分を行うフェアシェア予約値制御処理を、管理ノード201が実行するフローチャートを示す。図12〜図21で示すフローチャートでは、説明の簡略化のため、図5〜図9で示した動作を行う初期設定を行うこととする。
図12は、フェアシェア予約値制御処理手順の一例を示すフローチャートである。フェアシェア予約値制御処理は、フェアシェア予約値を制御する処理である。
管理ノード201は、初期値を設定する(ステップS1201)。具体的には、管理ノード201は、初期値として、ユーザA、Bのフェアシェア初期値を、ともに60000に設定する。また、管理ノード201は、初期値として、単位時間当たりの回復値を、50に設定する。また、管理ノード201は、初期値として、ユーザの回復倍率を、ユーザA、ユーザBともに1に設定する。また、管理ノード201は、初期値として、空きノード数を全ノードの個数とする。また、管理ノード201は、初期値として、フェアシェア値更新時刻を現在時刻に設定する。
また、管理ノード201は、フェアシェア予約値間隔を100に設定する。ここで、現在時刻以降は、UTC(Coordinated Universal Time)の0(1970年1月1日00:00:00)からの指定秒数間隔とする。例えば、現在時刻が00:01:10であり、フェアシェア予約値間隔を100[秒]とした場合、各フェアシェア予約値リストに設定される時刻は、以下のようになる。
フェアシェア予約値リスト[0].tt=00:01:10(現在時刻)
フェアシェア予約値リスト[1].tt=00:01:40(100秒)
フェアシェア予約値リスト[2].tt=00:03:20(200秒)
フェアシェア予約値リスト[3].tt=00:05:00(300秒)
…
また、管理ノード201は、初期値として、fs_numを100に設定する。ここで、fs_numは、フェアシェア予約値リストの配列数となる。そして、管理ノード201は、fs_num*フェアシェア予約値間隔までの未来時刻まで、ジョブの割り当てが行える。そして、管理ノード201は、初期値として、フェアシェア予約値リスト[fs_num]の記憶領域をRAM303上に確保する。これにより、管理ノード201は、フェアシェア予約値リスト[0]〜[fs_num−1]の記憶領域を確保する。
また、管理ノード201は、初期値として、ユーザAフェアシェア値にユーザAフェアシェア初期値を設定する。同様に、管理ノード201は、初期値として、ユーザBフェアシェア値にユーザBフェアシェア初期値を設定する。
次に、管理ノード201は、フェアシェア予約値リスト初期化処理を実行する(ステップS1202)。フェアシェア予約値リスト初期化処理は、図17、図18で説明する。そして、管理ノード201は、未割り当てのジョブがあるか否かを判断する(ステップS1203)。未割り当てのジョブがある場合(ステップS1203:Yes)、管理ノード201は、ジョブ割り当て処理を実行する(ステップS1204)。そして、管理ノード201は、ジョブ割り当て処理の戻り値をjidに設定する。ジョブ割り当て処理は、図14、図15で説明する。
次に、管理ノード201は、jidが0より大きいか否かを判断する(ステップS1205)。jidが0より大きい場合(ステップS1205:Yes)、管理ノード201は、jidを引数として、フェアシェア予約値リスト更新処理を実行する(ステップS1206)。フェアシェア予約値リスト更新処理は、図19で説明する。そして、管理ノード201は、ステップS1203の処理に移行する。
一方、未割り当てのジョブがない場合(ステップS1203:No)、または、jidが0以下である場合(ステップS1205:No)、管理ノード201は、イベント待ち処理を実行する(ステップS1207)。そして、管理ノード201は、イベント待ち処理の戻り値をeeに設定する。イベント待ち処理は、図20、図21で説明する。次に、管理ノード201は、eeが再スケジュールイベントか否かを判断する(ステップS1208)。
eeが再スケジュールイベントである場合(ステップS1208:Yes)、管理ノード201は、未来割り当てジョブを未割り当て状態に設定する(ステップS1209)。次に、管理ノード201は、フェアシェア値更新処理を実行する(ステップS1210)。フェアシェア値更新処理は、図13で説明する。そして、管理ノード201は、フェアシェア予約値リスト初期化処理を実行する(ステップS1211)。次に、管理ノード201は、ステップS1203の処理に移行する。
一方、eeが再スケジュールイベントでない場合(ステップS1208:No)、管理ノード201は、eeがスケジューラ停止イベントか否かを判断する(ステップS1212)。eeがスケジューラ停止イベントでない場合(ステップS1212:No)、管理ノード201は、ステップS1203の処理に移行する。一方、eeがスケジューラ停止イベントである場合(ステップS1212:Yes)、管理ノード201は、フェアシェア予約値制御処理を終了する。フェアシェア予約値制御処理を実行することにより、管理ノード201は、フェアシェア予約値を制御して、未来時刻における計算資源を割り当てることができる。
図13は、フェアシェア値更新処理手順の一例を示すフローチャートである。フェアシェア値更新処理は、フェアシェア値を更新する処理である。
管理ノード201は、ttを現在時刻−フェアシェア値更新時刻に設定する(ステップS1301)。次に、管理ノード201は、ユーザAフェアシェア回復量を単位時間当たりの回復値*ユーザA回復倍率*ttに設定する(ステップS1302)。また、管理ノード201は、ユーザBフェアシェア回復量を単位時間当たりの回復値*ユーザB回復倍率*ttに設定する(ステップS1303)。次に、管理ノード201は、ユーザAフェアシェア値をユーザAフェアシェア値+ユーザAフェアシェア回復量に設定する(ステップS1304)。また、管理ノード201は、ユーザBフェアシェア値をユーザBフェアシェア値+ユーザBフェアシェア回復量に設定する(ステップS1305)。そして、管理ノード201は、フェアシェア値更新時刻を現在時刻に設定する(ステップS1306)。
ステップS1306の処理終了後、管理ノード201は、フェアシェア値更新処理を終了する。フェアシェア値更新処理を実行することにより、管理ノード201は、時間経過によるフェアシェア値の回復を行うことができる。
図14は、ジョブ割り当て処理手順の一例を示すフローチャート(その1)である。また、図15は、ジョブ割り当て処理手順の一例を示すフローチャート(その2)である。ジョブ割り当て処理は、ジョブに計算資源を割り当てる処理である。
管理ノード201は、pii[ユーザA]に0を設定するとともに、pii[ユーザB]に0を設定する(ステップS1401)。ここで、piiは、フェアシェア予約値リストのユーザごとの処理対象のインデックスを記憶する配列である。管理ノード201は、ステップS1401の処理において、現在時刻であるインデックス=0を処理する。次に、管理ノード201は、jidに0を設定するとともに、cttに−1を設定する(ステップS1402)。jidは、割り当てを行うジョブ番号が格納される。また、割り当てを行うジョブがない場合、jidは0が格納される。cttは、図5の(3)で説明した、ユーザ優先度変更時刻である。
そして、管理ノード201は、unalloc_jid[ユーザA]にユーザAの未割り当て最小ジョブ番号を設定する(ステップS1403)。また、管理ノード201は、unalloc_jid[ユーザB]にユーザBの未割り当て最小ジョブ番号を設定する(ステップS1404)。ここで、unalloc_jidは、ユーザごとの割り当て候補となるジョブ番号を記憶する配列である。
次に、管理ノード201は、第1引数を0として、第2引数をunalloc_jid[ユーザA]の値として、第3引数をunalloc_jid[ユーザB]の値として、ユーザ選択処理を実行する(ステップS1405)。そして、管理ノード201は、uuにユーザ選択処理の戻り値を設定する。ユーザ選択処理は、図16で説明する。
次に、管理ノード201は、pii[uu]がfs_numより小さいか否かを判断する(ステップS1406)。pii[uu]がfs_numより小さい場合(ステップS1406:Yes)、管理ノード201は、ttにフェアシェア予約値リスト[ii[uu]].ttの値を設定する(ステップS1407)。そして、管理ノード201は、unalloc_jid[uu]の要求ノード数と、専有使用時間とを満たす空きノードが時刻ttにあるか否かを判断する(ステップS1408)。
専有使用時間とを満たす空きノードが時刻ttにない場合(ステップS1408:No)、管理ノード201は、pii[uu]をインクリメントする(ステップS1409)。このように、優先すべきユーザuuのジョブが割り当てられなかった場合に、pii[uu]をインクリメントすることにより、管理ノード201は、ユーザuuについてジョブが割り当てられなかったことを再び判断するという無駄な処理を省くことができる。一方、専有使用時間とを満たす空きノードが時刻ttにある場合(ステップS1408:Yes)、管理ノード201は、jidにunalloc_jid[uu]の値を設定する(ステップS1410)。
ステップS1409の処理終了後、管理ノード201は、pii[uu]がfs_numより小さいか否かを判断する(ステップS1411)。ステップS1410の処理終了後、または、pii[uu]がfs_num以上である場合(ステップS1406:No、ステップS1411:No)、管理ノード201は、ジョブ割り当て処理を終了する。ここで、管理ノード201は、ジョブ割り当て処理の戻り値として、jidの値を出力する。
一方、pii[uu]がfs_numより小さい場合(ステップS1411:Yes)、管理ノード201は、pii[uu]がcttより小さいか否かを判断する(ステップS1501)。pii[uu]がcttより小さい場合(ステップS1501:Yes)、優先すべきユーザが切り替わった時刻cttより前であり、優先すべきユーザが切り替わることはないので、管理ノード201は、ステップS1407の処理に移行する。
一方、pii[uu]がctt以上である場合(ステップS1501:No)、管理ノード201は、第1引数をpii[uu]として、第2引数をunalloc_jid[ユーザA]として、第3引数をunalloc_jid[ユーザB]として、ユーザ選択処理を実行する(ステップS1502)。そして、管理ノード201は、retにユーザ選択処理の戻り値を設定する。そして、管理ノード201は、retの値とuuの値とが同一か否かを判断する(ステップS1503)。retの値とuuの値とが同一である場合(ステップS1503:Yes)、管理ノード201は、ステップS1407の処理に移行する。
一方、retの値とuuの値とが同一でない場合(ステップS1503:No)、優先すべきユーザが切り替わったことを示すため、管理ノード201は、cttにpii[uu]の値を設定する(ステップS1504)。そして、管理ノード201は、uuにretの値を設定する(ステップS1505)。次に、管理ノード201は、ステップS1407の処理に移行する。ジョブ割り当て処理を実行することにより、管理ノード201は、未来時刻における計算資源を割り当てることができる。
図16は、ユーザ選択処理手順の一例を示すフローチャートである。ユーザ選択処理は、計算資源の割り当てを優先するユーザを選択する処理である。ここで、ユーザ選択処理は、第1引数として処理対象となる時刻のインデックスiiと、第2引数としてユーザAのジョブ番号jid_aと、第3引数としてユーザBのジョブ番号jid_bとを、呼び元の関数から受け付ける。
管理ノード201は、fs_aにフェアシェア予約値リスト[ii].fs[ユーザA]を設定する(ステップS1601)。また、管理ノード201は、fs_bにフェアシェア予約値リスト[ii].fs[ユーザB]を設定する(ステップS1602)。次に、管理ノード201は、fs_aとfs_bとが同一か否かを判断する(ステップS1603)。fs_aとfs_bとが異なる場合(ステップS1603:No)、管理ノード201は、fs_aがfs_bより大きいか否かを判断する(ステップS1604)。fs_aがfs_bより大きい場合(ステップS1604:Yes)、管理ノード201は、uuにユーザAを設定する(ステップS1605)。
一方、fs_aがfs_b以下である場合(ステップS1604:No)、ステップS1603の処理がNoであるため、すなわち、fs_aがfs_b未満である場合、管理ノード201は、uuにユーザBを設定する(ステップS1606)。
一方、fs_aとfs_bとが同一である場合(ステップS1603:Yes)、管理ノード201は、jid_aがjid_bより大きいか否かを判断する(ステップS1607)。jid_aがjid_b以下である場合(ステップS1607:No)、管理ノード201は、uuにユーザAを設定する(ステップS1608)。一方、jid_aがjid_bより大きい場合(ステップS1607:Yes)、管理ノード201は、uuにユーザBを設定する(ステップS1609)。
ステップS1605、ステップS1606、ステップS1608、ステップS1609のうちのいずれかの処理終了後、管理ノード201は、ユーザ選択処理を終了する。ここで、管理ノード201は、uuを、ユーザ選択処理の戻り値として出力する。ユーザ選択処理を実行することにより、管理ノード201は、資源配分に応じた回復倍率により算出されたフェアシェア予約値を用いて、優先すべきユーザを選択することができる。
図17は、フェアシェア予約値リスト初期化処理手順の一例を示すフローチャート(その1)である。図18は、フェアシェア予約値リスト初期化処理手順の一例を示すフローチャート(その2)である。フェアシェア予約値リスト初期化処理は、フェアシェア予約値リストを初期化する処理である。
管理ノード201は、iiに0を設定するとともに、ttに現在時刻を設定する(ステップS1701)。ここで、フェアシェア予約値リスト初期化処理におけるiiは、フェアシェア予約値リストの処理対象のインデックスの値を記憶する変数である。
次に、管理ノード201は、fs_aにユーザAのフェアシェア値を設定する(ステップS1702)。また、管理ノード201は、fs_bにユーザBのフェアシェア値を設定する(ステップS1703)。
そして、管理ノード201は、iiがfs_numより小さいか否かを判断する(ステップS1704)。iiがfs_num以上である場合(ステップS1704:No)、管理ノード201は、フェアシェア予約値リスト初期化処理を終了する。一方、iiがfs_numより小さい場合(ステップS1704:Yes)、管理ノード201は、フェアシェア予約値リスト[ii].ttにttの値を設定する(ステップS1705)。そして、管理ノード201は、フェアシェア予約値リスト[ii].fs[ユーザA]にfs_aの値を設定する(ステップS1706)。また、管理ノード201は、フェアシェア予約値リスト[ii].fs[ユーザB]にfs_bの値を設定する(ステップS1707)。
次に、管理ノード201は、ttに、「INT(現在時刻/フェアシェア予約値間隔)*フェアシェア予約値間隔」の計算結果となる値を設定する(ステップS1708)。ここで、INT()は、引数の数値の小数を切り捨てる関数である。そして、管理ノード201は、iiをインクリメントする(ステップS1709)。
次に、管理ノード201は、iiがfs_numより小さいか否かを判断する(ステップS1801)。iiがfs_num以上である場合(ステップS1801:No)、管理ノード201は、フェアシェア予約値リスト初期化処理を終了する。一方、iiがfs_numより小さい場合(ステップS1801:Yes)、管理ノード201は、ttに、フェアシェア予約値間隔の値を追加する(ステップS1802)。そして、管理ノード201は、fs_aに、「単位時間当たりの回復値*ユーザA回復倍率*(tt−フェアシェア予約値リスト[ii−1].tt)」の計算結果の値を追加する(ステップS1803)。また、管理ノード201は、fs_bに、「単位時間当たりの回復値*ユーザB回復倍率*(tt−フェアシェア予約値リスト[ii−1].tt)」の計算結果の値を追加する(ステップS1804)。
次に、管理ノード201は、フェアシェア予約値リスト[ii].ttにttの値を設定する(ステップS1805)。そして、管理ノード201は、フェアシェア予約値リスト[ii].fs[ユーザA]に、fs_aの値を設定する(ステップS1806)。また、管理ノード201は、フェアシェア予約値リスト[ii].fs[ユーザB]にfs_bの値を設定する(ステップS1807)。そして、管理ノード201は、iiをインクリメントする(ステップS1808)。そして、管理ノード201は、ステップS1801の処理に移行する。フェアシェア予約値リスト初期化処理を実行することにより、管理ノード201は、フェアシェア予約値リストを初期化することができる。
図19は、フェアシェア予約値リスト更新処理手順の一例を示すフローチャートである。フェアシェア予約値リスト更新処理は、フェアシェア予約値リストを更新する処理である。ここで、フェアシェア予約値リスト更新処理は、引数として、処理対象となるジョブ番号jidを呼び元の関数から受け付ける。
管理ノード201は、iiに0を設定する(ステップS1901)。次に、管理ノード201は、nodeにjid番号のジョブの要求ノード数を設定する(ステップS1902)。そして、管理ノード201は、elapseにjid番号のジョブの専有使用時間を設定する(ステップS1903)。次に、管理ノード201は、ssをjid番号のジョブの割り当て時刻に設定する(ステップS1904)。そして、管理ノード201は、uuにjid番号のジョブのユーザIDを設定する(ステップS1905)。次に、管理ノード201は、フェアシェア使用量にnode*elapseの計算結果の値を設定する(ステップS1906)。
そして、管理ノード201は、iiがfs_numより小さいか否かを判断する(ステップS1907)。iiがfs_numより小さい場合(ステップS1907:Yes)、管理ノード201は、フェアシェア予約値リスト[ii].ttがss以上であるか否かを判断する(ステップS1908)。フェアシェア予約値リスト[ii].ttがss以上である場合(ステップS1908:Yes)、管理ノード201は、フェアシェア使用量をフェアシェア予約値リスト[ii].fs[uu]から減じる(ステップS1909)。
ステップS1909の処理終了後、または、フェアシェア予約値リスト[ii].ttがss未満である場合(ステップS1908:No)、管理ノード201は、iiをインクリメントする(ステップS1910)。そして、管理ノード201は、ステップS1907の処理に移行する。iiがfs_num以上である場合(ステップS1907:No)、管理ノード201は、フェアシェア予約値リスト更新処理を終了する。フェアシェア予約値リスト更新処理を実行することにより、管理ノード201は、フェアシェア予約値リストのうちの未来時刻ss以降のフェアシェア予約値を減じることができる。
図20は、イベント待ち処理手順の一例を示すフローチャート(その1)である。図21は、イベント待ち処理手順の一例を示すフローチャート(その2)である。イベント待ち処理は、受け付けイベントに応じた処理を行うものである。
管理ノード201は、eeに受け付けイベントを設定する(ステップS2001)。ここで、受け付けイベントは、新規ジョブ投入イベント、ジョブ実行開始イベント、ジョブ実行終了イベント、再スケジューリングイベント、スケジューラ停止イベントのいずれかである。
次に、管理ノード201は、eeがジョブ実行開始イベントか否かを判断する(ステップS2002)。eeがジョブ実行開始イベントである場合(ステップS2002:Yes)、管理ノード201は、jidに実行開始するジョブ番号を設定する(ステップS2003)。次に、管理ノード201は、nodeにjid番号のジョブの要求ノード数を設定する(ステップS2004)。さらに、管理ノード201は、elapseにjid番号のジョブの専有使用時間を設定する(ステップS2005)。次に、管理ノード201は、フェアシェア使用量にnode*elapseの計算結果の値を設定する(ステップS2006)。
そして、管理ノード201は、uuにjid番号のジョブのユーザIDを設定する(ステップS2007)。次に、管理ノード201は、ユーザuuフェアシェア値からフェアシェア使用量を減じる(ステップS2008)。そして、管理ノード201は、jid番号のジョブを割り当てたノードに対して、jid番号のジョブの実行を開始させる(ステップS2009)。そして、管理ノード201は、イベント待ち処理を終了する。
一方、eeがジョブ実行開始イベントでない場合(ステップS2002:No)、管理ノード201は、eeがジョブ実行終了イベントか否かを判断する(ステップS2101)。eeがジョブ実行終了イベントである場合(ステップS2101:Yes)、管理ノード201は、jidに実行終了したジョブ番号を設定する(ステップS2102)。次に、管理ノード201は、nodeにjid番号のジョブの要求ノード数を設定する(ステップS2103)。そして、管理ノード201は、elapseにjid番号のジョブの専有使用時間を設定する(ステップS2104)。次に、管理ノード201は、ssにjid番号のジョブの実行開始時刻を設定する(ステップS2105)。次に、管理ノード201は、uuにjid番号のジョブのユーザIDを設定する(ステップS2106)。そして、管理ノード201は、フェアシェア返却量に「node*(elapse−(現在時刻−ss))」の計算結果の値を設定する(ステップS2107)。次に、管理ノード201は、フェアシェア返却量をユーザuuフェアシェア値に追加する(ステップS2108)。
ステップS2108の処理終了後、または、eeがジョブ実行終了イベントでない場合(ステップS2101:No)、管理ノード201は、イベント待ち処理を終了する。ここで、管理ノード201は、eeを、イベント待ち処理の戻り値として出力する。イベント待ち処理を実行することにより、管理ノード201は、受け付けイベントに応じた処理を行うことができる。
以上説明したように、管理ノード201によれば、単位時間当たりの各々のユーザの回復値に、現在時刻と未来時刻の差分を掛けた値を、未来時刻の計算資源の割当時に用いる値として算出する。これにより、管理ノード201は、各々のユーザの資源配分を反映させて、未来時刻の資源配分を適正にすることができる。
また、管理ノード201によれば、第1の時刻におけるフェアシェア予約値を上昇させる値と現在時刻におけるフェアシェア予約値とから求めた第1の時刻におけるフェアシェア予約値を用いて、第1の時刻における計算資源を用いるユーザを決定してもよい。これにより、管理ノード201は、第1の時刻における計算資源を、ユーザの資源配分に応じて割り当てることができる。
また、管理ノード201によれば、第1の時刻における計算資源を用いるユーザが有するジョブが要求する計算資源が未来時刻にある場合、ユーザが有するジョブに第1の時刻における計算資源を割り当てることを決定してもよい。これにより、管理ノード201は、第1の時刻における計算資源を用いるユーザが有するジョブを第1の時刻となった際に、確実にノードに割り当てることができる。
また、第1の時刻における計算資源を用いるユーザが有するジョブが要求する計算資源が未来時刻にあるとする。このとき、管理ノード201によれば、第1の時刻におけるユーザのフェアシェア予約値を、第1の時刻におけるユーザのフェアシェア予約値を上昇させる値と、現在時刻におけるユーザのフェアシェア値と、フェアシェア使用量とに基づいて算出してもよい。また、管理ノード201によれば、第2の時刻におけるユーザのフェアシェア予約値を、第2の時刻におけるユーザのフェアシェア予約値を上昇させる値と、現在時刻におけるユーザのフェアシェア値と、フェアシェア使用量とに基づいて算出してもよい。ここで、第2の時刻は、第1の時刻より未来の時刻である。
これにより、管理ノード201は、第1の時刻でジョブを割り当てたユーザはフェアシェア予約値が下がり、第1の時刻以降でジョブを割り当てにくくなるため、第1の時刻以降で、ユーザ間で公平に割り当てることができる。
また、第1の時刻における計算資源を用いるユーザが有するジョブが要求する計算資源が未来時刻にないとする。このとき、管理ノード201によれば、第1の時刻より未来の第2の時刻における各々のユーザの優先度に基づいて、複数のユーザから第2の時刻における計算資源を割り当てるジョブを有するユーザを決定してもよい。これにより、管理ノード201は、管理ノード201は、第2の時刻における計算資源を、ユーザの資源配分に応じて割り当てることができる。
また、第1の時刻における計算資源を割り当てることを決定したユーザが第2の時刻における計算資源を割り当てることを決定したユーザとは異なったとする。ここで、第2の時刻に計算資源を割り当てることを決定したユーザを、別のユーザと呼ぶ。第1の時刻の計算資源が割り当てられずに第2の時刻で優先すべきユーザが変わった場合、第1の時刻における計算資源はまだ空いており、別のユーザが有するジョブならば割り当てられる可能性がある。そこで、管理ノード201は、別のユーザが発行したジョブが要求する計算資源が第1の時刻にあるか否かを判断し、判断した判断結果に基づいて、別のユーザが有するジョブに前記第1の時刻における計算資源を割り当てることを決定してもよい。これにより、管理ノード201は、空きの第1の時刻における計算資源が割り当てられる機会を増やして、第1の時刻における計算資源を有効に活用することができる。
なお、本実施の形態で説明したジョブ制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ジョブ制御プログラムは、ハードディスク、フレキシブルディスク、CD−ROM(Compact Disc−Read Only Memory)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本ジョブ制御プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)現在時刻より未来の第1の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第1の時刻との差分とに基づいて算出する、
制御部を有することを特徴とする並列演算装置。
(付記2)前記制御部は、
算出した前記度合いと、現在時刻における前記各々のユーザの優先度とに基づいて、前記第1の時刻における前記各々のユーザの優先度を算出し、
算出した前記第1の時刻における前記各々のユーザの優先度に基づいて、前記複数のユーザから前記第1の時刻における計算資源を割り当てるジョブを有するユーザを決定することを特徴とする付記1に記載の並列演算装置。
(付記3)前記制御部は、
前記第1の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が前記第1の時刻にあるか否かを判断し、
判断した判断結果に基づいて、前記ユーザが有するジョブに前記第1の時刻における計算資源を割り当てることを決定することを特徴とする付記2に記載の並列演算装置。
(付記4)前記制御部は、
前記第1の時刻にあると判断した場合、前記第1の時刻または前記第1の時刻より未来の第2の時刻のいずれかの時刻における計算資源を割り当てるジョブを有するユーザを決定する際に用いる前記ユーザの優先度を上昇させる度合いと、現在時刻における前記ユーザの優先度と、前記第1の時刻における計算資源を割り当てることにより前記ユーザの優先度を低下させる度合いとに基づいて、前記いずれかの時刻における前記ユーザの優先度を算出することを特徴とする付記3に記載の並列演算装置。
(付記5)前記制御部は、
前記第1の時刻にないと判断した場合、前記第1の時刻より未来の第2の時刻における前記各々のユーザの優先度に基づいて、前記複数のユーザから前記第2の時刻における計算資源を割り当てるジョブを有するユーザを決定することを特徴とする付記3または4に記載の並列演算装置。
(付記6)前記制御部は、
前記第1の時刻における計算資源を割り当てることを決定したユーザが前記第2の時刻における計算資源を割り当てることを決定したユーザとは異なる場合、前記第2の時刻における計算資源を割り当てることを決定したユーザが有するジョブが要求する計算資源が前記第1の時刻にあるか否かを判断し、
判断した判断結果に基づいて、前記第2の時刻における計算資源を割り当てることを決定したユーザが有するジョブに前記第1の時刻における計算資源を割り当てることを決定することを特徴とする付記5に記載の並列演算装置。
(付記7)複数のプロセッサを有する並列演算システムであって、
前記複数のプロセッサのいずれかのプロセッサは、
現在時刻より未来の第1の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、単位時間が経過することにより前記各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いと、現在時刻と前記第1の時刻との差分とに基づいて算出する、
ことを特徴とする並列演算システム。
(付記8)コンピュータに、
単位時間が経過することにより複数のユーザの各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いを記憶する記憶部から前記度合いを読み出し、
現在時刻より未来の第1の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、読み出した前記度合いと、現在時刻と前記第1の時刻との差分とに基づいて算出する、
処理を実行させることを特徴とするジョブ制御プログラム。
(付記9)コンピュータが、
単位時間が経過することにより複数のユーザの各々のユーザの資源配分に応じて前記各々のユーザの優先度を上昇させる度合いを記憶する記憶部から前記度合いを読み出し、
現在時刻より未来の第1の時刻における計算資源を割り当てるジョブを有するユーザを複数のユーザから決定する際に用いる前記複数のユーザの各々のユーザの優先度を上昇させる度合いを、読み出した前記度合いと、現在時刻と前記第1の時刻との差分とに基づいて算出する、
処理を実行することを特徴とするジョブ制御方法。