1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RaspberryPi4 x NEON

Posted at

RaspberryPi4 x NEON

ARMで実行できるSIMDをラズパイで動かしてみる

モチベーション

APPLE M1 が ARM ベースらしいと聞いて、
ARM では x86 の AVX が使えないから差異化できると思っていた.
しかし、 ARM でも NEON と呼ばれる SIMD 命令があるようなので
調べてみることにした

使用機材

Raspberry Pi4 8gb モデル
Clang Version 7.0

準備

test1.cpp

  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次完成したコード

test1.cpp
  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

期待通りの結果は得られた

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?