>백엔드 개발 >C++ >하이퍼스레딩 지원을 통해 물리적 프로세서 및 코어를 정확하게 감지하는 방법은 무엇입니까?

하이퍼스레딩 지원을 통해 물리적 프로세서 및 코어를 정확하게 감지하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-01 08:17:30490검색

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

하이퍼 스레딩 지원으로 물리적 프로세서 및 코어 감지

소개

스레드 애플리케이션의 경우 스레드 수를 사용 가능한 물리적 프로세서 또는 코어에 맞춰 성능을 최적화하는 것이 중요합니다. 이를 달성하려면 특히 하이퍼스레딩이 포함된 경우 물리적 코어와 가상 코어를 구별하는 것이 필수적입니다. 이 문서에서는 하이퍼 스레딩의 잠재적 존재를 고려하여 물리적 프로세서 및 코어 수를 어떻게 정확하게 감지할 수 있습니까?

하이퍼 스레딩 이해

라는 질문을 다룹니다. 하이퍼스레딩은 물리적 코어 내에 가상 코어를 생성하는 기술입니다. 이를 통해 단일 물리적 코어가 여러 스레드를 처리하여 전체 스레드 수를 효과적으로 늘릴 수 있습니다. 그러나 물리적 코어는 일반적으로 가상 코어에 비해 우수한 성능을 제공한다는 점에 유의해야 합니다.

감지 방법

물리적 프로세서 및 코어 수를 정확하게 감지하려면 CPUID 명령을 활용할 수 있습니다(x86 및 x64 프로세서에서 사용 가능). 이 명령은 다음을 포함하여 프로세서에 대한 공급업체별 정보를 제공합니다.

  1. CPU 공급업체: 이는 프로세서 제조업체(예: Intel, AMD)를 식별합니다.
  2. CPU 기능: 여기에는 하이퍼스레딩 지원 및 기타 기능을 나타내는 비트 마스크가 포함됩니다.
  3. 논리 코어 수: 이는 CPU의 총 코어 수를 나타냅니다. 가상 코어를 포함한 프로세서.
  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으로 문의하세요.