RaspberryPi 3B+ には Cortex-A53 が乗っている。
Cortex-A53 の命令セットは Armv8-A。64bit 命令を実行可能。
でも、普通に Raspberry Pi OS (Raspbian) を入れると、32bit になる。
$ uname -a
略 armv7l GNU/Linux
なんかもったいないなぁと思いつつ、どれぐらいもったいないのかは全然知らなかった。
で。
今日も楽しいマイクロベンチマーク。
64bit 環境を用意する
Raspberry Pi 4B 64bit kernel を試す を参考にしたら簡単にできた。
記事のタイトルに 4B とあるが、 3B+ でも同じだった。
$ uname -a
略 aarch64 GNU/Linux
ちゃんと 64bit になったっぽい。
バイナリをつくる
当初は、 clang か gcc で arm64 バイナリ作ろうと思ったんだけど、簡単には arm64 バイナリを作れそうになかったので、仕方なく、 go で行くことにした。
時間を測る
- 無意味な計算を uint64, float64, float32 で行った
- 環境は、MacBook Pro (Retina, 15-inch, Mid 2015) と 64bit化された Raspberry Pi 3B+
- バイナリは、 amd64 と Armv7, Armv8。
- ビルドは macOS 行った。これは、 Raspberry Pi に go 1.14 を入れるのがめんどくさかったから。
測った結果
uint64
計算内容は、足し算、乗除、そしてローテート。
グラフがグネグネしているのでよくわからないが、2〜3倍 Armv8 の方が速い模様。
float32
計算内容は、足し算と乗除。
neon の効き具合に差が出るかと思いきや、大差ない感じ。
float64
計算内容は、足し算と乗除。
こちらも neon の効き具合に差が出るかと思いきや、大差ない感じ。
まとめ
Armv8 (amd64, aarch64) 命令セットが使えれば、64bit 整数を含む計算ではだいぶ差が出ることがありそう。
浮動小数点数では差が出なさそう。
まあマイクロベンチマークなので、この実験だけでははっきりわからないのだけれど。