2016-08-09 6 views
0

Я планирую измерить счетчики PMU для пропусков пропусков ветвей L1, L2, L3, я прочитал соответствующие документы Intel, но я не уверен в нижеприведенных сценариях. Может кто-нибудь прояснить?PMU для многопоточной среды

//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.что будет происходить, если процесс запланирован и запланирован обратно к тому же самому ядру, между тем какой-то другой процесс сбросит счетчики PMU?

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

детали машины: CentOS Linux с ядром 3.10.0-327.22.2.el7.x86_64, который питается с Intel (R) сердцевиной (TM) i7-3770 CPU @ 3.40GHz

Спасибо

+0

Вы * понимаете, что 'perf' может читать счетчики производительности оборудования для вас? – EOF

+0

Да, я читаю перформационные документы. Это не очень полезно для моего приложения, оно имеет множество ограничений/linux-зависимостей, которые нам не нужны. –

ответ

0

У меня есть ответы на некоторых форумах Intel, ссылка ниже.

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

+0

Я отправил правильный ответ с некоторыми цитатами из этой темы. Спасибо, что связали нить, где есть ответы, но стандарты SO требуют, по крайней мере, резюме ссылок, потому что ссылки только для ссылок становятся бесполезными, когда связь ломается. –

1

Резюме the Intel forum thread начато ОП:

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

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


Более полезные цитаты из Джона Д. McCalpin, кандидат технических наук ("Доктор Bandwidth"):

Для встроенного кода приборов вы должны быть в состоянии использовать "перфорация события" API , но документация минимальна. Некоторые ресурсы доступны на http://web.eece.maine.edu/~vweaver/projects/perf_events/faq.html

Вы можете использовать «pread()» на файлы/DEV/CPU/*/MSR устройств для чтения MSRS - это может быть немного легче читать, чем IOCTL на основе кода , Коды «rdmsr.c» и «wrmsr.c» из «msr-tools-1.3» обеспечивают отличные примеры .

Там было несколько подходов к бронированию и обмена счетчиков производительности, в то числе как программное обеспечение только и комбинированные аппаратных + программные подходов, но на данный момент не существует " стандартного "подхода. (Похоже, что Intel имеет на базе аппаратного обеспечения подхода с использованием MSR 0x392 IA32_PERF_GLOBAL_INUSE, но я не знаю, что поддерживает его платформы.)


ваши вопросы

, что произойдет, если мой процесс запланирован, когда my_program() запущен и запланирован на другое ядро?

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

+0

да. Чтобы этого избежать, мы можем использовать сходство потоков, но все же это также не даст точных выходов/подсчетов, даже в некоторых случаях эти значения также нежелательны. Что касается, я понимаю, что мы не можем получить точные значения счетчика PMU с многопотоковой средой без надлежащей меры предосторожности и/или глубокие знания планировщика ОС. –