スーパーコンピュータの構築に関して、最近の顕著な傾向としては ほとんどの新しいシステムは同じテーマに基づいて少し変化をつけた ものとなっています。 すなわち、高速ネットワークで繋がれた、RISC ベースの 対称マルチプロセッシング (Symmetric Multi-Processing :SMP)ノードの集合体です。 これは、アーキテクチャの自然な進化だと思ってください。 プロセッサ (RISC)もネットワーク機器も比較的安価に出回るようになり、 標準化された通信ソフトウェアを使い、それらのプロセッサをつないで 一体化することが可能になった事で、メーカーが提供する完成したシステム を使うかわりに、自家製クラスタコンピュータを構築するケースが増えています。
スーパーコンピュータに関する以下のサイトを訪れてみてください -
マシンそのものについての話を始める前に、 性能を上げる為に現在使われ、あるいは昔からずっと使われている いくつかのメカニズムについて考えることが重要です。 シングルプロセッサの性能を越えてコンピュータシステムを高速化する上での 可能、不可能というのは、その大部分がハードウェアの構造あるいはアーキテクチャで 決まってしまいます。 ハードウェアとの組合せでもう一つ考えられる重要な点は、用意されたハードウェア プラットフォームにおいて処理効率の良いコードを生成するためのコンパイラの能力です。 多くの場合においてハードウェアとソフトウェアのどちらが影響しているのかを 区別するのは困難であり、ある効果がハードウェア、あるいはソフトウェア、 またはその両方によるものなのかという場面で、その結果を解釈するときには 慎重にならなくてはなりません。 この章では "高性能" であると分類されるマシンについて記述するため ハードウェアアーキテクチャに最も重点を置きます。
何年にも渡り、「フリン (Flynn)の分類」が高性能コンピュータを分類するのに役立つこと を証明してきました。 これは、命令 (instruction)ストリームとデータストリームの扱い方の違いによって 分類する方法で、4つの主なアーキテクチャのクラスがあります。 まず、それらのクラスについて簡単に概要を述べ、そのあとでそれぞれのクラスについて 述べるときに詳細に触れる事としましょう。
一つの CPU を搭載し、逐次処理される一個の 命令ストリームを扱うような旧式のシステムはこのクラスに含まれます。 最近ではたくさんの大型メインフレームが複数 CPU を備えていることが ありますが、それぞれがお互いに無関係な命令ストリームを実行しています。 それゆえ、このようなマシンも異なるデータ空間で動作する SISD(の集まり) であるといえます。 SISD の例としては DEC や Hewlett-Packard そして Sun Microsystems の ほとんどのワークステーションが挙げられます。 SISD マシンの定義はここでは単にすべてのクラスを網羅するために行なっただけです。 このタイプのマシンについてはこのレポートでは扱いません。
このようなマシンはしばしば 1,024個から 16,384個といった膨大な数の 処理単位をもち、それらがそれぞれ異なるデータに対して軍隊の行進のように 同じ命令を実行することが可能となっています。 したがって、たった一つの命令で多くのデータを並列に操ることができます。 このタイプに分類される SIMD の例としては CPP DAP Gamma II や Alenia Quadrics などが挙げられます。
もう一つのタイプの SIMD システムはベクトルプロセッサです。 ベクトルプロセッサは特別な構造をもつ CPU を使って、独立したデータ群 より類似データの配列に対して能力を発揮します。 ベクトルユニットでデータを処理する場合、結果は3クロックサイクル当たり 1個かまた特別な場合には2個の割合で出力されます。 (1クロックサイクルとはシステムの内部処理時間の基本単位です。) つまり、ベクトルモードで実行するときに限り ベクトルプロセッサは ほぼ並列にデータを処理する事になります。 この場合、旧式のスカラーモードで実行するのに比べて数倍高速となります。 このため、ベクトルプロセッサの実用上の効果は、ほぼ SIMD マシンと同じと 考えられます。 このようなシステムの例をあげるとすれば、Hitachi S3600 です。
理論的にはこのようなタイプのマシンでは、複数の命令が単一の データストリームに対して動作することになります。 このクラスに分類されるマシンは実際には今まで作られた事はなく、 また簡単に想像できるものでもないので、 これ以降の部分ではこのクラスを無視します。
これらのマシンはいくつかの命令ストリームを異なるデータに対して 並列に実行します。 上述のマルチプロセッサ SISD マシンとの違いは、複数の命令や複数のデータが、 同じタスクの異なる部分であるが故にお互いに関係しあっているという事実です。 したがって MIMD システムはメインタスクの処理時間を短縮するために 多くのサブタスクを並列に実行させる事ができます。 MIMD には多くのバリエーションがあり、特にこのクラスにおいては Flynn の分類 はシステムの分類法として適切でない事が分かります。 全く異なる動作形態の4プロセッサの NEC SX-5 と 1000プロセッサの SGI/Cray T3E が両方とも同じこのクラスに分類されてしまいます。 このため、この後の部分においては、システムの分類においてもう一つ別な、重要な 区別をしてそれを扱っていきます。
共有メモリシステムでは、複数の CPU が全て同じアドレス空間を共有します。 全ての CPU が対等に、たった一つのメモリにアクセスするので ユーザはデータの格納場所を知る必要がありません。 共有メモリシステムは SIMD であることもあり MIMD であることもあります シングル CPU のベクトルプロセッサは前者の例として挙げることができます。 一方マルチ CPU 共有メモリシステムのマシンは後者の例となります。 今後、この二つのサブクラスについて SM-SIMD, SM-MIMD という略語を 用いることにします。
このケースでは、CPU はそれぞれに関連づけられたメモリを持っています。 複数の CPU がネットワークで接続されていて、要求に応じてそれぞれの 担当するメモリ間でデータを交換することができます。 共有メモリシステムとは対照的に、ユーザはローカルメモリ内のデータの 位置を知っていなければならず、また要求に応じて明示的にデータの移動や分配を 行わなくてはなりません。 分散メモリシステムにも、SIMD 、MIMD いずれの場合もあります。 先に説明した方の、軍隊の行進のように動作する SIMD システムは 全てプロセッサに関連づけられた分散メモリを持っています。 後で述べるように、分散メモリ型 MIMD システムには、非常に多様な種類の ネットワーク接続形態 (トポロジ) があります。 アプリケーションの移植性に関して役立つトポロジの詳細は 大部分がユーザから見えないようになっています。 今後、この二つのサブクラスについて DM-SIMD, DM-MIMD という略語を 用いることにします。
共有メモリマシンと分散メモリマシンの違いは明白であるように見えますが ユーザの視点で見れば必ずしもそうとはいえません。 例えば近頃の Kendall Square Research システムはハードウェアレベルでの "仮想共有メモリ"という考え方を採用しています。 仮想共有メモリはソフトウェアレベルでもシミュレートすることができます。 例えば、1993年に発表された High Performance Fortran(HPF)の仕様は コンパイラの指令によって、データを利用可能なプロセッサに 分散するというものでした。 このため、この場合 HPF が実装されたシステムはユーザにとって 共有メモリマシンのように見えます。 HP(Heulett Packard)や SGI/Cray など他の大規模並列処理システム (Massively Parallel Processing systems:MPP systems) のベンダも仮想共有メモリプログラミングモデルをサポートしています。 そうすれば、物理的には分散メモリシステムであってもアドレス空間の集合全体の アドレスを指定することができるからです。 したがって、ユーザのためにシステムはメモリ全体に渡る単一の グローバルアドレス空間を持っています。 そのようなシステムの構造については ccNUMA のところでもう少しだけ触れるつもりです。 さらに、TreadMarks のようなパッケージはワークステーションのネットワークに 仮想共有メモリ環境をもたらします。
ここ数年で登場したもう一つのトレンドは分散処理です。 これは DM-MIMD の概念を一歩前進させたものです。 すなわち、一つあるいは複数の箱に入った多くの統合されたプロセッサの代わりに、 ワークステーションやメインフレームなどを (ギガビットの) イーサネットや FDDIやあるいは別な方法で接続して同じプログラムで同時に作業するように したものです。 コンセプトとしてはこれは DM-MIMD と変わりありませんがプロセッサ間の 通信はしばしば桁はずれに遅くなります。 分散コンピュータを実現する多くのパッケージが利用可能です。 例えば、PVM(Parallel Virtual Machine)や MPI(Message Passing Interface) などです。 "メッセージパッシング " モデルと呼ばれるこのプログラミングスタイルは 大変受け入れられるようになり、PVM や MPI が事実上すべての分散メモリ MIMD システムの大手ベンダーに採用されるようになりました。しかも共有メモリ MIMD システムのベンダーさえ、互換性という理由で採用するようになりました。 さらに、最近の傾向としては高性能パラレルインターフェイス(HiPPI)チャネルという100MB/s クラスの高速通信を使って、非常に高い計算能力をもつシステムを得る クラスタ共有メモリシステムというものがあります。 例としては、NEC SX-5 と SGI/Cray SV1 がこの構造を採用しています。 すなわち、クラスタ間の通信にはメッセージパッシングを使いながら、 ノードの集合体において共有メモリのプログラミングスタイルが使われているのです。
この章の冒頭で述べた通り、やや少なめ (多くとも16)の RISC プロセッサ を一つのクラスタに密結合させたもの、 すなわち対称マルチプロセッシング (SMP) ノードをもったシステムを 構築することが流行の様です。 ノード内のプロセッサは、ほとんどいつも直接(単一ステージ・ クロスバーネットワークによって)接続されています。 一方クラスタ間はやや安価なネットワークによって繋がれています。
これは、全てのプロセッサが全てのアドレス空間にアクセスできるという 重要な点を除けば、巨大なベクトルプロセッサの集合体について上述した 手段に似ています。 よって、このようなシステムは SM-MIMD マシンと考えることができます。 一方では、メモリが物理的に分散しているので、データアクセス操作が常に 同時に満足されるという保証はありません。 それゆえ、このようなマシンは ccNUMA システムと呼ばれます。 これは Cache Coherent Non-Uniform Memory Access の略です。 キャッシュコヒーレント(Cache Coherent:直訳 - キャッシュのつじつまが合っている)という言葉は "使用されるいかなる変数も、すべての CPU にとって一致していなければ ならない"という事実を表しています。 したがってこの点において、これらの変数の元になるキャッシュも また一致している事が確実でなければなりません。 複数の CPU のキャッシュがコヒーレントである事を確実にするためには色々 な方法があります。 一つは、snoopy bus protocol で、このバスにおいてキャッシュは CPU へ の変数の転送を監視し、もしそれがキャッシュしてある変数であれば 更新します。 もう一つの方法は、ディレクトリメモリで、これはすべての変数のコピーと その正当性を監視する、特殊な部分のメモリです。
実用上、これらのシステムは SM-MIMD マシンである と分類できます。SM-MIMD マシンに分類可能なもう一つの理由があります。 それは、メモリが物理的には分散しているにもかかわらず、 (例えばディレクトリメモリなどの) 特別な補助ハードウェアや ソフトウェアが、あたかも単一のシステムであるような形に 合体させてしまうからです。