問題タブ [cachegrind]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Cachegrind出力の解釈
これはcachegrind出力の一部です。コードのこの部分は1224回実行されました。elmg1は、サイズ16 x 20のunsignedlongの配列です。私のマシンのL1キャッシュサイズは32KB、64Bキャッシュラインサイズ、8ウェイセットアソシアティブです。
- for(i = 0; i <20; i ++)78,336 2,448 2 50,184 0 0 1,224 0 0
- {{
- telm01 = elmg1 [i]; 146,880 0 0 73,440 0 0 24,480 0 0
- telm31 =(telm01 << 3)^ val1; 97,920 0 0 48,960 0 0 24,480 0 0
- telm21 =(telm01 << 2)^(val1 >> 1); 146,880 1,224 1 48,960 0 0 24,480 0 0
- telm11 =(telm01 << 1)^(val1 >> 2); 146,880 0 0 48,960 0 0 24,480 0 0
- }
A.ここに記載した理由は、forループ内の3行目に、I1ミスが多数見られるためです(L2ミスも1つ)。やや紛らわしく、理由がわかりませんでしたか?
B.コードの一部を最適化(時間)しようとしています。上記はほんの小さなスニペットです。私のプログラムのメモリアクセスでは、多くの費用がかかると思います。上記の例のように、elmg1は16x20サイズのunsignedlongの配列です。私がコードでそれを使おうとすると、常にいくつかのミスがあり、私のプログラムではこれらの変数が頻繁に発生します。助言がありますか?
C.これらの署名されていないlongを割り当てて(場合によっては初期化する)必要があります。calloc宣言と配列宣言のどちらを優先するかを提案してから、明示的に初期化してください。ちなみに、キャッシュがそれらを処理する方法に違いはありますか?
ありがとう。
c++ - キャッシュミスの代償はいくらですか
私はいくつかのコードを分析し、cachegrindを使用して実行中のキャッシュミス(L2とL3)の数を取得しています。
私の質問は、キャッシュミスに基づいて、キャッシュが準備完了になるのを待つために費やす時間をどのように決定するかです。
「私のコードは90%のCPU使用率を取得します」のようなことを言いたいです
キャッシュグラインド出力に基づいてこれを行うことは可能ですか?
optimization - cachegrind カウントは実際のパフォーマンスを反映していません
同じアルゴリズムの 2 つのバージョンでは、valgrind/cachegrind の下で異なる合計命令フェッチ カウントとサイクル推定値が得られます。その差は約25%。ただし、プロセスのタイミングは非常に似ています (実際には、cachegrind-slow バージョンの方が短くなっています)。
バージョン 1:
/li>バージョン 2:
/li>
この動作は予期されたものですか? バージョン 1 が遅い理由について詳しく知るにはどうすればよいですか?
matrix-multiplication - 2 つの行列を乗算するキャッシュ フレンドリーな方法
キャッシュに適した方法を使用して2つの行列を乗算する予定です(これにより、ミスの数が少なくなります)
これは、キャッシュに適した転置関数で実行できることがわかりました。
しかし、私はこのアルゴリズムを見つけることができません。これを達成する方法を知ることができますか?
valgrind - Valgrind と Linux のパフォーマンスの相関関係
perf
イベントinstructions
、LLC-load-misses
、を選択したとしますLLC-store-misses
。さらに、入力をprog
変化させてプログラムをテストするとします。valgrind
同じ入力と同じカウンターに対して「同じ」機能結果が得られるはずですか? つまり、 の 1 つの値perf
が上昇した場合、 の 1 つvalgrind
は常に同じようにする必要がありますか? valgrind
コードのプロファイリング中に注意すべきシミュレーションであることの影響はありますか?
編集:ところで、人々が私自身を実験していないことで私をグリルする前に、私は(ちょっと)持っていると言わなければなりperf
ません. パッチがありますが、カーネルを再コンパイルする気がしません...
php - Xdebug で cachegrind を構成する際の問題
cachegrind 用に Xdebug を構成しようとしていますが、実行された Web ページをダンプするためにプロファイラー機能を有効にすることができません。
公式ガイド(および同様の設定のいくつか) を使用していますが、機能していないようです。
両方の Linux マシン (Ubuntu と Fedora) で試しました。Xdebug はデバッグ用にvalgrind --tool=cachegrind
正常に動作しており、アプリケーションを開始できるので、両方を適切にインストールする必要があります。
php.ini で profiler_enable および profiler_enable_trigger オプションをアクティブ化および非アクティブ化し、サーバーを再起動していましたが、うまくいきませんでした。パーミッションの関係かと思い、出力ディレクトリを変更。URL でフラグをパラメーターとして使用し?XDEBUG_PROFILER=1
ても、どちらも役に立たないようです。
cachegrind の構成に関連する他の手がかりはありますか?
c - cachegrind と callgrind を使用した異なる読み取り数と書き込み数
私は Cachegrind、Callgrind、Gem5 でいくつかの実験を行っています。アクセス数が、cachegrind の読み取り、callgrind の書き込み、および gem5 による読み取りと書き込みの両方としてカウントされていることに気付きました。
非常に簡単な例を見てみましょう:
私はコンパイルします:
gcc ex.c --static -o ex
基本的に、asmファイルによると、addl $1, -8(%rbp)
100,000回実行されます。読み取りと書き込みの両方であるため、100k の読み取りと 100k の書き込みを期待していました。ただし、cachegrind はそれらを読み取りとしてのみカウントし、callgrind は書き込みのみとしてカウントします。
-
誰かが私に合理的な説明をしてもらえますか? 実際には ~100k の読み取りと ~100k の書き込み (つまり、addl の 2 つのキャッシュ アクセス) があると考えるのは正しいでしょうか?
c++ - 関数宣言行の cachegrind Ir カウントの解釈
まったく同じ方法で使用される、2 つの同様の関数の行ごとのキャッシュ カウントがあります。関数宣言行 (void f(...)) の Ir カウントは非常に異なります。1 つは 999,999,993 で、もう 1 つは 284 だけです。これは何を意味するのでしょうか?
c - 複数の実行間で同じプログラムの異なるキャッシュ ミス カウント
私は Cachegrind を使用して、libc なしでコンパイルされた静的プログラムのキャッシュ ミスの数を取得してい_start
ます (asm でメイン関数と exit syscall を呼び出すだけです)。プログラムは完全に決定論的であり、命令とメモリ参照は実行ごとに変化しません。キャッシュは、置換ポリシーとして LRU と完全に関連付けられています。
ただし、ミスの数が時々変化することに気付きました。より具体的には、別のディレクトリに移動するまで、ミスの数は常に同じです。
同じコマンドを何度も実行すると、同じ結果が得られます。しかし、別のディレクトリからこのプログラムを実行すると:
また、別のディレクトリからの結果も異なります。
また、Pin ツールを使用していくつかの実験を行いましたが、これを使用すると、異なる値を取得するためにディレクトリを変更する必要はありません。しかし、可能な値のセットは非常に限られているようで、Cachegrind とまったく同じです。
私の質問は、そのような違いの原因は何でしょうか?
私の最初のヒントは、私のプログラムがメモリ内で同じように配置されていないことです。その結果、以前の実行で同じ行に格納されたいくつかの変数はもうありません。これは、組み合わせの数が限られていることも説明できます。しかし、キャッシュグラインド(およびピン)は仮想アドレスを使用していたと思いますが、OS(Linux)は常に同じ仮想アドレスを提供していると思います。他のアイデアはありますか?
編集: LLd ミスの読み取りを推測できるように、プログラムは 31 の異なるキャッシュ ラインのみを使用します。また、キャッシュには 8 つのキャッシュ ラインしか含めることができません。したがって、実際の場合でも、キャッシュが 2 回目に既に読み込まれているという考えでは、違いを説明できません (最大で、L1 にとどまることができるのは 8 ラインのみです)。
編集 2: Cachegrind のレポートは、実際のキャッシュ ミス (パフォーマンス カウンターによって与えられる) に基づくものではなく、シミュレーションの結果です。基本的に、ミスの数をカウントするためにキャッシュの動作をシミュレートします。結果は一時的なものに過ぎないため、それはまったく問題なく、キャッシュ プロパティ (サイズ、結合性) を変更できます。
編集 3:私が使用しているハードウェアは、Linux 3.2 x86_64 上の Intel Core i7 です。コンパイル フラグは -static で、一部のプログラムでは -nostdlib (IIRC、私は今家にいません) です。