以编程方式检测物理内核的数量

Posted

技术标签:

【中文标题】以编程方式检测物理内核的数量【英文标题】:Detect number of physical cores programmatically 【发布时间】:2019-08-17 12:29:24 【问题描述】:

我目前正在处理一个多线程设置,其中 3 个线程并行运行,进行一些对时间要求极高的计算。在工作线程完成工作并停止之前,整个设置将运行几毫秒。

总的来说,只要我知道我有至少 3 个物理 CPU 内核可供使用,这个设置总体上运行良好 - 只有两个 CPU 内核和超线程无法正常工作。在这样的系统上,它比让一个线程处理主线程产生的两种工作负载要慢。

现在我的问题是,在 Windows 下,我可以通过查询来自某些系统调用的信息并相应地调整设置来轻松检测物理内核的数量,但是在 Linux 上有关此问题的所有搜索都没有产生可用的结果 - 最好的建议阅读外部工具的文本输出。这些工具存在的事实告诉我,必须有一种方法来检测物理内核的数量。我尝试了 CPUID,但它也只在支持超线程的 CPU 上返回双倍数字,C++ 线程函数也是如此。

那么,有没有可靠的方法以机器可读的形式获取这些信息?

【问题讨论】:

【参考方案1】:

尝试将lscpu -J 作为外部命令运行。这将在 JSON 文件中为您提供一堆与硬件相关的参数。例如:

$ lscpu -J

   "lscpu": [
      "field": "Architecture:", "data": "x86_64",
      "field": "CPU op-mode(s):", "data": "32-bit, 64-bit",
      "field": "Byte Order:", "data": "Little Endian",
      "field": "CPU(s):", "data": "4",
      "field": "On-line CPU(s) list:", "data": "0-3",
      "field": "Thread(s) per core:", "data": "2",
      "field": "Core(s) per socket:", "data": "2",
      "field": "Socket(s):", "data": "1",
      "field": "NUMA node(s):", "data": "1",
      "field": "Vendor ID:", "data": "GenuineIntel",
      "field": "CPU family:", "data": "6",
      "field": "Model:", "data": "58",
      "field": "Model name:", "data": "Intel(R) Core(TM) i5-3340M CPU @ 2.70GHz",
      "field": "Stepping:", "data": "9",
      "field": "CPU MHz:", "data": "1351.427",
      "field": "CPU max MHz:", "data": "3400.0000",
      "field": "CPU min MHz:", "data": "1200.0000",
      "field": "BogoMIPS:", "data": "5382.52",
      "field": "Virtualization:", "data": "VT-x",
      "field": "L1d cache:", "data": "32K",
      "field": "L1i cache:", "data": "32K",
      "field": "L2 cache:", "data": "256K",
      "field": "L3 cache:", "data": "3072K",
      "field": "NUMA node0 CPU(s):", "data": "0-3",
      "field": "Flags:", "data": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm cpuid_fault epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm ida arat pln pts md_clear flush_l1d"
   ]

$

有关详细信息,请参阅lscpu 手册条目。

【讨论】:

以上是关于以编程方式检测物理内核的数量的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种特定于“pathos”的方法来确定 CPU 内核的数量?

物理CPUCPU内核逻辑CPU概念与查看方法

以编程方式查找机器上的内核数

(笔记)Linux内核学习之内核内存管理方式

物理CPU,物理cpu内核,逻辑cpu概念详解

物理CPU,物理CPU内核,逻辑CPU概念详解