C/C++/Assembly 以编程方式检测超线程在 Windows、Mac 和 Linux 上是不是处于活动状态 [重复]

Posted

技术标签:

【中文标题】C/C++/Assembly 以编程方式检测超线程在 Windows、Mac 和 Linux 上是不是处于活动状态 [重复]【英文标题】:C/C++/Assembly Programatically detect if hyper-threading is active on Windows, Mac and Linux [duplicate]C/C++/Assembly 以编程方式检测超线程在 Windows、Mac 和 Linux 上是否处于活动状态 [重复] 【发布时间】:2010-05-25 11:55:26 【问题描述】:

我已经可以在所有这三个平台上正确检测逻辑处理器的数量。

为了能够正确检测物理处理器/内核的数量,我必须检测是否支持和激活超线程(或者如果您愿意,可以启用),如果是,则将逻辑处理器的数量除以 2 以确定数量物理处理器。

也许我应该举个例子:

启用超线程的四核 Intel CPU 具有 4 个物理内核和 8 个逻辑处理器(超线程创建了 4 个逻辑处理器)。所以我当前的函数会检测到 8 而不是所需的 4。

因此,我的问题是,是否有办法检测是否支持和启用超线程?

【问题讨论】:

【参考方案1】:

在 Windows 2003 Server 和 Windows XP SP3 及更高版本上,您可以使用GetLogicalProcessorInformation 系统调用来确定此信息。

【讨论】:

这是否适用于 Windows 7 或 Windows Server 2008 RC2?或者我应该使用 GetLogicalProcessorInformation 吗? msdn 页面提到 SYSTEM_LOGICAL_PROCESSOR_INFORMATION::ProcessorCore.Flags 字段“如果此成员的值为 1,则由 ProcessorMask 成员的值标识的逻辑处理器共享功能单元,如在超线程或SMT。否则,识别的逻辑处理器不共享功能单元。但它也说Windows Vista之前的值是错误的,然后只表示逻辑处理器在同一个物理包中。还有更多问题:实际上并没有指定调用将以一种有用的方式对逻辑处理器进行分组。【参考方案2】:

CPUID 指令(当您在 EAX 中传递函数 1H 时)在 EDX 寄存器的第 28 位返回超线程功能标志。我认为多核处理器报告说它们启用了超线程,即使每个单独的内核只能运行一个线程。

它还在 EBX 的 23-16 位中返回每个物理处理器的逻辑处理器数。我认为您必须单独查询每个处理器才能访问系统上的所有处理器。

【讨论】:

【参考方案3】:

Linux:

物理 CPU 数量:

grep -i "physical id" /proc/cpuinfo | sort -u | wc -l

逻辑 CPU 数量:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l

【讨论】:

猜猜我必须在我的程序中使用 boost 库中的 grep.cpp 才能使用它。如主题和标签中所述,我的问题特定于 c/c++/assemler【参考方案4】:

在 OS X 上:

#include <sys/sysctl.h>

int physicalCores;
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0);

有关详细信息,请参阅标题或手册页。 (请注意,您可以使用“hw.logicalcpu”字符串以相同的方式获取逻辑cpu的数量)

【讨论】:

以上是关于C/C++/Assembly 以编程方式检测超线程在 Windows、Mac 和 Linux 上是不是处于活动状态 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式查找机器上的内核数

GCC/GProf - 以编程方式访问线程的当前函数/堆栈跟踪

如何在 C/C++ 中以编程方式查找“保存的游戏”文件夹?

PDF - 使用 Ghostscript 以编程方式删除超链接

C/C++编程知识:网络编程之 Https 详细分析,超详细知识点!

如何在核心数据中以编程方式创建超类/子类?