2010年9月5日日曜日

よりコントロールされた並列処理のSIMD

今までの説明の中で、プログラマが意識しない場所で、並列化による高速化が行われてきた事を、説明しましたが、プログラマが書いたソースコードが並列化に向かない書かれ方がされている状況では、CPUが勝手に高速化するのにも限界があります。

その中でプログラマがコントロール可能な並列処理として登場したのが、SIMD(Single Instruction Multiple Data)です。

SIMD
SIMDが実現する事はその名の通り、一つの命令により複数のデータを扱う事です。
下記の計算を行う場合に通常のCPU命令では、4回足し算の命令を実行する必要があります。
  • A+B
  • C+D
  • E+F
  • G+H
しかし、SIMDを利用すれれば一回命令を実行するだけで、同じ実行結果を得る事が可能です。

SIMDを利用して計算を行うには扱うデータに制限があります。
前述の足し算の例では下記の制限が出来ます。
  1. 左辺の4つの値をひとかたまりのデータとして隣り合った場所に並べる事
  2. 右辺の4つの値をひとかたまりのデータとして隣り合った場所に並べる事
  3. 結果の出力場所も4つの値の結果がひとかたまりのデータとして隣り合った場所になる事
これらの制限は、単に足し算4回を高速化するには面倒ですし、一度に4つの足し算が同時に実行される為、同時に実行される個々の計算に依存関係が在ってはなりません。

こんな面等な機能を何に使うんだという話が出てきそうですが、ベクトルの計算をする場合にはとても便利に使えます。
SIMDの命令には足し算の他に、引き算、掛け算、割り算、逆数を計算したり、 平方根を計算する命令まで存在し、明らかにベクトルの計算をする為の機能が各種そろっています。
また、ひとかたまりのデータとして扱わなければいけない制限も、ベクトルとして扱う場合には、問題になりません。
インテルのCPUではMMXペンティアムからMMXとして搭載され、その後SSEとして拡張が現在も続けられています。

ここで重要な事は、並列処理がプログラマにコントロールされる事により、今までと比べて大きな処理速度向上が可能な事。そして並列処理を行う為には、プログラムの構造が元々並列処理に向いている必要があると言うことです。

0 件のコメント:

コメントを投稿