次のページ 前のページ 目次へ

3. アーキテクチャ概要

3.1 これは、どんな風に見えますか?

Beowulf スーパーコンピュータアーキテクチャを分かってもらうには、 実際の Beowulf と非常に似ていて、殆どのシステム管理者に身近な、 例示を使うのが一番だと私は思います。 Beowulf マシンに一番近い例は、一つのサーバと多数のクライアントがある Unix コンピュータ実験室です。もっと具体的には、私は DEC Alpha undergraduate computer laboratory at the Faculty of Sciences, USQ を例に取りましょう。 このサーバコンピュータは beldin と呼ばれ、 クライアントマシンは、 scilab01scilab02scilab03から、scilab20 までと呼ばれます。 全てのクライアントは Digital Unix 4.0 オペレーティングシステムのローカルコピーを持ち、 インストールされていますが、ユーザのファイル空間 (/home) と /usr/local はサーバから NFS (Network File System) で持ってきています。 各クライアントはサーバにエントリを持ち、それぞれの /etc/hosts.equiv ファイルの中にはその他全てのクライアントが入っています。 ですから、全てのクライアントはその他全てに対してリモートシェル (rsh) を実行できます。このサーバマシンは実験室全体の NIS サーバですから、全てのマシンにわたりアカウント情報は同じです。 誰かが scilab02 のコンソールに座りログオンすれば、 彼がサーバとか scilab15 にログインしたのと同じ環境を持ちます。 全てのクライアントが同じ使い勝手を持つのは、 このオペレーティングシステムがインストールされて 全マシンで同一の方法で設定されており、ユーザの /home/usr/local 領域が物理的にサーバ上にあり NFS を介してアクセスされるからです。 NIS と NFS を更に知りたいなら NISNFS の HOWTO を読んで下さい。

3.2 その他のノードを使えるようにする方法は?

ここまでで、このシステムのアーキテクチャについて少し分かりました。 このコンピュータ実験室内のマシンの利用可能な CPU サイクルを、 どうやって使えるようにするかを見てみましょう。 誰でも任意のマシンにログインでき、自分のホームディレクトリ中の プログラムを走らせられますし、 単なるリモートシェルの実行によって別のマシン上で同一のジョブを spawn もできます。例えば、 1 から 10 までの全ての整数の平方根の合計を計算したいとしましょう。 私たちはそれをきっちり行う sigmasqrtsource code を参照して下さい) と呼ばれる簡単なプログラムを書きます。 1 から 10 までの数の平方根の合計を計算するには、私たちは次を実行します。

[jacek@beldin sigmasqrt]$ time ./sigmasqrt 1 10
22.468278

real    0m0.029s
user    0m0.001s
sys     0m0.024s
この time コマンドで、このジョブが走る時間を柱時計 (経過時間)でチェックできます。見ての通り、 この例は実行するのに何十分の 1 秒( 0.029 秒)しかかかりませんが、 もし私が 1 から 10 億までの整数の平方根を加算したいとすれば どうでしょうか? それを試してみましょう、そして再び柱時計の時間を計算しましょう。

[jacek@beldin sigmasqrt]$ time ./sigmasqrt 1 1000000000
21081851083600.559000

real    16m45.937s
user    16m43.527s
sys     0m0.108s

今度は、このプログラムの実行時間は相当長いです。 誰でも聞きたくなる疑問は、 このジョブの実行時間を高速化するために何ができるか、です。 このジョブが走る方法をどう変更すれば、 このジョブが走る柱時計の時間を最小にできるでしょうか? 誰でも答える解答は、このジョブを多数のサブジョブに分割して、 全てのコンピュータ上で並列にこれらのサブジョブを走らせることです。 私たちは一つの大きな加算タスクを 20 の部分に分割して、各ノードの上で一つの範囲の平方根を計算して合計 できるでしょう。全てのノードが計算を終了して結果を返した時に、 その 20 個の数値は合計されて最終解を得ます。このジョブを走らせる前に、 全てのプロセスが自分の結果を書き込むのに使われることになる 名前付きパイプを作成しましょう。

[jacek@beldin sigmasqrt]$ mkfifo output
[jacek@beldin sigmasqrt]$ ./prun.sh & time cat output | ./sum
[1] 5085
21081851083600.941000
[1]+  Done                    ./prun.sh

real    0m58.539s
user    0m0.061s
sys     0m0.206s

今度は約 58.5 秒でした。これはジョブがスタートしてから、全てのノードで 各自の計算が終わり、パイプへ結果を書き込み終わるまでの時間です。 この時間には 20 個の数字を最後に加算するのは含みませんが、 その時間は非常に僅かなので無視できます。 このジョブを並列に走らせて相当の改善を見ることができます。 実際に、並列ジョブは約 17 倍高速に走りました、これは CPU の数にして全部で 20 倍増やした場合としては、とても合理的です。 この例の目的は、並行コードを並列化する 一番単純な方法を描写することです。実際にはこんな単純な例はまれで、 別の技術( PVM と PMI の API )が並列性を達成するのに使われます。 (訳注:並行 concurrent と並列 parallel は混乱しがちです。 並行はスレッドのようにソフトウェア的に動作が並行するもので、 並列は SMP のようにハードウェア的に並列しているもののようです。 これについては 適合性の節を参照して下さ い。)

3.3 Beowulf と COW (ワークステーションのクラスタ)はどう違うの?

上記のコンピュータ実験室は完全にワークステーションのクラスタ (Cluster of Workstations (COW)) の例です。それでは、 Beowulf の 何が特別で、どんなふうに COW と違うのでしょうか? 真実はこうです、 さほどの違いはありません、しかし Beowulf には、数少ないですが独自の 性格が間違いなくあります。まず始めに、 Beowulf クラスタの クライアントノードは、キーボードも、マウス、ビデオカード、 モニターも持たないのが殆どです。 このクライアントノードへのアクセスにはリモート接続を介して、 サーバノードから、あるいは、専用コンソールノード、 シリアルコンソールから行われます。 クライアントノードからクラスタ外部のマシンにアクセスする必要は ありませんし、クラスタ外部のマシンからクライアントへ直接アクセス する必要もありませんから、 10.0.0.0/8 とか 192.168.0.0/16 のアドレス範囲 ( RFC 1918 http://www.alternic.net/rfcs/1900/rfc1918.txt.html 訳注:原著のアドレスは訳者はアクセスできず、 ここ の方はアクセスできました)等の プライベートアドレスをクライアントノードに使用するのがよくある習慣です。 二枚目のネットワークカードを使って外部世界にも接続するマシンは サーバノードだけ、というのはよくあります。 このシステムの使い方で一番よくあるのは、 そのサーバのコンソールに直接アクセスするか、 個人のワークステーションからサーバノードに telnet かリモートログインするものです。一旦サーバノード上に入れば、 ユーザは自分のコードを編集してコンパイルでき、 クラスタ中の全ノード上でのジョブの spawn もできます。 殆どの場合に、COW では、人々が実際には日常業務に使っていないので アイドルの CPU サイクルを活用できる、夜間とか週末に、 並列計算用に利用されます。それに対して Beowulf は普通は並列計算専用のマシンで、その目的に最適化されています。 また Beowulf はすぐに入手できる部品で構築されており、 主にフリーのソフトウェアを走らせますので、 より高い価格性能比を得られます。また、 Beowulf クラスタが単一の計算ワークステーションだ、 とユーザから見えるのに役立つ、単一システムイメージの機能を Beowulf はより多く持ちます。


次のページ 前のページ 目次へ