GEMM コードをチューニングして、Eigen および MKL と比較しています。4 つの物理コアを持つシステムがあります。これまで、OpenMP のデフォルトのスレッド数 (私のシステムでは 8 つ) を使用してきました。これは少なくとも 4 つのスレッドと同じくらい良いと思いました。しかし、今日、Eigen と独自の GEMM コードを大規模な密行列 (1000x1000) で実行すると、8 スレッドではなく 4 スレッドを使用した方がパフォーマンスが向上することがわかりました。効率は 45% から 65% に跳ね上がりました。これはこのプロットにも見られると思います https://plafrim.bordeaux.inria.fr/doku.php?id=people:guenneba
違いはかなり大きいです。ただし、パフォーマンスははるかに不安定です。Eigen と私自身の GEMM コードの両方で、反復ごとにパフォーマンスが少し跳ね上がります。ハイパースレッディングによってパフォーマンスが大幅に低下することに驚いています。これは質問ではないと思います。これは予想外の観察であり、フィードバックを期待しています。
ハイパースレッディングを使用しないこともここで提案されていることがわかります。
Eigen ライブラリの行列積を高速化するには?
最大パフォーマンスの測定に関して質問があります。私が今行っていることは、CPUz を実行し、GEMM コードを実行しているときに周波数を確認し、その数値をコードで使用することです (私が使用しているオーバークロック システムでは 4.3 GHz)。すべてのスレッドでこの番号を信頼できますか? 最大値を決定するためにスレッドごとの頻度を知るにはどうすればよいですか? ターボブーストを適切に説明するにはどうすればよいですか?