Help us understand the problem. What is going on with this article?

【cpuminer】最適化メモ

More than 1 year has passed since last update.

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

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

Libitina
C,C++,C#,Java,PHPで組み込みからサーバ向けまで開発するプログラマー。 最近はAWSを使ってシステム開発一人を実行中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away