我正在研究一个数字运算的应用程序,我正试图从中尽可能地挤出所有可能的性能。我正在设计它适用于Windows和* nix,甚至适用于多CPU机器。
我目前设置它的方式,它询问操作系统有多少核心,将每个核心的亲和力设置为运行CPUID ASM命令的函数(是的,它将在同一个CPU上运行多次;没有大问题,只是初始化代码)并在CPUID的Features请求中检查HyperThreading。从对CPUID命令的响应中,它计算应该运行的线程数。当然,如果核心/ CPU支持超线程,它将在一个核心上产生两个。
但是,我用自己的机器遇到了一个分支机箱。我使用Core 2 Duo运行惠普笔记本电脑。我用一个支持HyperThreading的更好的Core 2 Duo取代了工厂处理器。但是,BIOS不支持它,因为工厂处理器没有。因此,即使CPU报告它具有超线程,它也无法使用它。
我知道在Windows中,您可以通过简单地计算逻辑核心来检测超线程(因为每个物理的支持HyperThreading的核心被分成两个逻辑核心)。但是,我不确定* nix中是否有这样的东西(特别是Linux;我的测试床)。
如果在双核处理器上启用超线程,那么Linux函数sysconf(_SC_NPROCESSORS_CONF)是否会显示有四个处理器或只有两个处理器?
如果我可以在两个系统上获得可靠的计数,那么我可以简单地跳过基于CPUID的超线程检查(毕竟,它可能在BIOS中被禁用/不可用)并使用操作系统报告的内容,但不幸的是因为我的分支案例,我无法确定这一点。
P.S。:在我的代码的Windows部分,我正在解析GetLogicalProcessorInformation()的返回
奖励积分:任何人都知道如何修改BIOS,所以我实际上可以超线程我的CPU;)?主板是带有AMD M96芯片组的HP 578129-001(yuck)。