2022/09/16(金)kv-0.4.55
今年の1月に、M1 macの区間演算は遅い?という記事を書きました。このときに、ARM CPUでのinline assemblerによる丸めの向きの変更のコードを追加していたのですが、大して面白い変更では無かったので放置していました。気づいたら8ヶ月も経ってしまい、細かい修正も溜まってきたのでここでいったん公開することにしました。
というわけで、今回の変更はARM CPUで-DKV_FASTROUNDを付けるとinline assemblerによる丸めの向きの変更が使えるようになる、というものです。ARM 64bitだけでなく、一応ARM 32bitでも動くようにしたつもりですが、あまりテストされていません。
詳細は丸めモードの変え方とコンパイルオプションまとめの「6. ベンチマーク」に書きましたが、一般的にARM CPUでは丸めのモードを変更すると実行時間で大きなペナルティがあるようで、Intel CPUに比べてかなり遅いです。ARM CPUではハードウェアによる丸め変更を一切行わずにソフトウェアで方向付き丸めをエミュレートするのが一番速いという、残念な状況になっています。これを、精度保証に向かないCPUが普及しつつあって残念と見るか、エミュレーションのアルゴリズムを開発しておいて良かった、と見るか。
以下、とある区間演算を多用したプログラムを、端点がdouble精度の区間演算と、端点がdd精度の区間演算の場合について、オプションを変えながら実行したときの実行時間を上のページから抜き出しておきます。爆速のはずのM1 chipの計算速度が遅く、-DNOHWROUND (ソフトウェアエミュレートによる丸め変更) が一番まともになっているのが分かります。
core i5 11400
計算精度(端点の型) | コンパイルオプション (-O3 -DNDEBUGに加えて) |
計算時間 | |
---|---|---|---|
-DKV_USE_TPFMAなし | -DKV_USE_TPFMAあり | ||
double | なし | 6.65 sec | |
-DKV_FASTROUND | 3.74 sec | ||
-DKV_NOHWROUND | 7.88 sec | 6.05 sec | |
-DKV_USE_AVX512 -mavx512f | 2.74 sec | ||
dd | なし | 37.20 sec | 33.58 sec |
-DKV_FASTROUND | 25.08 sec | 21.52 sec | |
-DKV_NOHWROUND | 92.24 sec | 71.81 sec | |
-DKV_USE_AVX512 -mavx512f | 16.47 sec |
M1 MacBook Air
計算精度(端点の型) | コンパイルオプション (-O3 -DNDEBUGに加えて) |
計算時間 | |
---|---|---|---|
-DKV_USE_TPFMAなし | -DKV_USE_TPFMAあり | ||
double | なし | 24.45 sec | |
-DKV_FASTROUND | 22.36 sec | ||
-DKV_NOHWROUND | 9.08 sec | 6.03 sec | |
dd | なし | 108.8 sec | 100.6 sec |
-DKV_FASTROUND | 102.4 sec | 94.64 sec | |
-DKV_NOHWROUND | 84.60 sec | 53.76 sec |