【问题标题】:Time each CPU core spends in C0 power state每个 CPU 内核在 C0 电源状态下花费的时间
【发布时间】:2010-08-18 13:31:21
【问题描述】:

任何帮助弄清楚如何做到这一点都会很棒:每个 CPU 内核在过去一秒内处于 C0 电源状态的时间。

这是一个 mac 应用程序,所以需要 Objective-C、cocoa 和 c。

【问题讨论】:

    标签: objective-c c cocoa macos cpu


    【解决方案1】:

    OS X 没有任何公开 CPU 的 c 状态的 API。但是,您似乎可以使用英特尔 CPU 上的 MWAIT/MONITOR 指令来执行此操作。英特尔在参考手册的第 14.4 节中提到您可以使用此技术跟踪 C 状态驻留:

    软件应使用 CPUID 来发现目标处理器是否支持枚举 MWAIT 扩展。如果 CPUID.05H.ECX[Bit 0] = 1,则目标处理器支持 MWAIT 扩展及其枚举(参见 Intel® 64 和 IA-32 架构软件开发人员手册第 2A 卷的第 3 章“指令集参考,A-M” )。

    如果 CPUID.05H.ECX[Bit 1] = 1,目标处理器支持使用中断作为 MWAIT 的中断事件,即使中断被禁用。 使用此功能测量 C 状态的驻留率,如下所示

  • 当发出 MWAIT 以进入特定于处理器的 C 状态或子 C 状态时,软件可以写入 MWAIT 扩展寄存器 (ECX) 中的位 0。
  • 当处理器退出非活动 C 状态或子 C 状态时,软件可以在可能执行中断服务例程 (ISR) 之前读取时间戳。
  • 您可以在同一手册中找到有关 MWAIT 指令的更多信息。祝你好运!

    Intel's Reference Manual

    【讨论】:

      【解决方案2】:

      要获得 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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多