0

我正在开发一个数字运算应用程序,并且我正在尝试尽可能地从中挤出所有可能的性能。我将它设计为适用于 Windows 和 *nix,甚至适用于多 CPU 机器。

我目前设置的方式,它询问操作系统有多少内核,将​​每个内核上的关联设置为运行 CPUID ASM 命令的函数(是的,它会在同一个 CPU 上运行多次;没什么大不了的,它只是初始化代码)并在 CPUID 的 Features 请求中检查超线程。根据对 CPUID 命令的响应,它计算应该运行多少线程。当然,如果一个核心/CPU 支持超线程,它将在一个核心上生成两个。

但是,我用自己的机器遇到了一个分支案例。我运行带有 Core 2 Duo 的 HP 笔记本电脑。不久前,我用支持超线程的更好的 Core 2 Duo 替换了工厂处理器。但是,BIOS 不支持它,因为工厂处理器不支持。因此,即使 CPU 报告它具有超线程,它也无法使用它。

我知道在 Windows 中,您可以通过简单地计算逻辑内核来检测超线程(因为每个启用超线程的物理内核都分为两个逻辑内核)。但是,我不确定 *nix(尤其是 Linux;我的测试平台)中是否有这样的东西。

如果在双核处理器上启用了 HyperTreading,Linux 函数 sysconf(_SC_NPROCESSORS_CONF) 会显示有四个处理器还是只有两个?

如果我可以在两个系统上获得可靠的计数,那么我可以简单地跳过基于 CPUID 的超线程检查(毕竟,它有可能在 BIOS 中被禁用/不可用)并使用操作系统报告的内容,但不幸的是因为我的分支案例我无法确定这一点。

PS:在代码的 Windows 部分中,我正在解析 GetLogicalProcessorInformation() 的返回

加分点:有人知道如何修改 BIOS,这样我就可以真正超线程我的 CPU ;)?主板是带有 AMD M96 芯片组的 HP 578129-001(恶心)。

4

0 回答 0