久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何在 Windows、Mac 和 Linux 上檢測物理處理器/內(nèi)核

How to Detect the Number of Physical Processors / Cores on Windows, Mac and Linux(如何在 Windows、Mac 和 Linux 上檢測物理處理器/內(nèi)核的數(shù)量)
本文介紹了如何在 Windows、Mac 和 Linux 上檢測物理處理器/內(nèi)核的數(shù)量的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我有一個多線程 C++ 應(yīng)用程序,可以在 Windows、Mac 和一些 Linux 版本上運行.

I have a multi threaded c++ application that runs on Windows, Mac and a few Linux flavors.

長話短說:為了讓它以最高效率運行,我必須能夠為每個物理處理器/內(nèi)核實例化一個線程.創(chuàng)建比物理處理器/內(nèi)核更多的線程會大大降低我的程序的性能.我已經(jīng)可以在所有這三個平臺上正確檢測到邏輯處理器/內(nèi)核的數(shù)量.為了能夠正確檢測物理處理器/內(nèi)核的數(shù)量,我必須檢測是否支持和激活超線程.

To make a long story short: In order for it to run at maximum efficiency, I have to be able to instantiate a single thread per physical processor/core. Creating more threads than there are physical processors/cores degrades the performance of my program considerably. I can already correctly detect the number of logical processors/cores correctly on all three of these platforms. To be able to detect the number of physical processors/cores correctly I'll have to detect if hyper-treading is supported AND active.

因此,我的問題是是否有辦法檢測是否支持并啟用了超線程?如果是這樣,具體如何.

My question therefore is if there is a way to detect whether Hyper Threading is supported and enabled? If so, how exactly.

推薦答案

由于英特爾的持續(xù)困惑,這不再是 100% 正確的.

我理解這個問題的方式是,您問的是如何檢測 CPU 內(nèi)核數(shù)與 CPU 線程數(shù),這與檢測系統(tǒng)中的邏輯和物理內(nèi)核數(shù)不同.CPU 內(nèi)核通常不被操作系統(tǒng)視為物理內(nèi)核,除非它們有自己的封裝或芯片.因此,操作系統(tǒng)將報告 Core 2 Duo,例如,具有 1 個物理 CPU 和 2 個邏輯 CPU,而具有超線程的 Intel P4 將以完全相同的方式報告,即使 2 個超線程與 2 個 CPU 內(nèi)核非常相似不同的事情表現(xiàn)明智.

The way I understand the question is that you are asking how to detect the number of CPU cores vs. CPU threads which is different from detecting the number of logical and physical cores in a system. CPU cores are often not considered physical cores by the OS unless they have their own package or die. So an OS will report that a Core 2 Duo, for example, has 1 physical and 2 logical CPUs and an Intel P4 with hyper-threads will be reported exactly the same way even though 2 hyper-threads vs. 2 CPU cores is a very different thing performance wise.

我一直在努力解決這個問題,直到我拼湊出下面的解決方案,我相信它適用于 AMD 和 Intel 處理器.據(jù)我所知,我可能是錯的,AMD 還沒有 CPU 線程,但他們提供了一種檢測它們的方法,我認(rèn)為這些方法將適用于未來可能具有 CPU 線程的 AMD 處理器.

I struggled with this until I pieced together the solution below, which I believe works for both AMD and Intel processors. As far as I know, and I could be wrong, AMD does not yet have CPU threads but they have provided a way to detect them that I assume will work on future AMD processors which may have CPU threads.

簡而言之,這里是使用 CPUID 指令的步驟:

In short here are the steps using the CPUID instruction:

  1. 使用 CPUID 函數(shù) 0 檢測 CPU 供應(yīng)商
  2. 從 CPUID 函數(shù) 1 檢查 CPU 特性 EDX 中的 HTT 位 28
  3. 從 CPUID 函數(shù) 1 的 EBX[23:16] 中獲取邏輯核心數(shù)
  4. 獲取實際的非線程 CPU 核心數(shù)
  1. Detect CPU vendor using CPUID function 0
  2. Check for HTT bit 28 in CPU features EDX from CPUID function 1
  3. Get the logical core count from EBX[23:16] from CPUID function 1
  4. Get actual non-threaded CPU core count
  1. 如果 vendor == 'GenuineIntel' 這是 1 加上來自 CPUID 函數(shù) 4 的 EAX[31:26]
  2. 如果 vendor == 'AuthenticAMD' 這是 1 加上來自 CPUID 函數(shù) 0x80000008 的 ECX[7:0]

聽起來很困難,但這里有一個希望能夠做到這一點的獨立于平臺的 C++ 程序:

Sounds difficult but here is a, hopefully, platform independent C++ program that does the trick:

#include <iostream>
#include <string>

using namespace std;


void cpuID(unsigned i, unsigned regs[4]) {
#ifdef _WIN32
  __cpuid((int *)regs, (int)i);

#else
  asm volatile
    ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
     : "a" (i), "c" (0));
  // ECX is set to zero for CPUID function 4
