任何帮助确定如何做到这一点都会很棒:过去几秒内每个CPU内核在C0电源状态下花费了多少时间。
这适用于mac应用程序,因此需要Objective-C,cocoa和c。
答案 0 :(得分:7)
OS X没有任何公开CPU的c状态的API。但是,您似乎可以使用intel CPU上的MWAIT / MONITOR指令执行此操作。英特尔提到您可以在参考手册的第14.4节中使用此技术跟踪C状态驻留:
软件应使用CPUID来发现目标处理器是否支持MWAIT扩展的枚举。如果CPUID.05H.ECX [Bit 0] = 1,则目标处理器支持MWAIT扩展及其枚举(请参阅“英特尔®64和IA-32架构软件开发人员手册”第2卷第3章“指令集参考,AM”) )。
如果CPUID.05H.ECX [位1] = 1,则目标处理器支持将中断用作MWAIT的中断事件,即使禁用了中断也是如此。 使用此功能测量C状态驻留,如下所示:
当发出MWAIT进入处理器特定的C状态或子C状态时,软件可以写入MWAIT扩展寄存器(ECX)中的第0位。 当处理器退出非活动C状态或子C状态时,软件可以在可能执行中断服务例程(ISR)之前读取时间戳。
您可以在同一本手册中找到有关MWAIT指令的更多信息。祝你好运!
答案 1 :(得分:0)
要获得C0百分比,您应该执行以下操作:
在您测量的时段的起点和终点读取以下MSR:
0x3FC(核心c3),0x3FD(核心c6),0x3FE(核心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
您可以在此document中找到更多信息(请参阅第3C卷35-95页)