Интерпретация выходных данных Valgrind - PullRequest
1 голос
/ 26 октября 2010

Позвольте arr быть массивом измерения 16 x 20
Вот вывод valgrind для упомянутого фрагмента кода.Выходные данные получены из cachegrind.

for (i = 0; i < 20; i++)
    arr[0][i] = 0;


Ir I1mr   I2mr    Dr  D1mr   D2mr    Dw   D1mw    D2mw  

64      0      0       41     0      0     1      0       0          
60      0      0       20     0      0    20      2       2                

Я прочитал, что означают эти отдельные параметры, из документации valgrind.Но я не могу подсчитать тех, у кого выше цифры.Как и для цикла for, у нас действительно есть 41 чтение данных из кэша?или для массива arr, как мы можем иметь 2 пропуска записи L2?

Моя конфигурация: L1d = L1I = 32 КБ, L2 = 2 МБ, размер строки кэша 64 байта и ассоциативность 8-полосного набора.

Ответы [ 3 ]

0 голосов
/ 26 октября 2010

Я думаю, что данные, упомянутые в приведенном выше тексте, могут быть ошибочными, так как они были извлечены из большого кода, поэтому были также эффекты от других переменных.

0 голосов
/ 27 октября 2010

Как говорит Эрик Олсон, 41 чтение в строке for все для i - 21 в тесте i < 20 и 20 в i++ (если вы компилируете с оптимизацией, это должно уменьшиться) .

Есть два промаха L2, потому что ваши 20 целых чисел занимают 80 байтов, что (в лучшем случае) две строки кэша. В зависимости от выравнивания массива он может охватывать 3 строки кэша, что приведет к трем ошибкам записи.

0 голосов
/ 26 октября 2010

Большинство ваших чтений данных происходит из переменной цикла i.

21 из условного i <20 <br>20 чтений из i ++.
20 чтений из i в lvalue arr [0][i].

Я не в курсе того, как работает кэш, но, учитывая 32-битный массив int, ваши записи занимают 10 строк кэша.Неожиданное предположение: последние две строки - ваши пропуски при записи, так как это как-то не предсказывает вашу следующую запись.

Если вы развернете цикл, вы увидите, что счетчики свернуты в маленькие числа.

arr[0][0]=0; 
arr[0][1]=0;
..    
...