#endif
}


int main(int argc, char *argv[]) {
  unsigned regs[4];

  // Get vendor
  char vendor[12];
  cpuID(0, regs);
  ((unsigned *)vendor)[0] = regs[1]; // EBX
  ((unsigned *)vendor)[1] = regs[3]; // EDX
  ((unsigned *)vendor)[2] = regs[2]; // ECX
  string cpuVendor = string(vendor, 12);

  // Get CPU features
  cpuID(1, regs);
  unsigned cpuFeatures = regs[3]; // EDX

  // Logical core count per CPU
  cpuID(1, regs);
  unsigned logical = (regs[1] >> 16) & 0xff; // EBX[23:16]
  cout << " logical cpus: " << logical << endl;
  unsigned cores = logical;

  if (cpuVendor == "GenuineIntel") {
    // Get DCP cache info
    cpuID(4, regs);
    cores = ((regs[0] >> 26) & 0x3f) + 1; // EAX[31:26] + 1

  } else if (cpuVendor == "AuthenticAMD") {
    // Get NC: Number of CPU cores - 1
    cpuID(0x80000008, regs);
    cores = ((unsigned)(regs[2] & 0xff)) + 1; // ECX[7:0] + 1
  }

  cout << "    cpu cores: " << cores << endl;

  // Detect hyper-threads  
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;

  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}

我還沒有在 Windows 或 OSX 上實際測試過這個,但它應(yīng)該可以工作,因為 CPUID 指令在 i686 機器上有效.顯然,這不適用于 PowerPC,但它們也沒有超線程.

I haven't actually tested this on Windows or OSX yet but it should work as the CPUID instruction is valid on i686 machines. Obviously, this wont work for PowerPC but then they don't have hyper-threads either.

以下是幾臺不同的 Intel 機器上的輸出:

Here is the output on a few different Intel machines:

Intel(R) Core(TM)2 Duo CPU T7500 @ 2.20GHz:

Intel(R) Core(TM)2 Duo CPU T7500 @ 2.20GHz:

 logical cpus: 2
    cpu cores: 2
hyper-threads: false

Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz:

Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz:

 logical cpus: 4
    cpu cores: 4
hyper-threads: false

Intel(R) Xeon(R) CPU E5520 @ 2.27GHz(帶 x2 物理 CPU 包):

Intel(R) Xeon(R) CPU E5520 @ 2.27GHz (w/ x2 physical CPU packages):

 logical cpus: 16
    cpu cores: 8
hyper-threads: true

英特爾(R) Pentium(R) 4 CPU 3.00GHz:

Intel(R) Pentium(R) 4 CPU 3.00GHz:

 logical cpus: 2
    cpu cores: 1
hyper-threads: true

這篇關(guān)于如何在 Windows、Mac 和 Linux 上檢測物理處理器/內(nèi)核的數(shù)量的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

What is the fastest way to transpose a matrix in C++?(在 C++ 中轉(zhuǎn)置矩陣的最快方法是什么?)
Sorting zipped (locked) containers in C++ using boost or the STL(使用 boost 或 STL 在 C++ 中對壓縮(鎖定)容器進(jìn)行排序)
Rotating a point about another point (2D)(圍繞另一個點旋轉(zhuǎn)一個點 (2D))
Image Processing: Algorithm Improvement for #39;Coca-Cola Can#39; Recognition(圖像處理:Coca-Cola Can 識別的算法改進(jìn))
How do I construct an ISO 8601 datetime in C++?(如何在 C++ 中構(gòu)建 ISO 8601 日期時間?)
Sort list using STL sort function(使用 STL 排序功能對列表進(jìn)行排序)
主站蜘蛛池模板: 久久精品99久久久久久 | 亚洲欧美成人 | 成人深夜 | 亚洲第一区视频 | 特黄av| 天天爱天天色 | 欧美成人精品欧美一级乱黄 | 91日本视频 | 国产91清纯白嫩初高中在线观看 | 日韩毛片免费 | 国产免费一级 | 久久婷婷网 | 成人福利 | 亚洲精品第一页 | 免费国产一区二区 | 亚洲成人av在线播放 | 日韩黄色在线视频 | 久久国产欧美 | 精品人伦一区二区三区 | 久久精品99| 日韩欧美大片 | 日本黄a三级三级三级 | 日韩精品久久久久久久酒店 | 国产免费一级 | 欧美日韩国产在线 | 国产精品欧美在线 | 香蕉网在线 | 一级黄色片免费看 | 亚洲乱码一区二区 | 日韩在线中文字幕 | www中文字幕| 国产一级免费视频 | www激情| 久久艹精品 | 亚洲天堂久久久 | 黄视频网站在线观看 | 人人爽人人澡 | 亚洲毛片在线 | 四川毛片 | 日产久久视频 | 国产精品高潮呻吟久久 |