LoginSignup
0
0

More than 5 years have passed since last update.

【cpuminer】最適化メモ

Posted at

内容的には古いが、下書きのまま放置するのもアレなので公開

ビルド環境的にはあとは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のハードウェアプリフェッチを阻害して遅くなる結果に。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0