シミュレーション用高速計算機のしくみ


すでに述べたように、コンピュータを用いて自然現象のシミュレーションを行 うには高速かつ記憶容量の大きな計算機が必要で、常にその時代の最先端の計 算機が利用されてきた。いや、むしろ、このような計算を行いたいという要求 があって、高速計算機が設計され、計算機技術を押し進めてきたといったほう がよい。これらの高速計算機はスーパーコンピュータともよばれる。計算を 高速化するには、素子を高速化する以外に、(1)ひとつの演算が完了する前 に次の演算を開始するようにするパイプライン方式、(2)多数の演算ユニット を並列に動作させる並列計算方式、(3)特定の問題に対応した専用演算回路を 用いて計算を高速化する方式などがある。参考書としてはたとえば 文献[6]がある。

フォンノイマン型計算機

それぞれの高速化方法の話に入る前に従来の計算機の原理を復習しておく。 従来の電子計算機はフォンノイマンが提唱した原理に基づいて設計されてきた。 その特徴をまとめると次のようになる。

  1. プログラム内蔵
  2. 逐次制御
  3. 線形アドレスを持つメモリ
  4. 命令語とデータ語の区別がない
  5. 決定論理

たとえば、ふたつの数の和を求めるというプログラムは単純化した計算機では 次のように計算機のメモリに格納されると考えてよい。ただし LD 命令は2進数 の 0100、ADD 命令は 0010、ST 命令は 0111、EXIT は 0000 であらわされる ものとした。また、番地は2進数4ビットで表現され、1語は8ビットとした。

 番地   命令またはデータ 
 0000   0100 0100        
 0001   0010 0101        
 0010   0111 0110        
 0011   0000 0000        
 0100   0000 0110        
 0101   0000 0010        
 0110   0000 1000
ここで、たとえば0番地の命令は LD 0100 ということで、4番地の内容を レジスタ(CPU内のメモリ)に読み込むことを意味する。このプログラムを 0000番地から実行すると、0100番地の記憶内容と 0101 番地の記憶内容の和が 0110 番地に保存される。その動作をもう少し細かく見ると、メモリから CPU内部の命令レジスタに命令がひとつづつ読み込まれ、解釈されて実行 されるという動作が繰り返されている。このように1次元化されたメモリ空間 にプログラムをよみこんで逐次的に命令を実行していくことが、フォンノイマ ン型計算機の特徴である。この方式は単純なので、電子回路の技術が十分で なかった時代でもコンピュータを作ることができた。しかしながら、同時に ひとつの命令しか実行することができないということは、高速化という観点 からは望ましくない。

パイプライン方式

ひとつの演算が完了するまで待たずに、次の演算を開始することによって 高速化するという方法である。ちょうど、自動車をひとりの人が全部作るよ りも多くの人を使って流れ作業にした方が単位時間あたりの生産量が上がる のと同じ原理である。あるいは、ひとり乗りのエレベータよりもエスカレー タの方が単位時間に多くの人を運べるということとも通じるところがある。 前の人が上がり切ってしまうのを待たずとも次の人が乗ることができるから たとえひとりの人が昇るのに30秒かかったとしても15段の階段にひとりずつ 乗っていれば2秒にひとりずつ上の階に上げることができるわけである。

たとえば、小数点つきのふたつの数の和を求めるという演算を考えてみよう。 科学技術計算では小数点つきの数は浮動小数点数として扱われる。浮動小数点 数について十進数の 0.1 を例にして説明する。これを2進数に変換すると 0.00011001100... という無限循環小数になる。この数は 1.1001100... X 2^{-4} のように書くこともできる。このときの 1.1001100... を仮数、2の肩にのっている -4 を指数という。このように 小数点つきの数は、仮数の符号 仮数 X 2^a の形で表現できる。 このような数どうしの和を求める手順は次の4段階からなる。

  1. 指数部の比較 (Compare)
  2. 仮数部の桁合わせ (Shift)
  3. 仮数部の加算 (Add)
  4. 加算後の正規化 (Normalize)

