計算セクション

Cray-1の計算セクションの構成を図1.40に示す。Cray-1の高い演算性能を実現するのが、64要素の8本のベクトルレジスタとAdd、Logical、Shiftのベクトル演算ユニットと浮動小数点のAdd、Multiply、近似逆数生成ユニットからなるベクトル演算機構である。なお、Cray-1は割り算器は持っておらず、逆数生成ユニットを使って計算を行う方式であった。逆数生成の精度は30ビットで、ニュートン法で1回計算を行えばCray-1の浮動小数点数の47bitの精度が得られた。

この方法は面倒なようにも思うが、通常の割り算器の場合は、例えば14サイクルにわたって割り算器を占有してしまうのに対して、逆数生成器は、最初の待ち時間は14サイクルであるが、その後は毎サイクル逆数を生成してくれる。この逆数の初期値を使って3~4回の演算を行えば割り算ができるので、ベクトル演算の場合は、1回の割り算あたりの処理時間は、このやり方の方が高速に計算できる。

計算セクションの構成要素

なお、Cray-1の浮動小数点加算は6段パイプ、浮動小数点乗算は7段パイプ、逆数近似は14段パイプで作られている。

これに8個のスカラレジスタとスカラ用の演算ユニットがある。なお、スカラユニットは、浮動小数点演算はベクトル演算器を利用している。また、スカラユニットは割り算器を持っておらず、除数を浮動小数点数に変換してから逆数近似を計算し、それを被除数に掛けるといいう計算を行う必要があった。

Cray-1は12.5nsのクロックであったので、40nsクロックのSTAR-100などと比べて、スカラ演算も3倍くらい速かった。

そして、8個のアドレスレジスタとアドレス計算用の演算器を持っていた。なお、アドレス計算は24bitで行われる。

そして、スカラ計算には、8個のSレジスタに加えて64エントリのTレジスタがある。Tレジスタは、Sレジスタ、あるいはメモリとデータをやり取りすることができるレジスタであり、Sレジスタが不足する場合のデータの退避、復元や、Sレジスタの値をメモリに格納するために使用される。

アドレス計算用にも64エントリのBレジスタがあり、BレジスタはAレジスタやメモリとデータをやり取りできるレジスタである。

そして、TレジスタとBレジスタへのメモリとのデータ転送はブロック転送を行うこともできるようになっている。

このように、Cray-1はベクトル演算の場合もVレジスタを入力とし、演算結果をVレジスタに書き込むというレジスタベースのマシンとなっている。また、演算結果を別の演算器の入力として、演算性能を上げることができた。このような接続はチェイニングと呼ばれる。通常のベクトル演算の場合は138MFlops程度の性能が上限であるが、チェイニングを行うと短時間の間は250MFlops程度まで性能を上げることができた。

また、STAR-100では最大64K要素までのベクトルを扱うことができたが、Cray-1では64要素と短いベクトルしか扱えない。これに対しては、Crayはコンパイラでベクトルを分割して処理するという方法で、64要素より長いベクトルを処理するという方法を取った。

  • Cray-1の計算セクションの構成

    図1.40 Cray-1の計算セクションの構成。64要素の8本のベクトルレジスタと演算器群、8本のスカラレジスタと演算器、アドレス計算ユニットと4個の命令バッファを持っている

なお、ベクトル演算用に、演算するベクトルの長さを指定するVLレジスタと、ベクトルのマージやテストを行う場合に、ビット対応で要素ごとにマスクを行うVMレジスタを持っている。

割り込みをサポートしたCray-1

命令の発行部は図1.40の下の部分で、4枚の命令バッファがある。1枚の命令バッファには16bitの短い命令なら64命令を格納できる。そして、命令カウンタPに従って、命令バッファから命令を読み出して上位16ビットをNIPレジスタ、下位16ビットをLIPレジスタに入れる。次の命令を保持するNIPレジスタからカレントに実行する命令をCIPレジスタに移して命令を実行する。32ビット命令の場合は、CIPとLIPの両方のレジスタから命令を発行する。

命令バッファは、格納された命令ブロックの先頭アドレスを記憶するレジスタを持ち、次に実行する命令がどの命令バッファに入っていても読み出すことができる。今風にいうと、64命令を格納する4つのキャッシュラインがあり、4つのラインはフルアソシアティブに検索されるという構造になっている。

どの命令バッファにもヒットしない場合は、割り込みを発生してCPUで走っているモニタに通知し、モニタが次に実行して行く命令ブロックを命令バッファに転送して、新しく読み出してきた命令を実行させていく。

この割り込みで、どこのアドレスの命令を実行させるかはモニタが制御することができ、例えば、周辺装置からの割り込みの場合は、その装置のデバイスハンドラの命令をロードして実行させるというようなことを行う。

なお、CDC6600と違って、Cray-1では、このように割り込みをサポートしているし、各プログラムが使えるメモリアドレスのベースと上限を指すレジスタが設けられている。

(次回は7月27日に掲載します)