gpt4 book ai didi

c - 如何以编程方式使用 C 查找 CPU 频率

转载 作者:太空狗 更新时间:2023-10-29 16:46:01 25 4
gpt4 key购买 nike

我正在尝试找出是否可以了解运行我的 C 代码的系统的 CPU 频率。

澄清一下,我正在寻找一个抽象的解决方案(一个不会绑定(bind)到特定架构或操作系统的解决方案),它可以让我了解我的代码在其上执行的计算机的运行频率。我不需要准确,但我想在球场上(即我有一个 2.2GHz 处理器,我希望能够在我的程序中告诉我我在几百的兆赫)

有人知道使用标准 C 代码吗?

最佳答案

为了完整起见,已经有一个简单、快速、准确的用户模式解决方案,但有一个巨大的缺点:它只能在 Intel Skylake、Kabylake 和更新的处理器上运行。确切的要求是 CPUID 级别 16h 支持。根据英特尔软件开发人员手册 325462 第 59 版,第 770 页:

  • CPUID.16h.EAX = 处理器基频(以 MHz 为单位);

  • CPUID.16h.EBX = 最大频率(以 MHz 为单位);

  • CPUID.16h.ECX = 总线(引用)频率(以 MHz 为单位)。

Visual Studio 2015 示例代码:

#include <stdio.h>
#include <intrin.h>

int main(void) {
int cpuInfo[4] = { 0, 0, 0, 0 };
__cpuid(cpuInfo, 0);
if (cpuInfo[0] >= 0x16) {
__cpuid(cpuInfo, 0x16);

//Example 1
//Intel Core i7-6700K Skylake-H/S Family 6 model 94 (506E3)
//cpuInfo[0] = 0x00000FA0; //= 4000 MHz
//cpuInfo[1] = 0x00001068; //= 4200 MHz
//cpuInfo[2] = 0x00000064; //= 100 MHz

//Example 2
//Intel Core m3-6Y30 Skylake-U/Y Family 6 model 78 (406E3)
//cpuInfo[0] = 0x000005DC; //= 1500 MHz
//cpuInfo[1] = 0x00000898; //= 2200 MHz
//cpuInfo[2] = 0x00000064; //= 100 MHz

//Example 3
//Intel Core i5-7200 Kabylake-U/Y Family 6 model 142 (806E9)
//cpuInfo[0] = 0x00000A8C; //= 2700 MHz
//cpuInfo[1] = 0x00000C1C; //= 3100 MHz
//cpuInfo[2] = 0x00000064; //= 100 MHz

printf("EAX: 0x%08x EBX: 0x%08x ECX: %08x\r\n", cpuInfo[0], cpuInfo[1], cpuInfo[2]);
printf("Processor Base Frequency: %04d MHz\r\n", cpuInfo[0]);
printf("Maximum Frequency: %04d MHz\r\n", cpuInfo[1]);
printf("Bus (Reference) Frequency: %04d MHz\r\n", cpuInfo[2]);
} else {
printf("CPUID level 16h unsupported\r\n");
}
return 0;
}

关于c - 如何以编程方式使用 C 查找 CPU 频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11706563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com