【问题标题】:How to get number of cores on linux using c programming?如何使用 c 编程获取 linux 上的内核数?
【发布时间】:2015-07-14 09:36:55
【问题描述】:

我知道如何获取 C 中的逻辑核心数。

sysconf(_SC_NPROCESSORS_CONF);

这将在我的 i3 处理器上返回 4。但实际上 i3 中只有 2 个内核。

我如何获得物理核心数?

【问题讨论】:

  • 处理器代码是什么?许多英特尔每个物理内核有 2 个逻辑内核。您可以在英特尔电子表格中获得更多信息
  • @gengisdave 有什么方法可以让我用 c 语言获取物理内核的数量吗?
  • 我不知道 C 的解决方案,在 C++ 中你可以使用 boost::thread::physical_concurrency()
  • 很可能sysconf(_SC_NPROCESSORS_CONF) 返回线程总数(超线程线程),而不是物理内核。
  • boost 有两种方法,在 C 中你必须解析 /proc/cpuinfocpu cores : 行)或使用 libcpuid

标签: c linux cpu


【解决方案1】:

这是一个使用 libcpuid 的 C 解决方案。

cores.c:

#include <stdio.h>
#include <libcpuid.h>

int main(void)
{
    struct cpu_raw_data_t raw;
    struct cpu_id_t data;

    cpuid_get_raw_data(&raw);
    cpu_identify(&raw, &data);
    printf("No. of Physical Core(s) : %d\n", data.num_cores);
    return 0;
}

这是一个使用 Boost 的 C++ 解决方案。

cores.cpp:

// use boost to get number of cores on the processor
// compile with : g++ -o cores cores.cpp -lboost_system -lboost_thread

#include <iostream>
#include <boost/thread.hpp>

int main ()
{
    std::cout << "No. of Physical Core(s) : " << boost::thread::physical_concurrency() << std::endl;
    std::cout << "No. of Logical Core(s) : " << boost::thread::hardware_concurrency() << std::endl;
    return 0;
}

在我的桌面 (i5 2310) 上返回:

No. of Physical Core(s) : 4
No. of Logical Core(s) : 4

在我的笔记本电脑(i5 480M)上:

No. of Physical Core(s) : 2
No. of Logical Core(s) : 4

意味着我的笔记本电脑处理器具有超线程技术

【讨论】:

  • 感谢您的解决方案....我只是一个初学者,所以您能告诉我如何将此 libcpuid 集成到 c 中。我在 Ubuntu 上使用 Xcode IDE。
  • 好像没有ubuntu/debian的包;如果有软件包,您可以使用 apt-cache search libcpuid 搜索它(您也需要 -dev 软件包);否则您可以从源代码编译它(请参阅libcpuid.sourceforge.net/download.html 以获取说明)
【解决方案2】:

没有任何库:

int main()
{
unsigned int eax=11,ebx=0,ecx=1,edx=0;

asm volatile("cpuid"
        : "=a" (eax),
          "=b" (ebx),
          "=c" (ecx),
          "=d" (edx)
        : "0" (eax), "2" (ecx)
        : );

printf("Cores: %d\nThreads: %d\nActual thread: %d\n",eax,ebx,edx);
}

输出:

Cores: 4
Threads: 8
Actual thread: 1

【讨论】:

    【解决方案3】:

    您可以简单地读取并解析/proc/cpuinfo 伪文件(有关详细信息,请参阅proc(5);将该伪文件作为文本文件打开并逐行按顺序读取;尝试@987654325 @ 在终端中)。

    优点是你只是解析一个(Linux-specific)文本[伪]文件(不需要任何外部库,比如Gengisdave's answer),缺点是你需要解析它(不是很大处理,在循环中使用fgets 读取80 字节行,然后使用sscanf 并测试扫描的项目数......)

    flags: 行中的ht 表示您的 CPU 具有hyper-threading。 CPU 线程数由processor: 行数给出。物理内核的实际数量由cpu cores: 给出(所有这些都在我的机器上使用 4.1 内核)。

    我不确定您想了解自己拥有多少物理内核是否正确。超线程可能实际上很有用。您需要进行基准测试。

    您可能应该将应用程序中的工作线程数(例如线程池的大小)设为用户-可配置。即使在 4 核超线程处理器上,我可能希望运行的线程不超过 3 个(因为我想将其他线程用于其他事情)。

    【讨论】:

      【解决方案4】:
      #include <stdio.h>
      
      int main(int argc, char **argv)
      {
              unsigned int lcores = 0, tsibs = 0;
      
              char buff[32];
              char path[64];
      
              for (lcores = 0;;lcores++) {
                      FILE *cpu;
      
                      snprintf(path, sizeof(path), "/sys/devices/system/cpu/cpu%u/topology/thread_siblings_list", lcores);
      
                      cpu = fopen(path, "r");
                      if (!cpu) break;
      
                      while (fscanf(cpu, "%[0-9]", buff)) {
                              tsibs++;
                              if (fgetc(cpu) != ',') break;
                      }
      
                      fclose(cpu);
              }
      
              printf("physical cores %u\n", lcores / (tsibs / lcores));
      }
      

      thread_siblings_list 有一个以逗号分隔的核心列表,这些核心是当前核心的“线程兄弟”。

      将逻辑内核的数量除以同级内核的数量以获得每个内核的同级内核。将逻辑核心数除以每个核心的同级核心数得到物理核心数。

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2012-03-26
        • 1970-01-01
        • 2017-04-08
        相关资源
        最近更新 更多