前回(2022年3月17日の日記参照)同様に自治体の接種会場に行きました。ワクチンは前回同様にモデルナ製です。
時期的には5回目の接種時期ですが、私はうっかりしていて1回行くのを忘れてしまい、今回が4回目の接種です。いつもながら看護師を始めとした医療従事者の皆様は非常に親切かつ効率的に働いていました。ありがてぇことです。
マメな世の中の人はみな5回目の接種だからか、接種会場では「5回目の接種でよろ……あら?4回目です?」って2度ほど聞かれました。ワクチンって打つ人は毎回打つし、打たない人は全然打たないのかなあ?
COVIDのワクチンは他のワクチンと比べると副作用が結構強いですよね。熱は解熱剤で何とかなるんですが、とにかく肩が痛い。
目次: RISC-V
最近はRISC-Vのシングルボードコンピュータ(SBC)が市販されています。嬉しい時代になりました。これからのお買い物の参考としてリストアップしました。
目次: ベンチマーク
FizzBuzzの実装は簡単ですが、可能な限り高速に出力しようとするとなかなか面白い遊びになります。今回は実装の改善ではなく、コンパイラを変えたらどうなるか試しました。gccとclangのどちらが速いかは場合によるみたいで、一筋縄ではいかないです。
ソースコードが散らかっていたので再整理し、実装も少し見直してシンプルにしています。最適化のアイデアや仕組みは今まで解説した通りです。
各最適化のアイデアは基本的に独立しており順不同で適用できますが、いくつか依存関係があります。
自分で実装してみたい人以外は気にしなくて良いと思います。
省電力PCの測定環境は、
デスクトップPCの測定環境は、
です。
全てのログを載せると大変なことになるので、clang -O3かつ省電力PC(CPU: Pentium J4205)で測定した結果のみを載せます。
# clang 20231019_fizzbuzz_simple.c -msse4 -O3 33.3GiB 0:07:38 [74.5MiB/s] [ <=> ] real 7m38.004s user 7m31.530s sys 0m50.762s # clang 20231019_fizzbuzz_base.c -msse4 -O3 33.3GiB 0:00:59 [ 573MiB/s] [ <=> ] real 0m59.485s user 0m58.090s sys 0m4.266s # clang 20231019_fizzbuzz_30.c -msse4 -O3 33.3GiB 0:00:56 [ 606MiB/s] [ <=> ] real 0m56.258s user 0m54.688s sys 0m4.597s # clang 20231019_fizzbuzz_offset.c -msse4 -O3 33.3GiB 0:00:16 [2.01GiB/s] [ <=> ] real 0m16.548s user 0m15.406s sys 0m3.040s # clang 20231019_fizzbuzz_div10.c -msse4 -O3 33.3GiB 0:00:09 [3.40GiB/s] [ <=> ] real 0m9.804s user 0m8.510s sys 0m3.004s # clang 20231019_fizzbuzz_sse.c -msse4 -O3 33.3GiB 0:00:04 [7.36GiB/s] [ <=> ] real 0m4.528s user 0m3.856s sys 0m1.875s
コンパイラの種類も変えて測定した結果を載せます。Pentium J4205でSSE版の実装を連続で実行すると負荷が掛かりすぎる(?)のか、サーマルスロットリングに引っかかるのか、極端に速度が低下してしまうことがあるため、30秒くらい間を空けて実行しています。
FizzBuzzの種類 | Pentium, GCC -O3 | 倍率 | Pentium, clang -O3 | 倍率 | Ryzen, GCC -O3 | 倍率 | Ryzen, clang -O3 | 倍率 |
---|---|---|---|---|---|---|---|---|
単純 | 452.839 | - | 458.004 | - | 100.475 | - | 101.528 | - |
独自itoa | 61.995 | x7.3 | 59.485 | x7.7 | 13.547 | x7.4 | 12.737 | x8.0 |
30個まとめ | 39.064 | x11.6 | 56.258 | x8.1 | 8.969 | x11.2 | 13.600 | x7.5 |
オフセット0xf6 | 10.071 | x45.0 | 16.548 | x27.7 | 2.097 | x47.9 | 4.114 | x24.7 |
1桁落とし | 7.687 | x58.9 | 9.804 | x46.7 | 1.684 | x59.7 | 2.712 | x37.4 |
SSE版 | 5.319 | x85.1 | 4.528 | x101 | 1.723 | x58.3 | 1.468 | x69.2 |
FizzBuzzの種類 | Pentium, GCC -Os | 倍率 | Pentium, clang -Os | 倍率 | Ryzen, GCC -Os | 倍率 | Ryzen, clang -Os | 倍率 |
---|---|---|---|---|---|---|---|---|
単純 | 515.882 | - | 457.593 | - | 101.853 | - | 102.073 | - |
独自itoa | 151.588 | x3.4 | 89.760 | x5.1 | 20.747 | x5.0 | 17.753 | x5.8 |
30個まとめ | 60.041 | x8.6 | 55.899 | x8.2 | 10.551 | x9.7 | 13.905 | x7.3 |
オフセット0xf6 | 21.828 | x23.6 | 15.536 | x29.5 | 4.836 | x21.1 | 3.666 | x27.8 |
1桁落とし | 16.237 | x31.8 | 9.902 | x46.2 | 4.787 | x21.3 | 2.456 | x41.6 |
SSE版 | 4.870 | x106 | 4.670 | x98.1 | 1.603 | x63.5 | 1.478 | x69.1 |
最速はclang -O3でしたが、常にclangの生成するコードが速い訳でもなければ、場合によってはO3がOsより遅くなることもありまして最適化の奥深さを感じます。
ソースコードはこちらからどうぞ。
< | 2023 | > | ||||
<< | < | 10 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 | - | - | - | - |
合計:
本日: