将特定线程绑定到特定处理器核心

时间:2010-07-22 16:14:55

标签: java c++ multithreading

我在大学里对并行处理有点说,现在我正试图改善它。我可以编写可以并行运行的代码然后启动线程,但之后我放松了对线程执行操作的控制。我想知道如何控制线程,例如将特定线程绑定到特定的处理器核心。

我最感兴趣的是c ++,但我已经用Java编写了一些代码,所以这些答案也很受欢迎。

3 个答案:

答案 0 :(得分:14)

与其他一些受访者的建议相反,对于某些系统(当然是高频率交易,毫无疑问是许多其他非常低延迟的系统,如搜索引擎),将线程绑定到CPU核心(或者用于超级线程内核,单个CPU线程)可以带来巨大的性能优势。

天真但越来越被拒绝的观点是,增加线程(在合理范围内)会增加此类系统的吞吐量。但是,正确设计的证据越来越多,在大多数处理中使用极少线程的解决方案可能会大大超过高并发解决方案 - 有时候会超过十,甚至一百。

这个的主要原因是上下文切换。上下文切换是一个CPU将其当前线程的工作环境刷新到缓存RAM(如果你很幸运)或主RAM(如果你不是),并在工作环境中读取下一个线程的过程 - 它是低延迟系统可以执行的最昂贵的操作之一。

如果您希望最小化低延迟至关重要的上下文切换,则某些关键进程最好限制在单个核心或CPU线程中。如果多个线程需要读取或写入由那些关键线程限制进程管理的数据,您可能希望查看“Disruptor”模式,它使用环形缓冲区加上一些巧妙的技巧来实现非常快速的访问共享数据,同时几乎不需要对该数据进行独占锁定(链接如下)。

要在Java中以独立于操作系统的方式实现线程关联(CPU绑定)任务,您可以使用Peter Lawrey的Java Thread Affinity库,也在下面链接。还要注意一个例子,其中Peter将读者线程绑定到超线程核心的一个超线程,并将一个写入线程绑定到另一个,这个技巧我可以设想有明显的好处(虽然我没有尝试过)。

巴尼

http://lmax-exchange.github.io/disruptor/

https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/How-it-works

答案 1 :(得分:4)

在Windows上,您可以使用SetThreadAffinityMask为线程设置处理器关联。

答案 2 :(得分:4)

我在Java视角回答:那是不可能的。您可以控制的最好的是thread priority。要强制Java在某个CPU /核心上运行,您必须以特定于平台的方式执行此操作。例如,在Windows中,您可以在任务管理器中执行此操作,方法是在进程选项卡中找到该进程,右键单击相关进程(通常为java.exe),然后选择 Set Affinity < / em>并勾选CPU /核心。

enter image description here

正如您可能猜到的那样,这确实是全局设置亲和力,而不是基于您在Java中创建的线程。