内容的には古いが、下書きのまま放置するのもアレなので公開
ビルド環境的にはあとはClang/LLVMかIntelCompilerにするくらいしか無さそうなので。
https://software.intel.com/en-us/qualify-for-free-software/opensourcecontributor
申し込んでみたけど、反応が無い。
主な処理のSIMD化とかやっているのでコンパイラを変えても性能向上の幅はどれほどあるのか。
それよりは分岐予測ミスの原因になりそうなところに手を入れたり、ミスキャッシュしないようにするべきかと。
⇒iccは遅い。最適化コードは非Intel CPUだと動かないようなのでそのせいかも
⇒aocc(AMD Optimized C/C++ Compiler)を試したが、WSL上では好成績だったが、Windows用のクロスコンパイルでは振るわず。
参考文献
http://jp.xlsoft.com/documents/intel/seminar/2_Sofrware%20Optimize.pdf
https://ja.wikipedia.org/wiki/Zen_(%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
> L1キャッシュは1コアごとに命令用に64KiB、データ用に32KiB、L2キャッシュは512KiB、L3キャッシュはコアあたり2MiB
https://en.wikichip.org/wiki/amd/microarchitectures/zen
https://password-hashing.net/submissions/specs/yescrypt-v2.pdf
PREFETCH
AArch64でプリフェッチを実装して高速化する記事を読んだので。
SSE2のmm_prefetchを効率化する。
prefetchのデータサイズは64Bなので_mm_prefetch()とサイズは合っている。
しかし、アクセスするアドレスが連続アクセスではなく、ランダムアクセスになっている。
→使う順にPREFECHしている。
→1回のPREFETCHは1~2KiB
→データ格納に2MiB、一時的な計算領域に1+2KiB
→計算に必要なメモリは全てキャッシュに収まっている。
→L3を使わず、できるだけL1,L2を使うようにする。
https://stackoverflow.com/questions/7327994/prefetching-examples
SIMD部分以外もPREFETCH出来る。
__builtin_prefetch
-fprefetch-loop-arrays
-fstrength-reduce *-O2
-frerun-cse-after-loop *-O2
⇒下手にPrefetchを行うと、CPUのハードウェアプリフェッチを阻害して遅くなる結果に。