如何在不同的CPU核心上运行不同的线程?

10

我正在使用Ubuntu中的g++编译器编写c++程序。我的程序中有4个线程和4个CPU核心。我想确保每个线程都在不同的核心上运行。我对pthread并不是很熟悉。

可能重复的问题:
如何设置特定pthread的CPU亲和力?


2
我可以问一下你为什么要这样做吗?如果你确保线程不会相互阻塞(以便它们可以同时运行),操作系统将在任何核心有空闲时间时负责调度它们。 - James
@autopulated,实际上核心和套接字亲和力可以极大地影响性能。想象一下fork/join,通常你希望额外的线程被安排在空闲的核心上运行,而不是在同一个核心上启动(因为这通常更快),以便实际并行运行。此外,您更喜欢首先在同一个套接字上安排以利用局部性。 - bestsss
本地性是一个很好的理由,但正如David所指出的那样,结果并不一定如你所期望的那么好。 - James
@bestsss 在简单的情况下(即一个进程完成所有工作),调度程序将为您确保局部性。 - David Heffernan
@David,调度程序通常会在同一核心上生成新线程,它们会工作一段时间然后重新调度。除非明确指定了每个套接字都有4个内核的情况下,你有两个fork/join任务正在进行(在同一个进程中),称为2个排序。你希望单个排序操作中的线程驻留在同一个套接字上,以便通过缓存进行的通信更快。 - bestsss
让我补充一下,有时这样做是有好处的。我的一个项目在将线程亲和力显式设置到每个核心时看到了4%的增长。那是在虚拟机上(Xeon E5-2690,具有2个内核而没有超线程)。话虽如此,在生产集群(8个具有HT的内核)上执行此操作会导致性能严重下降,并且在某些情况下,我的开发VM更快。 - Mel
2个回答

14

不要这样做。让系统调度线程。如果你将线程与不同的内核绑定,就会削弱调度器的能力。当你的应用程序是唯一消耗CPU资源的时候,调度器会自然地将每个线程分配到不同的内核上。


13
这是一条评论,而不是一个答案。它可能是正确的,但如果练习的重点是了解当线程被固定时会发生什么,那么你正在阻碍学习。为什么不趁机焚烧Linux手册,知识是危险的 ;-p - Steve Jessop


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