正規化というのは 1.***** X 2^a の形に揃えることである。浮動 小数点数どうしの和という演算をこれら4つの部分(C,S,A,N)に分けて、従来 のように N が終わるまで待たずにすぐ次の C をはじめることで高速化が はかれる。このような機能を持った演算装置のことをパイプライン式演算 装置、この方式によるスーパーコンピュータのことをパイプライン式スーパー コンピュータあるいはベクトル計算機とよんでいる。これに対して、 パイプライン式演算装置を持っていない計算機のことはスカラー計算機と 呼ぶ。パイプライン式スーパーコンピュータの代表が CRAY-1,2, CRAY X-MP, CRAY Y-MP など CRAY 社のスーパーコンピュータである。

コンピュータの性能をはかるときに、よく MFLOPS (メガフロップス)という 単位が用いられる。これは1秒間に100万回の浮動小数点演算を行うことができ る能力のことである。最近のワークステーションの性能は約30MFLOPS、 パイプライン式コンピュータでは CRAY EL92(2CPU) で 267MFLOPS、CRAY の C90 や 富士通VPP500 で1CPUあたり 1.5GFLOPS (=1500MFLOPS) 程度である。 このようにパイプライン式計算機を用いるとスカラー計算機にくらべて計算 速度が10 -- 20 倍はやくなる。パイプライン方式を採用したコンピュータは 1980年頃に製品化され、大学の大型計算機センターなどでも、この方式による スーパーコンピュータを利用できるようになった。従来のプログラムを少し手直しする だけで、計算速度が一挙に20倍になった感動を忘れることはできない。ただし、 パイプライン方式のスーパーコンピュータには次のような限界があるため 1CPUで現在あるもの以上の性能を出すことは難しくなってきている。

  1. 計算要素の個数が少ないと最初にパイプラインに入ったデータが出てく るまでの時間がかかるのであまりはやくならない。数十個以上の要素があるこ とが望ましい。
  2. パイプラインの段数以上ははやくならない。スカラー計算機にくらべて 10 -- 20倍が限界である。
  3. パイプライン中を流れるデータの間に相互依存関係があると、ある結果 がパイプラインから出てこないと次の計算ができないのではやくならない。

並列処理方式

多数の処理ユニット(Processing Unit: PU と略する)を並列に動作させること によって高速化する方式である。発想的にはパイプライン方式よりもこちらの 方が自然かもしれない。人間の脳における情報処理なども多数の神経細胞が協 調して並列動作することによって行われているといわれている。技術的には、 パイプライン方式よりもこちらの方が難しく、さまざまな実験、失敗を経てき た。有名なのが1970年頃にアメリカで開発されたILLIAC-IVである。 当時はまだLSIのような素子技術が未熟であったことと、並列計算に特有な問 題(演算ユニット間の通信がボトルネックになることなど)のために、このプロ ジェクトは成功したとはいえなかった。このあたりの話は 参考文献[7]に詳しく 書かれている。この教訓から、その後のスーパーコンピュータは当時の技術で も可能だったパイプライン方式を採用することになった。

ところが、上で述べたように、もはやパイプライン方式では性能向上が限界に きている。そこで再びさかんになってきたのが並列計算機の開発である。この 背景としては、LSI技術の進歩によって、演算ユニットをLSI化して大量生産す ることが可能になったこと、LSI化にともなって演算ユニットの信頼性が向上 したことがあげられる。初期の製品の例としては、コネクションマシン (参考文献[8])や日本 で開発されたPAXなどがある。特に、後者は隣あう格子点間の通信を高速化す ることに焦点を絞った設計になっていて、流体や電磁流体の計算に適した並列 計算機であった。PAX はその後、進化して素粒子理論の計算のための QCDPAX が作られた。これは1台あたり30MFLOPS のPUを480個2次元トーラス状に配置 したもので 14GFLOPS の性能を持つ。メモリは 3GB である。PAX の開発に ついては文献2,3、QCDPAX については文献5を参考にするとよい。 現在、QCDPAX の次の世代の並列計算機として筑波大学計算物理学研究センター を中心として計算物理学研究のための超並列計算機 CP-PACS (300GFLOPS以上、 メモリは 48GB以上)が開発された。並列化によってパイプライン型スーパーコ ンピュータの100倍の性能が実現されたわけである。現在、1TFLOPS マシンが 利用可能になっている。2002年には40TFLOPSの性能を持つ地球 シミュレータが完成する予定である。

