每个CPU核心在C0电源状态下花费的时间

时间:2010-08-18 13:31:21

标签: objective-c c cocoa macos cpu

任何帮助确定如何做到这一点都会很棒:过去几秒内每个CPU内核在C0电源状态下花费了多少时间。

这适用于mac应用程序,因此需要Objective-C,cocoa和c。

2 个答案:

答案 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指令的更多信息。祝你好运!

    Intel's Reference Manual

    答案 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页)