ARMの64bit命令セットと32bit命令セットの速度比較


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 整数を含む計算ではだいぶ差が出ることがありそう。
浮動小数点数では差が出なさそう。

まあマイクロベンチマークなので、この実験だけでははっきりわからないのだけれど。