PMU для многопоточной среды

Я планирую измерить счетчики 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 ГГц

Спасибо

Ответ 2

Резюме поток форума 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 между временными рядами вашего процесса.