SIMDプロセッサ

SIMDと一口に言っているが、考え方としては2つあり、ひとつは各演算器のデータ幅や個数を増やすことによってSIMDを実現する方法、ふたつ目は演算器をパイプラインのようにつなげることによってスループットを増やす方法だ。

ひとつ目の演算器のデータ幅を増やすというものは単純に64bitの演算器を複数個つなげて処理するだけで幅の広がった普通のCPUと考えることができる。また、複数の小さなコアを大量に用意するGPUもどちらかといえばこちらに分類することができるだろう。

一方、ふたつ目の演算器をパイプライン化することによるアプローチはチェイニングと呼ばれる。これは昔のベクトルプロセッサで使われていた手法である。

例えば

add $v1, $v2, $v3
mul $v4, $v1, $v2
sub $v5, $v4, $v3

という命令列を1万個の要素をもつ配列に対して行いたいと仮定する。一見この命令列は一個前の命令に依存しているため並列に実行できないように思われる。しかし、これはベクトルプロセッサなのでレジスタの$v1~$v5はベクトルレジスタである。これを念頭にして考えるとadd命令の1つめの要素の処理が終わればaddの2つめの要素の処理が終わるのをまたなくてもmul命令を実行可能であることが分かると思う。この特徴を利用したのがチェイニングだ。

チェイニングを利用すれば演算器の数をそんなに増やさないでも並列性を利用することが可能だ。したがって単に演算器の個数を増やした計算機よりも実装面積を抑えることが可能なように思えるが、適切なハザードなどを管理しなければならないため実装は想像以上に複雑だ。