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 () запущен и запланирован на другое kernel?

2. что произойдет, если процесс запланирован и снова вернется к тому же самому ядру, между тем какой-то другой процесс сбросит счетчики PMU?

Как убедиться, что мы читаем правильные значения из счетчиков PMU.?

Сведения о машине: CentOS с kernelм Linux 3.10.0-327.22.2.el7.x86_64, который подключен к процессору Intel (R) Core (TM) i7-3770 @ 3,40 ГГц

Спасибо

Резюме темы форума Intel, начатой ​​OP:

  • perf подсистема Linux виртуализирует счетчики производительности, но это означает, что вы должны прочитать их с системным вызовом вместо rdpmc , чтобы получить полное виртуализированное 64-битное значение, а не то, что в настоящее время находится в регистре счетчика архитектурной производительности.

  • Если вы хотите использовать rdpmc внутри своего собственного кода, чтобы он мог измерить себя, привяжите каждый stream к ядру, потому что переключатели контекста не сохраняют / не восстанавливают PMC. Нет простого способа избежать измерения всего, что происходит на ядре, включая обработчики прерываний и другие процессы, которые получают тайм-лист. Это может быть хорошо, так как вам нужно учитывать влияние накладных расходов на kernel.


Более полезные цитаты от Джона Д. Маккальпина, PhD («Dr. Bandwidth»):

Для инструментария встроенного кода вы должны иметь возможность использовать 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 () и запланирован на другое kernel?

Вы увидите случайный мусор, если другой процесс сбрасывает PMC между временными рядами вашего процесса.

Я получил ответы от некоторых форумов Intel, ссылка ниже.

https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/673602