0

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 のメモリが搭載されています。

4

1 に答える 1

0

そこにはあまり情報がないように見えます。たとえば、左側のウィンドウには、「Self」とは何ですか、「incl.」とは何ですか?

驚くべきことに、これはkcachegrind FAQの最初のよくある質問です。具体的には、そのリンクから:

... 関数自体のコスト ('Self Cost') と、呼び出されたすべての関数を含むコスト ('Inclusive Cost' [incl.]) を区別することは理にかなっています。

ここでは、コードを表示したり、プログラムが何をするかについてのヒントを示したりしていませんが...

私が見る限り、1コアと16コアの両方で同じ数のデータミスがあります...

作業をプルする一定量のデータがあり、それがキャッシュの外で開始される場合、それをカバーするために同じ数のミスが必要になるのは合理的です。

また、ハードウェアプラットフォームについての手がかりも与えていないため、統合された最終レベルキャッシュを備えた単一のソケットに16コアがあるか、4x4で最終レベルキャッシュミスがそれらのソケット間で分割されているかはわかりません。または何。

しかし、1 つのコアでは実行時間が 0.62 秒であるのに対し、16 コアでは実行時間が 1 秒に近い理由はまだわかりません。

多分それは同期コストです。多分それは valgrind の下で実行されている成果物です。多分それは何か他のものです。おそらく、コードに関する情報がなければ、誰もあなたのコードのプロファイリングを手助けすることはできません。

誰かがkcachegrindで何を探すべきか教えてくれたら...

何を見つけようとしていますか?あなたのコードは何をしていますか?valgrind で実行していない場合、その時間差はまだありますか? 使用しているライブラリ、OS、ハードウェア プラットフォームは?

于 2016-01-26T16:03:01.700 に答える