SIMD
single instruction multiple data(SIMD[1])とはフリンの分類のひとつで、命令列は1つだが、それを複数のデータ列に適用する、コンピュータの並列化の形態を指す。この手法にもとづく演算をパック演算(パックド演算)やベクトル演算という。
解説
例えばFortranにおけるdoループのような、同一の演算を繰り返すような操作をスカラー計算機のように逐次的に行うのではなく、一度に行うものである。
例えば、通常32ビットのデータを受け付けるプロセッサなら128ビットのデータを4回のクロックで計算するが、128ビットのデータを受け付けるプロセッサは、1回のクロックで処理が済む。ただ多くの場合、128ビットを使い切るデータはあまりなく、一般に128ビットを2分割し64ビットとして使うか、4分割して32ビットとして使うが、結局それぞれ1回のクロックで2倍、4倍のデータ処理が可能になり、結果として相対的に低いクロックでも高い性能を引き出しやすい。
例えば音声データの音量を倍にしたいとする。デジタルデータではある瞬間の音量が数値とされて記録されているので、全ての値を倍にすればよい。このように大量のデータに同じ処理を施すときに性能を発揮するため、一般にはマルチメディアの処理に向いているとされる。
SIMD型で、複数の演算装置を並列に使用する計算を初期に試みたコンピュータとしては、ILLIAC IVがある。これに対し、Cray-1のような典型的なベクトル型スーパーコンピュータでは並列に計算するのではなく、パイプライン処理により1個の演算装置を休ませることなく計算させ続ける(ベクトル演算という用語は、広義には1命令で複数の要素を計算させるものについて、同時(並列)に計算するものも、パイプラインで計算するものも指すが、ベクトル計算機と言った場合は主として、20世紀のスーパーコンピュータに多く採用されていたパイプライン型を指すことが多い)。
他の技術と同じく1990年代後半からパーソナルコンピュータ、ゲーム機等にも応用された。
全ての処理をこれで行えないこともないが、例えば画像にぼかし処理を100回かける等の場合、単純に0から99まで数え上げる手法を用いることがある。このような場合では、単純に変数を1つ用意して0に1を99になるまで足し続けるが、これがはみ出さないように格納するためには1バイト(8ビット:0~255の数値を表現可能)で十分なので、128ビットの処理幅を持つプロセッサでは無駄が大量に発生するため、通常はSIMDユニットは使わず、通常のALUを使うことが多い(こういったプロセッサに合わせた最適化はコンパイラが行ってくれることも多い)。
例
マイクロプロセッサ
命令拡張
- x86 の MMX・3DNow!・SSE(AVX)
- PowerPC の AltiVec(VMX)
- ARM の NEONなど(ARMアーキテクチャ#SIMD)
- SPARC の VIS(w:Visual Instruction Set)
- MIPS の MIPS-3D(w:MIPS-3D)・MDMX(w:MDMX)
- PA-RISC の MAX(w:Multimedia Acceleration eXtensions)
- Emotion Engine のCPUコアもSIMD拡張命令を持っている
- など
演算装置
演算装置自体がSIMD型のもの
GPU
GPUはSIMD型がほとんどである。
物理演算プロセッサ
3Dゲームに必要な物理演算を高速化する為、SIMDを利用。
- PhysX(用のチップ)
汎用アクセラレータ
PCI Express接続の汎用SIMDアクセラレータ。倍精度の行列演算を高速に行う目的で、ワークステーション、HPCなどに搭載される。
- CSX600 - クリアスピード社によるメニーコアSIMD演算ユニット