Подсчет количества выделений в очереди ожидания записи - неожиданный низкий результат в памяти 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/
Пока это кажется лучшим предположением.