Nanashi-softプログラマ専用Linux ARM


◇Linux ARM -ARMの NEON (SIMD)を操る(2-

SIMD用の特殊なベクター変数は,普通の変数のように値を代入したりできません

×こういうことはできない
int32x4_t var;
var=0;
まぁ,中が4つに分かれているので,どれに入れるんだよ! という話です

代入は基本的にポインタ操作で行います
わかりやすい方法をいくつか書くと

・宣言と同時に代入する
int32x4_t 変数名={「数値」,「数値」,「数値」,「数値」};

0で初期化する
int32x4_t var={0,0,0,0};

もちろん変数を書くこともできます
int a=10;
int b=20;
int c=30;
int32x4_t var={a,b,c,0};

キャストしてみたりとか
unsigned char d=40;
int32x4_t var={(int)d,(int)d,(int)d,(int)d};

・ポインタを用意する
int32x4_t var;
int varp*=(int*)t var;

こうしてしまえば,後は配列のように書けます
varp[0]=50;
varp[1]=60;
varp[2]=70;
varp[3]=80;

こちらの場合,取り出す事もできます
int foo;
foo=varp[0];


ベクタ変数に代入と取り出し方法がわかると,演算できるようになります
int a=10;
int b=20;
int c=30;
int d=40;
int e,f,g,h;
e = a + 5;
f = b + 10;
g = c + 15;
h = d + 20;

この計算を SIMDにそのまま置き換えると,
//最初は同じ
int a=10;
int b=20;
int c=30;
int d=40;
int e,f,g,h;

//変数の中身と,それぞれに足す数字を,ベクタ変数に代入
int32x4_t v1={a,  b,  c,  d};
int32x4_t v2={5, 10, 15, 20};

//結果を入れるベクタ変数を宣言
int32x4_t var;
//var=v1+v2で4ついっぺんに足し算
var=vaddq_s32(v1, v2)

//ベクタ変数にポインタを当てて,値を結果の変数に入れる
int varp*=(int*)t var;
e = varp[0];
f = varp[1];
g = varp[2];
h = varp[3];

簡単ですね('-'*)


TOPプログラマ専用Linux ARM