检测具有超线程支持的物理处理器和内核
简介
在多 -对于线程应用程序,通过将线程数量与可用的物理处理器或内核对齐来优化性能至关重要。为了实现这一目标,必须区分物理核心和虚拟核心,特别是在涉及超线程时。本文解决了以下问题:考虑到超线程的潜在存在,我们如何准确检测物理处理器和内核的数量?
了解超线程
超线程是一种在物理内核中创建虚拟内核的技术。这允许单个物理核心处理多个线程,从而有效地增加总线程数。但需要注意的是,与虚拟核心相比,物理核心通常具有更优越的性能。
检测方法
为了准确检测物理处理器和核心的数量,我们可以利用 CPUID 指令(在 x86 和 x64 处理器上可用)。此指令提供有关处理器的特定于供应商的信息,包括:
实现
以下 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*)(®isters[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中文网其他相关文章!