並列計算機は処理方式によって SIMD (Single Instruction stream Multiple Data stream) と MIMD (Multiple Instruction stream Multiple Data stream) に分類される。

  1. SIMD : 単一命令が複数のデータに対して同時並列処理を行う。
  2. MIMD : 複数の独立した命令が複数の異るデータを処理する。

メモリの配置に関してもふたつの方式がある。

  1. 共有メモリ型 : すべてのPUでメモリを共有する方式である。従来の プログラムからの変更が少なくてすむという利点はあるが PU の個数が 多くなるとメモリアクセスの競合のために性能が低下する。千葉大学 教育用計算機システムの中では CS6400がこの方式を採用している。PU 数は 28個(最大64個)、メモリ-PU 間のバス速度は 1.2GB/sec、現在塔載されて いるメモリは1792MB (64MB*28) である。
  2. 分散メモリ型 : 各PUがローカルなメモリを持ち、データは PU間 通信によって相互に送られる方式。メモリアクセスの競合の問題は回避 できるが PU間通信がボトルネックになる。また、PU間通信の部分をプロ グラム中に記述する必要があるため、従来のプログラムを大幅に書きかえる 必要がでてくる。たとえば流体計算で、あるPUが担当している領域の境界 部分のデータを更新するためには、隣のPUからデータを送ってもらう必要 があり、そのデータが届くまで計算を先に進められなくなる。

PUとPUの接続方法については以下のような方法がある。

  1. 2次元、3次元配列 : 基本的には隣どうしのPUだけを結ぶ。2次元配列 の場合には上下、左右の4PU、3次元配列なら上下、左右、前後の PU である。 ただし、PU を平面あるいは直方体に配置したときの端どうしの PU も結んで おく。こうしておけば、周期的な構造を持つシステムシのミュレーションで 利用される周期境界条件を簡単に実現することができる。この方式の欠点は 遠方にあるPUと通信しようとすると途中のPUを経由していかないといけない ので時間がかかるということである。流体計算などでは隣の格子点の情報だ けが必要なことが多いので、この方式で十分である。
  2. nキューブ : n次元立方体の隣りあう頂点に位置するPUどうしを結ぶ 方式である。各PUの番号を2進数であらわしたときに、各ビットの値を反転 して得られる番号の n個のPUと接続する。たとえば 16個のPUがあるとき 0000 番の PU と 0001,0010,0100,1000 番(いずれも2進数)を結ぶ。PU 番号のハミング距離が1のPUどうしを結ぶという言いかたもできる。いずれの 2PU 間のハミング距離も n 以下である。平均距離は n/2 になる。
  3. クロスバーネットワーク : PU と PU の節点を ON/OFF することによっ てどのPUとでも通信できるようにした方式である。富士通の VPP などで 採用されている。

分散メモリ型の並列計算機では PU間通信がボトルネックになる。たとえば n個のPUにひとつづつ記憶されている n個のデータの和を求めたいとき、各 PUについてまず左隣のデータとの和を求め、次にふたつ左のPUとの和、4つ左 のPUとの和.... というようにして求めていく方法がある。このときの加算 回数は k=log_2 n 回となって逐次計算機を用いる場合の n 回にくらべて n が大きければ十分小さくなり並列計算機を使うときわめて高速に処理でき るように見える。ところが、PUは隣どうししか結ばれていないとして左隣か らデータを受信するのにかかる時間を a とすると、転送時間は全部で a + 2a + ... + 2^{k-1} a = (n-1) a であり、a が十分小さくないと並列 計算の有効性が生かせなくなる。流体計算についても同様で PU間通信で境界 のデータを集めてくる時間がPU内部の格子点の値を更新する時間より十分 小さくないと並列計算機を用いてもスピードアップできない。