Почему кеш L3 игнорируется cachegrind, что противоречит документации?

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

Valgrind, являющийся симулятором процессора, предполагает использование двухуровневого кэша, как упоминалось здесь, при использовании cachegrind.

Cachegrind моделирует, как ваша программа взаимодействует с иерархией кэша компьютера и (необязательно) предиктором ветвления. Он моделирует машину с независимыми кэшами команд и данных первого уровня (I1 и D1), подкрепленными унифицированным кешем второго уровня (L2). Это точно соответствует конфигурации многих современных машин.

Следующий абзац продолжается как

Однако некоторые современные машины имеют три или четыре уровня кэша. Для этих машин (в случаях, когда Cachegrind может автоматически определять конфигурацию кэша), Cachegrind моделирует кэши первого и последнего уровня. Причиной этого выбора является то, что кэш последнего уровня оказывает наибольшее влияние на время выполнения, поскольку он маскирует доступ к основной памяти.

Однако когда я попытался запустить valgrind на моем простом коде умножения матрицы на матрицу, я получил следующий результат.

==6556== Cachegrind, a cache and branch-prediction profiler
==6556== Copyright (C) 2002-2010, and GNU GPL'd, by Nicholas Nethercote et al.
==6556== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==6556== Command: ./a.out
==6556== 
--6556-- warning: L3 cache detected but ignored
==6556== 
==6556== I   refs:      50,986,869
==6556== I1  misses:         1,146
==6556== L2i misses:         1,137
==6556== I1  miss rate:       0.00%
==6556== L2i miss rate:       0.00%
==6556== 
==6556== D   refs:      20,232,408  (18,893,241 rd   + 1,339,167 wr)
==6556== D1  misses:       150,194  (   144,869 rd   +     5,325 wr)
==6556== L2d misses:        10,451  (     5,506 rd   +     4,945 wr)
==6556== D1  miss rate:        0.7% (       0.7%     +       0.3%  )
==6556== L2d miss rate:        0.0% (       0.0%     +       0.3%  )
==6556== 
==6556== L2 refs:          151,340  (   146,015 rd   +     5,325 wr)
==6556== L2 misses:         11,588  (     6,643 rd   +     4,945 wr)
==6556== L2 miss rate:         0.0% (       0.0%     +       0.3%  )

Согласно документации, кэши L1 и L3 должны были использоваться, но в выводе говорится, что кэш L3 игнорируется. Это почему?

Кроме того, cachegrind предполагает наличие размеров кэша L1 и последнего уровня или использует размеры кэша L1 и последнего уровня процессора, на котором он в данный момент работает?

1 ответ

Решение

Вы работаете на процессоре Intel, для которого cachegrind не имеет полной поддержки. Они проверяют флаги cpuid и определяют поддержку, основываясь на огромном наборе операторов case для разных процессоров.

Это из неофициальной копии кода, но для иллюстрации - https://github.com/koriakin/valgrind/blob/master/cachegrind/cg-x86-amd64.c:

/* Intel method is truly wretched.  We have to do an insane indexing into an
 * array of pre-defined configurations for various parts of the memory
 * hierarchy.
 * According to Intel Processor Identification, App Note 485.
 */
static
Int Intel_cache_info(Int level, cache_t* I1c, cache_t* D1c, cache_t* L2c)
{
...
      case 0x22: case 0x23: case 0x25: case 0x29:
      case 0x46: case 0x47: case 0x4a: case 0x4b: case 0x4c: case 0x4d:
      case 0xe2: case 0xe3: case 0xe4: case 0xea: case 0xeb: case 0xec:
          VG_(dmsg)("warning: L3 cache detected but ignored\n");
          break;
Другие вопросы по тегам