kcachegrind を理解しようとしていますが、そこにはあまり情報がないようです。たとえば、左側のウィンドウには、「Self」とは何ですか、「incl.」とは何ですか? ( 1 コアを参照)。
私はいくつかの弱いスケーリング テストを行いましたが、通信がないため、キャッシュ ミスと関係があると思います。しかし、私が見る限り、1 コアと 16 コアの両方で同じ数のデータ ミスがあります。 16 コアを参照してください。
1 コアと 16 コアの間に見られる唯一の違いは、16 コアでは memcpy の呼び出しが大幅に少ないことです (これについては説明できます)。しかし、1 つのコアでは実行時間が 0.62 秒であるのに対し、16 コアでは実行時間が 1 秒に近い理由はまだわかりません。各プロセッサは同じ量の作業を行っています。誰かが kcachegrind で何を探すべきか教えてくれたら、それは素晴らしいことです。kcachegrind と valgrind を使用するのはこれが初めてです。
編集:私のコードは、行列を圧縮された行形式で連結します。サブマトリックスのエントリをループし、memcpy を使用して値を結果マトリックスにコピーする必要があります。コードは次のとおりです: - 2 つ以上のリンクを投稿できないので、コメントに投稿します。
ループ自体で valgrind を開始しただけです。ループは、0.62 秒の実行時間と 1 秒の実行時間の違いを生んでいるものでもあります。最も時間がかかる部分は memcpy の呼び出しです (以下の github gist の 37 行目)。これをコメントアウトすると、コードは 0.2 秒未満で実行されますが、1 コアから 16 コアの間でまだ増加しています (約30%増)。
24 個のコア (2 つの Intel® Xeon® Processor E5-2690 v3) で構成される haswell ノードでコードを実行しています。
各コアには 5 GB のメモリが搭載されています。