【发布时间】:2010-08-18 13:31:21
【问题描述】:
任何帮助弄清楚如何做到这一点都会很棒:每个 CPU 内核在过去一秒内处于 C0 电源状态的时间。
这是一个 mac 应用程序,所以需要 Objective-C、cocoa 和 c。
【问题讨论】:
标签: objective-c c cocoa macos cpu
任何帮助弄清楚如何做到这一点都会很棒:每个 CPU 内核在过去一秒内处于 C0 电源状态的时间。
这是一个 mac 应用程序,所以需要 Objective-C、cocoa 和 c。
【问题讨论】:
标签: objective-c c cocoa macos cpu
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 指令的更多信息。祝你好运!
【讨论】:
要获得 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)
【讨论】: