next up previous contents
Next: 4.8 ゴール分散の指定方法 Up: 4 優先度と負荷分散 Previous: 4.6 応用: 簡単な探索問題

4.7 負荷分散制御の利用目的

本節では, 負荷分散制御の目的と考え方を説明する. 一般的に, プログラム中には逐次にしか実行できない部分と 並列に実行できる部分がある. にも関わらず, 並列に実行できる部分も 逐次計算機では逐次に実行するしか方法がない. しかし, 並列計算機では逐次に実行できる部分は同じプロセッサで 実行し, 並列に実行できる部分は別プロセッサで実行でき, その点で問題を素直にプログラム化する事ができる.

KL1では, ボディーゴールの実行はプログラム中に記述した順番とは 全く関係なく実行される. また, 実行可能な部分は並列に実行される. ただし, KLIC 逐次処理系は並列に実行が可能であるとは言っても プロセッサは1台しかないので, ゴールは同じプロセッサ上で優先度に基づいて 擬似並列的に実行される. 従って, 本当に並列に実行するためには KLIC 並列処理系上で動かす必要がある.

KL1では, ゴールを別プロセッサで実行させる事を負荷を分散させると呼ぶ. 負荷を分散させるには, KL1ではプログラム中でそのための指定を 行なう(図4.18). 指定の方法についての詳細は次節で説明する.

  
図 4.18: KL1における負荷分散

負荷分散を行なうにあたっては, プロセスとストリームの構造, 及び各ゴールの処理の重さ等についてあらかじめ良く考えておく必要がある. というのも, ゴールの実行を他のノードに依頼するにはそれなりのコストが 必要であり, 並列な部分を全て別ノードに投げれば良いと言うものではない.

また, 幾ら並列な部分で処理の大きなゴールであっても, 最終的に 莫大なデータを返すようなものであっては, 通信時間のオーバヘッド が顕著に現れて, 結局全体的には並列効果が現れなくなる場合もある.

以下に, 負荷分散制御を行なう際に充分気をつけねばならない事項について まとめてある. これを参考にして負荷分散制御を行なうと, 並列効果の良い プログラムを書く指標になる.

(1) 処理の小さなゴールは負荷分散させない. 幾ら並列性があるとは言っても, 処理の小さなゴールまでも負荷分散させるのは各種の オーバヘッドによって負荷分散の効果は相殺される. ゴールを投げると, 投げるのに要するコスト 終了した事を知らせるコストが余分にかかる. これらのコストの和 よりも処理の小さなゴールは, 負荷分散させない方が良い. このような処理の小さなゴールを負荷分散するには, 幾つかの関連のある ゴールをまとめて一つのゴールとし, それを負荷分散する.

(2) なるべくデータのあるノード上で実行させる. プロセスとデータが所在するノードが異なると, その間の通信の オーバヘッドが増大する. プロセスとデータは同じノード上にあるのが 一番望ましい. 各プロセスの処理が充分大きくて別ノードにする方が 効率が良い場合には, 通信の多いものを同じノード上で処理するようにする事.

(3) アクセスの多いデータベースは, ノード毎に分散管理させるのが望ましい. 共通のデータベースを複数のプロセスからアクセスする場合には, データベースのあるノードに通信が集中する. アクセスの多いデータベースの分割が可能な場合には, できる限り分散管理を 行なって通信が集中しないようにする事.

(4) ゴールについていくデータは なるべくコンパクトにまとめる. 投げるゴールの実行に必要なデータは, なるべくコンパクトにまとめてられて いないと通信のオーバヘッドが増大する. また, その結果も コンパクトにまとめれている必要がある.

なお, 今後の研究次第で更に留意する点が次々と出てくるであろう. ここでは, 安易に負荷分散を行なうと並列効果を期待できないという 事を良く理解しておき, その基本的な考え方を示した.



next up previous contents
Next: 4.8 ゴール分散の指定方法 Up: 4 優先度と負荷分散 Previous: 4.6 応用: 簡単な探索問題



KLIC