Nanashi-soft○プログラマ専用○Windows gcc SDL○
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)の方がケタ違いに速いのです