2013-04-03 14 views
14

私は、Cachegrind、Callgrind、およびGem5でいくつかの実験を行っています。私は、callgrindの書き込みとgem5の読み書きの両方のために、多数のアクセスがcachegrindの読み込みとしてカウントされていることに気付きました。cachegrindとcallgrindを使用した読み込みと書き込みの回数が異なる

はのは非常に簡単な例を見てみましょう:

int main() { 
    int i, l; 

    for (i = 0; i < 1000; i++) { 
     l++; 
     l++; 
     l++; 
     l++; 
     l++; 
     l++; 
     l++; 
     l++; 
     l++; 
     l++; 
     ... (100 times) 
    } 
} 

私が使用してコンパイル:

gccのex.c --static -o元

だから、基本的には、に従ってasmファイル、addl $1, -8(%rbp)が100,000回実行されます。それは読書と書いているので、私は100k読書と100k書込みを期待していました。しかし、cachegrindはそれらを読み込みだけカウントし、callgrindは書き込みとしてのみカウントします。

% valgrind --tool=cachegrind --I1=512,8,64 --D1=512,8,64 
--L2=16384,8,64 ./ex 
==15356== Cachegrind, a cache and branch-prediction profiler 
==15356== Copyright (C) 2002-2012, and GNU GPL'd, by Nicholas Nethercote et al. 
==15356== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info 
==15356== Command: ./ex 
==15356== 
--15356-- warning: L3 cache found, using its data for the LL simulation. 
==15356== 
==15356== I refs:  111,535 
==15356== I1 misses:  475 
==15356== LLi misses:  280 
==15356== I1 miss rate: 0.42% 
==15356== LLi miss rate: 0.25% 
==15356== 
==15356== D refs:  104,894 (103,791 rd + 1,103 wr) 
==15356== D1 misses:  557 ( 414 rd + 143 wr) 
==15356== LLd misses:  172 ( 89 rd + 83 wr) 
==15356== D1 miss rate:  0.5% ( 0.3%  + 12.9% ) 
==15356== LLd miss rate:  0.1% ( 0.0%  + 7.5% ) 
==15356== 
==15356== LL refs:   1,032 ( 889 rd + 143 wr) 
==15356== LL misses:   452 ( 369 rd + 83 wr) 
==15356== LL miss rate:  0.2% ( 0.1%  + 7.5% ) 

-

% valgrind --tool=callgrind --I1=512,8,64 --D1=512,8,64 
--L2=16384,8,64 ./ex 
==15376== Callgrind, a call-graph generating cache profiler 
==15376== Copyright (C) 2002-2012, and GNU GPL'd, by Josef Weidendorfer et al. 
==15376== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info 
==15376== Command: ./ex 
==15376== 
--15376-- warning: L3 cache found, using its data for the LL simulation. 
==15376== For interactive control, run 'callgrind_control -h'. 
==15376== 
==15376== Events : Ir Dr Dw I1mr D1mr D1mw ILmr DLmr DLmw 
==15376== Collected : 111532 2777 102117 474 406 151 279 87 85 
==15376== 
==15376== I refs:  111,532 
==15376== I1 misses:  474 
==15376== LLi misses:  279 
==15376== I1 miss rate: 0.42% 
==15376== LLi miss rate: 0.25% 
==15376== 
==15376== D refs:  104,894 (2,777 rd + 102,117 wr) 
==15376== D1 misses:  557 ( 406 rd +  151 wr) 
==15376== LLd misses:  172 ( 87 rd +  85 wr) 
==15376== D1 miss rate:  0.5% (14.6% +  0.1% ) 
==15376== LLd miss rate:  0.1% ( 3.1% +  0.0% ) 
==15376== 
==15376== LL refs:   1,031 ( 880 rd +  151 wr) 
==15376== LL misses:   451 ( 366 rd +  85 wr) 
==15376== LL miss rate:  0.2% ( 0.3% +  0.0% ) 

誰かが私に合理的な説明を与えてもらえますか?実際に〜100kの読み取りと〜100kの書き込み(つまり、addlのための2つのキャッシュアクセス)があると考えるのは正しいでしょうか?

答えて

-1

callgrindは、デフォルトでフルキャッシュシミュレーションを実行しません。ここをクリックしてください:http://valgrind.org/docs/manual/cl-manual.html#cl-manual.options.cachesimulation

データ読み取りアクセスを有効にするには、callgrindに--cache-sim = yesを追加する必要があります。 このコードでcallgrindを使用する理由は? 1つの関数呼び出しは、 だけの読み取りを行うとしてカウントされているメモリ位置を変更

+1

cache-sim = yesを追加しても何も変更されません。キャッシュサイズを指定すると、自動的にキャッシュシミュレーションがアクティブになります。 –

3

From cachegrind manual: 5.7.1. Cache Simulation Specifics

  • 命令(INCとDEC)(callgrindが何のためにあるのかである)ありませんすなわち単一のデータ参照である。これは が奇妙に思えるかもしれませんが、書き込みが決してミスを引き起こすことはありません(読んで ブロックがキャッシュにあることを保証します)。

    したがって、データキャッシュがアクセスされた回数ではなく、 であるが、データキャッシュミスが発生する可能性のある回数を測定します。

callgrindのキャッシュ・シミュレーション・ロジックはcachegrindと異なっていることと思われます。私はcallgrindがcachegrindと同じ結果を生成するはずだと思いますので、これはバグでしょうか?

+0

それはまさに私の考えです。おそらくバグですが、それは驚くべきことです。彼らはキャッシュシミュレーションを2回書いたのですか? –

+1

私は、キャッシュシミュレーションの少なくとも一部を2回実装したようです。私はネイティブ - > VEX IR変換と計測ロジックを完全に理解していません。 – Neopallium

関連する問題