启用超线程系统上的CPU编号

9
我正在尝试了解操作系统(Windows,Linux)在启用超线程的环境中如何为逻辑CPU分配编号。操作系统是否首先对物理CPU进行串行编号,然后开始为逻辑CPU编号,还是遵循其他规则?例如,在具有超线程的2个物理CPU系统中,操作系统是否将编号0,2分配给第一个物理CPU,然后将1,3分配给第二个物理CPU..?任何参考资料都将不胜感激。谢谢您提前的帮助。顺祝商祺,Jay。编辑:回答Alan的问题:我需要知道这个原因是因为,在我的工作中,我需要将各种线程绑定到特定的CPU上,以避免上下文切换,并确保某些任务(线程)绑定到单独的物理CPU上。谢谢。
2个回答

9
据我所知,这取决于CPU如何暴露他的内核。当启用HT时,没有暴露的物理CPU,而是每个物理CPU有两个逻辑CPU,因此无论您在哪个逻辑CPU上运行线程都没有区别。唯一重要的是哪些逻辑CPU对应于每个物理CPU。
对于单核处理器(如带有HT的Pentium 4),它非常直接,因为您只有一个配对 - 因此它是(0,1)。对于四核处理器(如Nehalem),逻辑内核配对为(0,4),(1,5),(2,6)和(3,7)。所有配对的第一个半部分再加上所有配对的第二个半部分的模式应该随未来拥有更多内核的CPU扩展。
真正的问题是,您为什么需要知道配对排列?让操作系统的调度程序为正确的线程选择正确的内核-它可以很好地完成工作。

3
我想知道这个问题的答案,因为我想将不同的任务(线程)绑定到不同的逻辑CPU上。 - Jay D
但是为什么呢?线程调度程序会负责在核心之间正确平衡负载。通常不需要手动执行此操作(甚至可能会降低性能),并且可能会对边缘情况产生意外的副作用。 - Allon Guralnek
2
我们使用的一些算法在微秒级别上有时间限制。因此,如果我们不对处理这些算法的多个线程强制执行CPU亲和性,上下文切换会使得无法实现这些时间限制。 - Jay D
哦,我猜这只是其中一个边缘情况。祝你好运,希望它能为你解决问题。 - Allon Guralnek

5

您可以查看 /sys/devices/system/cpu/ 以获取有关CPU的信息。核心及其超线程对的布局可以在 /sys/devices/system/cpu/cpuN/topology/thread_siblings_list 中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接