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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物理CPU,物理CPU内核,逻辑CPU概念详解相关的知识,希望对你有一定的参考价值。

参考技术A CPU(Central Processing Unit)是中央处理单元,
本文介绍物理CPU,物理CPU内核,逻辑CPU,
以及他们三者之间的关系,
一个物理CPU可以有1个或者多个物理内核,
一个物理内核可以作为1个或者2个逻辑CPU。

物理CPU就是计算机上实际安装的CPU,
物理CPU数就是主板上实际插入的CPU数量。
在Linux上查看/proc/cpuinfo,
其中的physical id就是每个物理CPU的id,
有几个不同的physical id就有几个物理CPU。

每颗物理CPU可以有1个或者多个物理内核,
通常每颗物理CPU的内核数都是固定的,
单核CPU就是有1个物理内核,
双核CPU就是有2个物理内核。
在Linux上查看/proc/cpuinfo,
其中的core id就是每颗物理CPU的物理内核id,
有几个不同的core id就有几个物理内核。
总的CPU物理内核数 = 物理CPU数 * 每颗物理CPU的内核数

操作系统可以使用逻辑CPU来模拟真实CPU。
在没有多核处理器的时候,
一个物理CPU只能有一个物理内核,
而现在有了多核技术,
一个物理CPU可以有多个物理内核,
可以把一个CPU当作多个CPU使用,
为了与物理CPU区分开来,称其为逻辑CPU。
没有开启超线程时,逻辑CPU的个数就是总的CPU物理内核数。
然而开启超线程后,逻辑CPU的个数就是总的CPU物理内核数的两倍。
在Linux上查看/proc/cpuinfo,
其中的processor就是逻辑CPU,
有几个processor就有几个逻辑CPU。
总的逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数
总的逻辑CPU数 = 总的CPU物理内核数 * 超线程数

基于上面的基本概念,
理解一下常说的几核几线程。
如果计算机有一个物理CPU,
是双核的,支持超线程。
那么这台计算机就是双核四线程。
实际上几核几线程中的线程数就是逻辑CPU数。
对于两路四核超线程计算机,
两路指计算机有2个物理CPU,
每颗CPU中有4个物理内核,
CPU支持超线程,
就有2*4*2=16个逻辑CPU,
这就是通常所谓的16核计算机。

实际能看到的2个物理CPU:

实现16个逻辑CPU的原理图:

如何确保进程在特定的物理 CPU 内核和线程中运行?

【中文标题】如何确保进程在特定的物理 CPU 内核和线程中运行?【英文标题】:How can I ensure that a process runs in a specific physical CPU core and thread? 【发布时间】:2012-02-21 22:22:45 【问题描述】:

This question 询问是否确保两个进程在同一个 CPU 上运行。使用sched_setaffinity,我可以将一个进程限制为多个逻辑 CPU,但我如何确保将它们映射到特定的物理 CPU 和线程?

我希望映射是:

0 - CPU 0 线程 0 1 - CPU 0 线程 1 2 - CPU 1 线程 0 3 - CPU 1 线程 1 等等……

其中左边的数字是sched_setaffinity中使用的相关CPU。

但是,当我尝试对此进行测试时,似乎情况并非如此。

为了测试这一点,我使用了CPUID 指令,它在EBX 中返回当前内核的初始 APIC ID:

void print_cpu() 

    int cpuid_out;

    __asm__(
    "cpuid;"
        : "=b"(cpuid_out) 
        : "a"(1) 
        :);

    std::cout << "I am running on cpu " << std::hex << (cpuid_out >> 24) << std::dec << std::endl;

然后我循环遍历 cpu 掩码中的位并一次设置一个,以便操作系统将进程依次迁移到每个逻辑 CPU,然后我打印出当前的 CPU。

这是我得到的:

cpu mask is 0 
I am running on cpu 0
cpu mask is 1 
I am running on cpu 4
cpu mask is 2 
I am running on cpu 2
cpu mask is 3 
I am running on cpu 6
cpu mask is 4 
I am running on cpu 1
cpu mask is 5 
I am running on cpu 5
cpu mask is 6 
I am running on cpu 3
cpu mask is 7 
I am running on cpu 7

假设 CPU 根据我上面列出的方案分配初始 APIC ID,看起来 cpu 掩码实际上并不对应于物理内核和线程。

如何找到sched_setaffinity 掩码中位到物理内核的正确映射?

【问题讨论】:

【参考方案1】:

hwloc 是一个可移植的 C 库,用于发现硬件/NUMA 拓扑,并将进程/线程绑定到特定内核。它具有发现物理/逻辑核心,然后将进程/线程绑定到它的功能。

它也可以是looks like,它也可以返回一个cpu_set_t,用于sched_setaffinity(),如果你想继续直接使用的话。

【讨论】:

hwloc 的最佳特性之一是能够显示系统拓扑图——CPU 如何共享缓存、内存域等。

以上是关于物理CPU,物理CPU内核,逻辑CPU概念详解的主要内容,如果未能解决你的问题,请参考以下文章

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

linux查看cpu个数,核数,逻辑cpu个数

[转]物理CPUCPU核数逻辑CPU超线程

Linux查看物理CPU个数核数逻辑CPU个数

物理CPU 逻辑CPU 核数

linux下查看物理CPU个数核数逻辑CPU个数