Nanashi-softプログラマ専用Windows gcc SDL


◇PS3 Linux SDLでプログラミング -SIMDで計算する-

○難しく考えずに使う方法

VMXも SPU SIMDも、専用変数を使用して 16バイトずつ処理します
char型だと 16コ同時に、int型だと 4コ同時に計算できます

vector int d;
と宣言すると、int型が 4つ入った 16バイトがメモリ上に確保されます

データをどうやって代入すれば良いのか全然わからなかったのですが、試行錯誤の末発見しました
int *dp = (int *)&d;
と宣言すると
dp[0], dp[1], dp[2], dp[3]で各ベクタデータにアクセスできます

これを使うと、簡単にロジックが組めます

例えば、

int a, b, c;
a = 1;
b = 2;
c = a + b;

この cの足し算部分 c=s+bだけを SIMDで書くと

int a, b, c;
a = 1;
b = 2;
vector int va, vb, vc; //演算用のベクタ変数宣言
int *vap = (int*)va; //値を代入する為のポインタ宣言
vap[0] = a;
int *vab = (int*)vb; //値を代入する為のポインタ宣言
vab[0] = b;
vc = vec_add(va, vb); //a+bの足し算
int *vcp = (int*)vc; //値を取り出す為のポインタ宣言
c = vcp[0];

一見複雑に見えますが、ベクタ変数に値を入れて、足し算して、取り出しているだけです

この例は演算が1つだけなので無意味ですが、a,bが配列だった場合威力を発揮する事になります
SIMDは計算前の用意が必要なので遅くなるように感じますが、c = a + bより vc = vec_add(va, vb)の方がケタ違いに速いのです


TOPプログラマ専用PS3 Linux SDL