我的 Ubuntu 24.04 PC(配备 Intel i5-1340P CPU)具有以下核心(仅位于列表顶部):
$ lscpu -ae
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4600.0000 400.0000 2617.4641
1 0 0 0 0:0:0:0 yes 4600.0000 400.0000 3020.7361
2 0 0 1 4:4:1:0 yes 4600.0000 400.0000 4433.3979
3 0 0 1 4:4:1:0 yes 4600.0000 400.0000 4420.9849
4 0 0 2 8:8:2:0 yes 4600.0000 400.0000 400.0000
5 0 0 2 8:8:2:0 yes 4600.0000 400.0000 400.0000
6 0 0 3 12:12:3:0 yes 4600.0000 400.0000 400.0000
7 0 0 3 12:12:3:0 yes 4600.0000 400.0000 400.0000
连续的逻辑CPU对属于相同的物理核心,例如CPU #4 和 #5 属于物理 CORE #2。对
sched_setaffinity()
的调用采用逻辑 CPU 编号作为参数。由于 #4 和 #5 属于同一个物理核心,所以我使用哪一个作为 sched_setaffinity()
的参数有什么区别吗?
查看
cpupower monitor -i2
的输出,似乎将线程亲和性设置为 CPU #4 或 #5 会导致线程在 #4 和 #5 之间跳动。这表明物理核心内逻辑 CPU 编号的选择是无关紧要的。
物理核心的逻辑核心在硬件行为方面是对称的,因此这一切都取决于(其他)软件。
对于一个线程,固定到一对线程中的一个意味着您与该逻辑核心上的其他事物竞争,就像固定到它的任何其他线程或可能仅由一个逻辑核心处理的任何中断处理程序一样。 Linux 驱动程序将一些高吞吐量中断路由到跨内核(例如 NVMe)分布。 但我系统上的其他驱动程序,例如
i915
、snd_hda_intel:card0
、以太网和 xhci_hcd
(USB),每个驱动程序仅在一个逻辑核心上对 /proc/interrupts
进行计数(这可能有利于缓存局部性)。
Core id#0 是(在我的 Skylake i7 上)我认为是初始启动处理器,但没有任何特别过多的中断。