Чтение аппаратных счетчиков из списка perf_event_uncore с помощью PAPI

Я пытаюсь прочитать один из счетчиков оборудования с помощью PAPI. Когда я пытаюсь прочитать события из списка perf_event, все работает нормально. Однако теперь мне нужно прочитать один из счетчиков из списка perf_event_uncore, который получается с помощью papi_native_avail, но я получаю сообщение об ошибке. Он работает на архитектуре каскадного озера с версией Linux 5.4.0-3-amd64.

int err = PAPI_event_name_to_code("skx_unc_imc0::UNC_M_WPQ_CYCLES_FULL",&native);
if (err != PAPI_OK)
    printf("PAPI_event_name_to_code error: %d\n", err);

err = PAPI_add_event(EventSet, native);

if (err!= PAPI_OK)
      printf("PAPI_add_event error: %d\n", err);

Несмотря на то, что PAPI_event_name_to_code возвращает PAPI_OK, PAPI_add_event возвращает -1, что является PAPI_EINVAL - недопустимым аргументом. Я попробовал несколько счетчиков формы perf_event_uncore, и у меня возникла та же проблема. Нужно ли использовать другую функцию, чтобы добавить это даже в набор событий? или есть что-то еще, что я делаю неправильно?


person Ana Khorguani    schedule 20.03.2020    source источник


Ответы (1)


Я нашел кое-что, что кажется решением. После добавления спецификации cpu=0 следующим образом: PAPI_event_name_to_code("skx_unc_imc0::UNC_M_WPQ_CYCLES_FULL:cpu=0",&native) больше нет ошибок при вызове функции PAPI_add_event.

Также следует отметить, что я проверил, и этот конкретный аппаратный счетчик не может учитываться вместе с другими, поэтому он должен быть единственным событием в наборе событий.

person Ana Khorguani    schedule 22.03.2020
comment
События Uncode являются глобальными и не могут использоваться как отдельные потоки (трудно перепланировать их правильно). Похоже, что cpu=0 переключает запрос со счетчика потока на глобальный (на сокет); в системах NUMA для каждого чипа (сокета, узла NUMA) устанавливается отдельный счетчик uncore. Спасибо, что поделились своим решением. - person osgx; 31.03.2020
comment
@osgx привет, большое спасибо за объяснение. Я не думал об этом, если честно, но это имеет смысл :) да, даже для этого skx_unc_imc0-5 есть 6 счетчиков. И у каждого сокета есть 6 каналов для модулей DIMM, поэтому я считаю, что каждый счетчик предназначен для другого канала. - person Ana Khorguani; 31.03.2020
comment
Имеется документация intel.com/content/dam/www/public/us/en/documents/manuals/, Uncore PMU Counter Summary перечисляет блоки и их счетчики, а также максимальное количество экземпляров ( от 1 до 4 C-box - CBo). IMC является глобальным для чипа и имеет 5 фиксированных 32-битных регистров счетчиков: пять фиксированных счетчиков для конкретных моделей, которые позволяют отслеживать количество запросов к DRAM. (3.3) Этот набор счетчиков работает автономно и работает всегда. Программное обеспечение может прочитать значение, дождаться нужного внутреннего значения, снова прочитать, а затем вычесть... - person osgx; 31.03.2020