RaspberryPi4 x NEON
ARMで実行できるSIMDをラズパイで動かしてみる
モチベーション
APPLE M1 が ARM ベースらしいと聞いて、
ARM では x86 の AVX が使えないから差異化できると思っていた.
しかし、 ARM でも NEON と呼ばれる SIMD 命令があるようなので
調べてみることにした
使用機材
Raspberry Pi4 8gb モデル
Clang Version 7.0
準備
1 #include <iostream>
2 #include <arm_neon.h>
3
4 using namespace std;
5
6 int main () {
7
8 cout << "hoge" << endl;
9
10 return 0;
11 }
$ clang++ -o test1 test1.cpp -mfpu=neon
In file included from test1.cpp:2:
/usr/include/clang/7.0.1/include/arm_neon.h:28:2: error: "NEON support not enabled"
#error "NEON support not enabled"
^
1 error generated.
ARM NEON 命令が有効化されていないようだ
$ clang++ -o test1 test1.cpp -mfpu=neon -march=armv7-a
これだとエラーはでない
効果は不明
後で気づいたが、Clang のターゲットが ARMv6 となっていた
$ clang -v
clang version 7.0.1-8+rpi3+deb10u2 (tags/RELEASE_701/final)
Target: armv6k-unknown-linux-gnueabihf
NEON は ARMv7 からサポートされる
(ARMv6 でも SIMD はある)
##第1次完成したコード
1 #include <iostream>
2 #include <arm_neon.h>
3
4 using namespace std;
5
6 int main () {
7
8 cout << "hoge" << endl;
9
10 int array1[2] = {31, 22};
11 int array2[2] = {11, 20};
12 int arrayAns[2];
13
14 int32x2_t v1, v2, vans;
15 v1 = vld1_s32(array1);
16 v2 = vld1_s32(array2);
17 vans = vqadd_s32(v1, v2);
18
19 vst1_s32(arrayAns, vans);
20
21 cout << arrayAns[0] << ", " << arrayAns[1] << endl;
22
23 return 0;
24 }
2行目
#include <arm_neon.h>
neon 用インクルード
14行目
int32x2_t
neon 用型
他にも 64bit 用として
uint8x8_tとか
float32x2_tとかある(っぽい)
128bit 用として
uint8x16_tとか
int32x4_tとか
float32x4_tとかある(っぽい)
15,16行目
NEON 用 load 記述
SIMD用レジスタにロードしてるっぽい
17行目
NEON 用 加算命令
s32 なので signed int 32bit 用
19行目
NEON 用 Store 命令
NEON 用 レジスタから値の回収を行う
実行結果
$ clang++ -o test1 test1.cpp -mfpu=neon -march=armv7-a -O3
$ ./test1
hoge
42, 42
期待通りの結果は得られた