Подсчет количества выделений в очереди ожидания записи - неожиданный низкий результат в памяти NV

Я пытаюсь использовать некоторые аппаратные счетчики без ядра, например: skx_unc_imc0-5::UNC_M_WPQ_INSERTS. Предполагается, что он подсчитывает количество выделений в очереди ожидания записи. Машина имеет 2 процессора Intel Xeon Gold 5218 с архитектурой каскадного озера, с 2 контроллерами памяти на процессор. версия linux - 5.4.0-3-amd64. У меня есть следующий простой цикл, и я читаю для него этот счетчик. Элементы массива имеют размер 64 байта, равный строке кеша.

for(int i=0; i < 1000000; i++){
        array[i].value=2;
}

Для этого цикла, когда я сопоставляю память с узлом DRAM NUMA, счетчик в результате дает около 150000, что, возможно, имеет смысл: всего 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? Или чем еще может быть объяснение?

1 ответ

Оказывается, что UNC_M_WPQ_INSERTSподсчитывает количество выделений в очереди ожидания записи, только для записи в DRAM. Intel добавила соответствующий аппаратный счетчик для постоянной памяти:UNC_M_PMM_WPQ_INSERTS который подсчитывает запросы на запись, выделенные в очереди ожидания записи PMM для постоянной памяти Intel® Optane™ DC.

Однако такого нативного события нет в papi_native_availчто означает, что его пока нельзя отслеживать с помощью PAPI. В Linux версии 5.4 некоторые счетчики PMM можно найти прямо вperf list uncore Такие как unc_m_pmm_bandwidth.write - Запись постоянной пропускной способности памяти Intel Optane DC (МБ / с), полученная из unc_m_pmm_wpq_inserts, блок: uncore_imc. Это означает, что даже еслиUNC_M_PMM_WPQ_INSERTS не указан прямо в perf list как событие, он должен существовать на машине.

Как описано здесь, EventCode для этого счетчика: 0xE7, поэтому его можно использовать с perf в качестве необработанного дескриптора аппаратного события следующим образом:perf stat -e uncore_imc/event=0xe7/. Однако похоже, что он не поддерживает модификаторы событий для указания подсчета пространства пользователя с помощью perf. Затем, после закрепления потока в том же сокете, что и узел NVM NUMA, для программы, которая в основном выполняет только цикл, описанный в вопросе, результатperf вроде имеет смысл:

Performance counter stats for 'system wide':  1,035,380    uncore_imc/event=0xe7/

Пока это кажется лучшим предположением.

Другие вопросы по тегам