ホームページ >バックエンド開発 >C++ >ハイパースレッディングのサポートで物理プロセッサとコアを正確に検出するにはどうすればよいですか?

ハイパースレッディングのサポートで物理プロセッサとコアを正確に検出するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-01 08:17:30488ブラウズ

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

ハイパースレッディング サポートによる物理プロセッサとコアの検出

概要

マルチスレッド アプリケーションでは、利用可能な物理的リソースに合わせてスレッドの数を調整してパフォーマンスを最適化することが重要です。プロセッサまたはコア。これを実現するには、特にハイパースレッディングが関係する場合、物理コアと仮想コアを区別することが重要です。この記事では、「ハイパー スレッディングの潜在的な存在を考慮して、物理プロセッサとコアの数を正確に検出するにはどうすればよいですか?

ハイパー スレッディングについて

」という質問に対処します。ハイパースレッディングは、物理コア内に仮想コアを作成するテクノロジーです。これにより、単一の物理コアで複数のスレッドを処理できるようになり、全体のスレッド数が効果的に増加します。ただし、一般に物理コアは仮想コアと比較して優れたパフォーマンスを提供することに注意することが重要です。

検出方法

物理プロセッサとコアの数を正確に検出するには、次の手順を実行します。 CPUID 命令 (x86 および x64 プロセッサで利用可能) を利用できます。この命令は、次のようなプロセッサに関するベンダー固有の情報を提供します。

  1. CPU Vendor: これは、プロセッサの製造元 (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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。