240SP対800SPは240SIMT対160SIMDに置き換わる?
NVIDIAはGeForce GTX 200シリーズの1IU+8SPで命令を実行していく仕組みに「SIMT」(Single Instruction, Multiple Thread)という新しいキーワードを与えている。これは「1命令の実行を完了するまでに複数スレッドを動かす」という意味になる。
一方、Intelのベクトル演算拡張命令セット「SSE」や,ATI Radeon HD 4800シリーズの5SP構成はSIMD(Single Instruction, Multiple Data)と呼ばれる。これは「1命令で複数データを処理する」というのが直訳になるが、意訳すると「1命令が複数の演算リソースを同時駆動させて複数データを効率よく処理する」という意味になる。
この、「SIMTのNVIDIA」と「SIMDのATI」という部分が現行GeForceと現行Radeonの特徴であり、両者それぞれのアーキテクチャ思想の違いの"現れ"の部分となっている。
GeForce GTX 280のSIMTでは,任意の要素数のベクトル演算を、SM(のIU)がデコードし、その支配下となる8基のSPから、必要な数だけを活用して実行スレッドを発生させ、その時点でSPが余っていたり、SPがメモリアクセスを発注していて、その結果が返ってくるまでストールしていたりするのを検知すると、IUは次の命令を受注し、SPを活用すべく別のスレッド発生させる。この仕組みにより、SMは常に複数の実行スレッドを請け負い、休みなく働かされることになる。
一方、Radeon HD 4800シリーズは、圧倒的な800基のSPがあるが、800個の個別の処理が同時実行出来るわけではない。5SPで1SIMDユニットとなるため、同時に実行できる命令はSIMDユニット単位…つまりは160個(160SIMDユニット=800SP÷5)となる。
1SIMDユニット内の5SPは、任意の要素数のベクトル演算とスカラ演算の組み合わせを同時実行できるようになっているが、それは実行する計算結果に依存関係がない場合に限られる。また、5基のうちの1ビッグSPの特殊能力を活用する場合や分岐命令を伴う場合には、1SIMDユニット内の全ユニットを高効率に活用し続けるのはなかなか難しい。
同時多発的に依存関係の複雑な計算をさせる場合にはRadeon HD 4800シリーズのSIMDアーキテクチャは適さない。そうしたケースではGeForce GTX 200シリーズの方が1SPあたりの機能が高く、命令粒度が細かく実行できる分、優位になる。
しかし、分岐命令の登場頻度も少なく、依存関係のない複数要素ベクトル計算が大量に発生する処理……例えば3Dグラフィックス処理ということになると、途端にRadeon HD 4800シリーズのSIMDアーキテクチャが優位に働く。それこそ3Dグラフィックス処理では、5SP括り(縛り?)のSIMDアーキテクチャが苦にならず、800SPが理想に近い形で働いてくれる。
GeForce GTX 280の演算性能は933GFLOPS、Radeon HD 4870は1.2TFLOPS(1200GFLOPS)であり、このスペックだけを見るとRadeon圧倒的優勢に見えるが、一般的なGPGPUアプリケーションはGeForceアーキテクチャの方が高効率に演算リソースが利用されハイパフォーマンスが期待できる。それではRadeonがダメなのかというと、そんなことはなく、うまくSIMDユニットをフル活用するようにアプリケーションを構成できさえすれば、1.2TFLOPSの性能が発揮できることだろう。