Я пытаюсь использовать некоторые из неосновных аппаратных счетчиков, например: skx_unc_imc0-5::UNC_M_WPQ_INSERTS
. Предполагается подсчитать количество выделений в очереди на запись. Машина имеет 2 процессора Intel Xeon Gold 5218 с архитектурой каскадного озера, с 2 контроллерами памяти на процессор. linux версия 5.4.0-3-amd64. У меня есть следующее простое l oop, и я читаю этот счетчик для него. Элементы массива имеют размер 64 байта, равный строке кэша.
for(int i=0; i < 1000000; i++){
array[i].value=2;
}
Для этого l oop, когда я сопоставляю память с узлом DRAM NUMA, в результате счетчик выдает около 150 000, что, возможно, составляет смысл: в общей сложности 6 каналов для 2 контроллеров памяти перед этим узлом NUMA, которые используют модули DIMM DRAM в режиме чередования. Тогда для каждого канала есть один отдельный WPQ, я полагаю, поэтому skx_unc_imc0 получает 1/6 от всех магазинов. Есть счетчики skx_unc_imc0-5
, которые я получил с papi_native_avail
, предположительно каждый для разных каналов.
Неожиданный результат заключается в том, что вместо сопоставления с узлом DRAM NUMA я сопоставляю программу с энергонезависимой памятью, которая представляется как отдельный узел NUMA в том же сокете. Для каждого сокета имеется 6 модулей NVM DIMM, которые создают один чередующийся регион. Таким образом, при записи в NVM должно использоваться 6 разных каналов, а перед каждым - один и тот же WPQ, который должен получить 1/6 вставок записи.
Но UNC_M_WPQ_INSERTS
возвращает только около 1000 в результате в памяти NV. Я не понимаю, почему; Я ожидал, что он даст примерно 150 000 записей в WPQ.
Я что-то неправильно понимаю? Или есть два разных WPQ на канал в зависимости от того, идет ли запись в DRAM или NVM? Или что еще может быть объяснение?