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

发布于 2024-09-03 01:22:14 字数 278 浏览 9 评论 0原文

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

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

也许我应该提供一个例子:

启用超线程的四核 Intel CPU 有 4 个物理核心,但有 8 个逻辑处理器(超线程创建了 4 个以上的逻辑处理器)。因此,我当前的函数将检测到 8,而不是所需的 4。

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

I can already correctly detect the number of logical processors correctly on all three of these platforms.

To be able to detect the number of physical processors/cores correctly I'll have to detect if hyperthreading is supported AND active (or enabled if you prefer) and if so divide the number of logical processors by 2 to determine the number of physical processors.

Perphaps I should provide an example:

A quad core Intel CPU's with hyperthreading enabled has 4 physical cores, yet 8 logical processors (hyperthreading creates 4 more logical processors). So my current function would detect 8 instead of the desired 4.

My question therefore is if there is a way to detect whether hyperthreading is supported AND ENABLED?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

煮茶煮酒煮时光 2024-09-10 01:22:14

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

On Windows 2003 Server and Windows XP SP3 and later, you can determine this information using the GetLogicalProcessorInformation system call.

清音悠歌 2024-09-10 01:22:14

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

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

The CPUID instruction (when you pass function 1H in EAX) returns they hyper threading feature flag in bit 28 of the EDX register. I think that multi-core processors report that they are hyperthreading enabled even though each individual core can run only one thread.

It also returns the number of logical processors per physical processor in bits 23-16 of EBX. I think that you'd have to query each processor individually in order to hit all of the processors on your system.

狼性发作 2024-09-10 01:22:14

在 OS X 上:

#include <sys/sysctl.h>

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

请参阅标题或联机帮助页以获取更多信息。 (请注意,您可以使用“hw.logiccpu”字符串以相同的方式获取逻辑 cpu 的数量)

On OS X:

#include <sys/sysctl.h>

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

See the header or manpage for more information. (Note that you can get the number of logical cpus in the same way, using the "hw.logicalcpu" string)

如果没结果 2024-09-10 01:22:14

Linux:

物理 CPU 数量:

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

逻辑 CPU 数量:

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

Linux:

Number of physical CPUs:

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

Number of logical CPUs:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文