Ответ 1
Я получил ответы от некоторых форумов Intel, ссылка ниже.
https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/673602
Я планирую измерить счетчики PMU для L1, L2, L3 пропусков пропусков ветвления, я прочитал связанные документы Intel, но я не уверен в нижеприведенных сценариях. Может кто-то прояснит?
//assume PMU reset and PERFEVTSELx configurtion done above
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_start) //PMU start counters
my_program();
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_stop) ///PMU stop
//now reading PMU counters
1. что произойдет, если мой процесс запланирован, когда my_program() запущен и запланирован на другое ядро?
2. что произойдет, если процесс закроется и снова вернется к тому же самому ядру, между тем какой-нибудь другой процесс reset счетчики PMU?
Как убедиться, что мы читаем правильные значения из счетчиков PMU.?
Сведения о машине: CentOS с ядром Linux 3.10.0-327.22.2.el7.x86_64, который оснащен процессором Intel (R) Core (TM) i7-3770 @3,40 ГГц
Спасибо
Я получил ответы от некоторых форумов Intel, ссылка ниже.
https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/673602
Резюме поток форума Intel, запущенный OP:
Подсистема Linux perf
виртуализирует счетчики производительности, но это означает, что вы должны читать их с системным вызовом вместо rdpmc
, чтобы получить полное виртуализованное 64-битное значение вместо того, что в настоящее время в регистре счетчика архитектурной производительности.
Если вы хотите использовать rdpmc
внутри своего собственного кода, чтобы он мог себя измерить, привяжите каждый поток к ядру, потому что переключатели контекста не сохраняют/не восстанавливают PMC. Нет простого способа избежать измерения всего, что происходит на ядре, в том числе обработчиков прерываний и других процессов, которые получают временный лимит. Это может быть хорошо, так как вам нужно учитывать влияние явных накладных расходов.
Более полезные цитаты от Джона Д. МакКальпина, PhD ( "Пропускная способность д-ра" ):
Для встроенного инструментария кода вы должны иметь возможность использовать API-интерфейсы "perf events", но документация минимальна. Некоторые ресурсы доступны по адресу http://web.eece.maine.edu/~vweaver/projects/perf_events/faq.html
Вы можете использовать "pread()" в файлах устройств /dev/cpu/ */msr для чтения MSR - это может быть немного легче читать, чем код на основе IOCTL. коды "rdmsr.c" и "wrmsr.c" из "msr-tools-1.3" обеспечивают отличные примеры.
Существует несколько подходов к резервированию и совместному использованию счетчики производительности, включая как программные, так и комбинированные аппаратные и программные подходы, но на данный момент нет "стандартный" подход. (Похоже, что у Intel есть аппаратные средства подход с использованием MSR 0x392 IA32_PERF_GLOBAL_INUSE, но я не знаю, что платформы поддерживают его.)
ваши вопросы
что произойдет, если мой процесс будет запланирован, когда my_program() будет запущен и запланирован на другое ядро?
Вы увидите случайный мусор, если другой процесс сбрасывает PMC между временными рядами вашего процесса.