Время, которое каждое ядро ​​процессора проводит в состоянии питания C0 - PullRequest
9 голосов
/ 18 августа 2010

Любая помощь в выяснении, как это сделать, была бы великолепна: Сколько времени каждое ядро ​​ЦП провело в состоянии питания C0 за последнюю секунду. Это приложение для Mac, поэтому нужны Objective-C, какао и C.

Ответы [ 2 ]

7 голосов
/ 26 августа 2010

OS X не имеет API-интерфейсов, предоставляющих c-состояние ЦП. Однако, похоже, что вы можете сделать это, используя инструкции MWAIT / MONITOR на процессорах Intel. Intel упоминает, что вы можете отслеживать резидентность C-состояний, используя эту технику, в разделе 14.4 справочного руководства:

Программное обеспечение должно использовать CPUID, чтобы определить, поддерживает ли целевой процессор перечисление расширений MWAIT. Если CPUID.05H.ECX [бит 0] = 1, целевой процессор поддерживает расширения MWAIT и их перечисление (см. Главу 3 «Справочник по наборам инструкций, AM», Intel® 64 и Руководство разработчика программного обеспечения по архитектуре IA-32, том 2A ).

Если CPUID.05H.ECX [Бит 1] = 1, целевой процессор поддерживает использование прерываний в качестве событий прерывания для MWAIT, даже если прерывания отключены. Используйте эту функцию для измерения резидентности C-состояний следующим образом :

Программное обеспечение может записывать бит 0 в регистр расширений MWAIT (ECX) при выдаче MWAIT для входа в специфическое для процессора состояние C или подчиненное состояние C. Когда процессор выходит из неактивного C-состояния или подчиненного C-состояния, программное обеспечение может считывать временную метку перед тем, как потенциально выполнить процедуру обработки прерывания (ISR).

Более подробную информацию об инструкции MWAIT вы можете найти в том же руководстве. Удачи!

Справочное руководство Intel

0 голосов
/ 23 апреля 2013

Для получения процента C0 вы должны сделать следующее:

Считать следующие MSR в начальной и конечной точках измеряемого вами периода:

0x3FC (ядро c3), 0x3FD (ядро c6), 0x3FE (core c7), 0x10 (tsc)

Затем выполните следующие вычисления:

Cx_ticks = (c3_after - c3_before) + (c6_after - c6_before) + (c7_after - c7_before)
total_ticks = (tsc_after - tsc_before)
Cx_percentage = Cx_ticks/total_ticks
C0_percentage = 100% - Cx_percentage

Более подробную информацию можно найти в этом документе (перейти к Vol3C 35-95)

...