首页 >后端开发 >C++ >如何准确检测具有超线程支持的物理处理器和内核?

如何准确检测具有超线程支持的物理处理器和内核?

DDD
DDD原创
2024-11-01 08:17:30485浏览

How to Accurately Detect Physical Processors and Cores with Hyper-Threading Support?

检测具有超线程支持的物理处理器和内核

简介

在多 -对于线程应用程序,通过将线程数量与可用的物理处理器或内核对齐来优化性能至关重要。为了实现这一目标,必须区分物理核心和虚拟核心,特别是在涉及超线程时。本文解决了以下问题:考虑到超线程的潜在存在,我们如何准确检测物理处理器和内核的数量?

了解超线程

超线程是一种在物理内核中创建虚拟内核的技术。这允许单个物理核心处理多个线程,从而有效地增加总线程数。但需要注意的是,与虚拟核心相比,物理核心通常具有更优越的性能。

检测方法

为了准确检测物理处理器和核心的数量,我们可以利用 CPUID 指令(在 x86 和 x64 处理器上可用)。此指令提供有关处理器的特定于供应商的信息,包括:

  1. CPU 供应商:这标识了处理器的制造商(例如 Intel、AMD)。
  2. CPU 功能:这包括指示超线程支持和其他功能的位掩码。
  3. 逻辑核心计数:这表示处理器中的核心总数处理器,包括虚拟核心。
  4. 物理核心计数:这表示处理器中的物理核心数量。

实现

以下 C 代码提供了一种独立于平台的方法,用于检测物理处理器和内核(考虑超线程):

<code class="cpp">#include <iostream>
#include <stdint.h>

using namespace std;

// Execute CPUID instruction
void cpuID(uint32_t functionCode, uint32_t* registers) {
#ifdef _WIN32
    __cpuid((int*)registers, (int)functionCode);
#else
    asm volatile(
        "cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])
        : "a" (functionCode), "c" (0)
    );
#endif
}

int main() {
    uint32_t registers[4];
    uint32_t logicalCoreCount, physicalCoreCount;

    // Get vendor
    cpuID(0, registers);
    string vendor = (char*)(&registers[1]);

    // Get CPU features
    cpuID(1, registers);
    uint32_t cpuFeatures = registers[3];

    // Get logical core count
    cpuID(1, registers);
    logicalCoreCount = (registers[1] >> 16) & 0xff;
    cout << "Logical cores: " << logicalCoreCount << endl;

    // Get physical core count
    physicalCoreCount = logicalCoreCount;
    if (vendor == "GenuineIntel") {
        // Intel
        cpuID(4, registers);
        physicalCoreCount = ((registers[0] >> 26) & 0x3f) + 1;
    } else if (vendor == "AuthenticAMD") {
        // AMD
        cpuID(0x80000008, registers);
        physicalCoreCount = ((unsigned)(registers[2] & 0xff)) + 1;
    }
    cout << "Physical cores: " << physicalCoreCount << endl;

    // Check hyper-threading
    bool hyperThreads = cpuFeatures & (1 << 28) && (physicalCoreCount < logicalCoreCount);
    cout << "Hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

    return 0;
}</code>

结果

何时在不同的 Intel 和 AMD 处理器上执行,此代码将提供类似于以下内容的输出:

Intel Core i5-7200U(2 个物理内核,4 个逻辑内核):

Logical cores: 4
Physical cores: 2
Hyper-threads: true

AMD Ryzen 7 1700X(8 个物理核心,16 个逻辑核心):

Logical cores: 16
Physical cores: 8
Hyper-threads: true

结论

通过实施此检测通过这种方法,开发人员可以准确地将多线程应用程序中的线程数与可用的物理处理器和内核相匹配,从而优化 Windows、Mac 和 Linux 系统上的性能。这确保了底层硬件资源的有效利用,从而提高性能并减少执行时间。

以上是如何准确检测具有超线程支持的物理处理器和内核?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn