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○