ハイパースレッディング サポートによる物理プロセッサとコアの検出
概要
マルチスレッド アプリケーションでは、利用可能な物理的リソースに合わせてスレッドの数を調整してパフォーマンスを最適化することが重要です。プロセッサまたはコア。これを実現するには、特にハイパースレッディングが関係する場合、物理コアと仮想コアを区別することが重要です。この記事では、「ハイパー スレッディングの潜在的な存在を考慮して、物理プロセッサとコアの数を正確に検出するにはどうすればよいですか?
ハイパー スレッディングについて
」という質問に対処します。ハイパースレッディングは、物理コア内に仮想コアを作成するテクノロジーです。これにより、単一の物理コアで複数のスレッドを処理できるようになり、全体のスレッド数が効果的に増加します。ただし、一般に物理コアは仮想コアと比較して優れたパフォーマンスを提供することに注意することが重要です。
検出方法
物理プロセッサとコアの数を正確に検出するには、次の手順を実行します。 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 中国語 Web サイトの他の関連記事を参照してください。