このページの本文へ

前へ 1 2 3 次へ

ロードマップでわかる!当世プロセッサー事情第307回

スーパーコンピューターの系譜 演算に不可欠なアクセラレーター

2015年06月11日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/) 編集●北村/ASCII.jp

  • この記事をはてなブックマークに追加
  • 本文印刷

 今回からスーパーコンピューターの系譜は、少しだけ横道に逸れる。何の話かと言えばコプロセッサー/アクセラレーターである。

 アクセラレーター、という概念はHPCに限らず昔から広く利用されてきていた。例えばIntel 8086にはIntel 8087なるコプロセッサーが利用できるようになっていたし、似たようなものとしてはMotorolaの68881やNational SemiconductorのNS32081など、もう並べ立てると山のように出てくる。

Intel 8087。画像はWikimedia Commonsより(http://commons.wikimedia.org/wiki/File:Intel_8087.jpg

 この連載でもコプロセッサーの歴史を連載212回でまとめている。要するに浮動小数点演算を行なわせるためのものだ。なぜこれがコプロセッサーの形になったかというと、回路規模の問題である。浮動小数点演算をある程度の有効桁数で実行させようとすると、そこで必要とされる回路はかなり大きくなる。

 昔の半導体製造技術では、この回路規模がメインとなるプロセッサーより大きかった。例えば8086はトランジスタが2万9000個で構成されるが、8087は4万5000個だった。

 これを1つにしてしまうと、CPUを構成するダイのサイズが倍以上に膨らんでしまいかねない。これは歩留まりに深刻な影響を与えるサイズで、製造上の理由により分割したかったというのが1つ。

 もう1つは、CPUの原価は結局ダイサイズで決まるので、FPUを統合すると原価が倍以上になる。ところが当時、そうした浮動小数点演算を高速に行ないたいというユーザーはそれほど多くなく、大多数のユーザーはFPUを統合して価格が上がることを好まなかった。

 とはいえ、HPCの市場では浮動小数点演算が遅いとまるで意味がない。したがって、汎用プロセッサーを使うマシンの場合は必ずFPUをペアで使うことが普通だった。インテルのiPSC/1iPSC/2などは、この典型例であろう。

iPSC/1。画像はComputer History Museumより

 また、FPUを持たないプロセッサーの場合、外付けの形でFPUを追加した。たとえばThinking MachinesのCM-2はWeitek WTL3132 FPUをシステム全体で2048個も搭載しているが、これなど典型的な例であろう。

CM-2。画像はComputer History Museumより

 これがコプロセッサーとアクセラレーターの違いでもある。上記の例で言えば、iPSC/1やiPSC2はコプロセッサーで、CM-2はアクセラレーターとなる。では両者はなにが違うかというと、プロセッサー側が当初からそれを使うことを想定したものがコプロセッサー、外部に汎用の形で接続されるのがアクセラレーターというのが一般的な認識である。

 8087/80287/80387といったFPUの場合、8086/80286/80386と組み合わせて使うことが前提となっており、ハードウェア的にも専用のI/Fが用意されている。またソフトウェア的にも命令セットの中に当初からFPUを使うための命令が含まれており、これを使うことでFPUを駆動できた。「コプロセッサー」と称する場合は、こうした形で当初から利用することを前提としたものを指すのが普通である。

Intel 80387SX。画像はWikimedia Commonsより(http://commons.wikimedia.org/wiki/File:KL_Intel_i387SX.jpg)

 アクセラレーターとは、当初から組み合わせることを想定しない汎用的なものを指す。CM-5の場合がまさしくそうで、搭載されたWeitekのWTL3132は(名前はともかく)使い方は34bitの命令ポートと32bitのデータポートでつなげるだけの構成であり、速度を無視してよければ汎用I/Oポートをそれぞれのポートにつなぐだけで使えた。

WTL3132の構成。Weitek WTL3132/3332のデータシートより。ここでWTL3132が“COPROCESSOR”とされるのは、同じFPUのエンジンながら入出力ポートが分離されたWTL3332という製品は“DATA PATH”とされ、これとの対比のためと思われる

 命令セットにはWTL3132の命令は含まれていないので、汎用I/Oポート経由で以下のようにして使う。

  • (1) X Portに演算対象となるデータを格納する
  • (2) Code Portに演算命令を格納する
  • (3)演算処理が終わった頃を見計らい、X Portより演算結果を取り込む

 結構オーバーヘッドは多いのだが、それでもソフトウェア的に浮動小数点演算を行なう場合に比べると何倍も高速ということで愛用された。

 ちなみにさらに高速化するには、例えば演算元データの格納や演算結果の取り込みは、ポートI/OではなくDMAを使ったほうが良いし、毎回(1)~(3)を繰り返すのではなく、(1)で8回分の演算元データを格納、(2)を8回繰り返し、最後に(3)でまとめて8回分のデータを取り込むといったやり方がオーバーヘッド削減になる。

 ついでに言えば、「終わった頃を見計らう」のではなく、演算が終わったら割り込みでも飛ばしてくれるほうがよりスマートだろう。もちろんWTL3132にはDMAや割り込みの機能はないが、複数回の演算をまとめて実行くらいはアプリケーション側でなんとかなるので、その程度のチューニングは行なわれたであろう。

(→次ページヘ続く 「プロセッサーの高性能化で廃れたアクセラレーター」)

前へ 1 2 3 次へ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン