19-May-2020の続編ではありません。(ここから長い前置き)Orange Pi One Plus(Allwinner H6)でのOpenBSD/arm64の動作テストを行っている際、ネットワークが動かないのでarmbianを動かしてみる→もしかしてAArch64だけでなくAArch32なバイナリも動いたりしませんか?→じゃあちょっと試してみましょう→なんか動いちゃったので適当なコードで試してみましょうか、という訳で。(ここまで長い前置き)
ちゃんとメモを取っていた訳では無いのでもしかすると誤りがある可能性がありますが、AArch64なarmbianでAArch32なバイナリを動かすため必要なことは四つ。
- apt-get install crossbuild-essential-armhf
- echo "/usr/arm-linux-gnueabihf/lib" > /etc/ld.so.conf.d/arm-linux-eabihf.conf
- ln -s /usr/arm-linux-gnueabihf/lib/ld-2.28.so /lib/ld-linux-armhf.so.3
- /sbin/ldconfig
あとはarm-linux-gnueabihf-gccでコンパイルし、得られたAArch32オブジェクトを実行すれば良い訳ですが…何かのライブラリ(例えばLibreSSL)のAArch32版が要る!となった場合については分かりません。
25-Apr-2020に記したテスト方法で、AArch64/AArch32それぞれにコンパイルオプションを設定して試してこんな感じ。
- AArch64(gcc-8.3.0)
option | encode | decode |
---|---|---|
-O3 -march=armv8-a+fp+simd | 8.858s | 3m0.391s |
-O3 -march=armv8-a+fp+simd -ffast-math -DFLOAT_APPROX | 8.890s | 2m54.571s |
-Ofast -march=armv8-a+fp+simd -DFLOAT_APPROX | 7.023s | 2m44.057s |
- AArch32(arm-linux-gnueabihf-gcc-8.3.0)
option | encode | decode |
---|---|---|
-O3 -march=armv8-a -mfpu=neon-fp-armv8 | 11.416s | 3m2.165s |
-O3 -march=armv8-a -mfpu=neon-fp-armv8 -ffast-math -DFLOAT_APPROX | 7.653s | 2m36.745s |
-Ofast -march=armv8-a -mfpu=neon-fp-armv8 -DFLOAT_APPROX | 7.665s | 2m36.888s |
-O3 -march=armv8-a -mfpu=neon-vfpv4 | 11.370s | 3m22.586s |
-O3 -march=armv8-a -mfpu=neon-vfpv4 -ffast-math -DFLOAT_APPROX | 7.628s | 2m56.099s |
-Ofast -march=armv8-a -mfpu=neon-vfpv4 -DFLOAT_APPROX | 7.519s | 2m54.130s |
-O3 -march=armv7-a -mfpu=neon-vfpv4 | 11.982s | 3m27.884s |
-O3 -march=armv7-a -mfpu=neon-vfpv4 -ffast-math -DFLOAT_APPROX | 7.961s | 3m4.428s |
-Ofast -march=armv7-a -mfpu=neon-vfpv4 -DFLOAT_APPROX | 8.009s | 3m5.798s |
-O3 -march=armv7-a -mfpu=neon-vfpv3 | 11.915s | 3m31.134s |
-O3 -march=armv7-a -mfpu=neon-vfpv3 -ffast-math -DFLOAT_APPROX | 7.874s | 3m8.154s |
-Ofast -march=armv7-a -mfpu=neon-vfpv3 -DFLOAT_APPROX | 7.950s | 3m4.763s |
何と何を比較して、どう評価するか悩む結果なのですが…AArch64の"-march=armv8-a+fp+simd"とAArch32の"-march=armv8-a -mfpu=neon-fp-armv8"のdecodeで比較するのが良いのでしょうか。-ffast-mathだの-Ofastだのを指定しない場合はAArch32よりもAArch64の方がちょっぴり速いと言えそうですが、指定した場合はAArch32の方が速くなるのが謎です。AArch32同士では、neon-fp-armv8→neon-vfpv4→neon-vfpv3の順に遅くなっていく、と乱暴に結論付けます。
Cortex-A53の場合においては、
- AArch64/AArch32のパフォーマンスはそんなに差がない(極端に速くもならないし遅くもならない) ※ただし例外あり
- AArch32でもARMv8な石なら(neon-)fp-armv8を使う方が良い
- FreeDV 2020は無理
という感じに見えますが、Raspberry Pi4等に使われるCortex-A72だとどうなるんでしょうかね?52.50kg(20:55)