有没有办法使用boost线程库设置线程关联到处理器核心?

时间:2012-11-11 21:29:06

标签: c++ multithreading boost-thread affinity

如果我需要处理器内核100%运行十几秒,或者如果我让系统决定如何处理线程,我会获得更好的性能,这样做是不是一个好主意?

我需要的是快速执行,我担心系统可能会在使用所有核心之前花费几秒钟,但我还没有找到任何使用boost线程的方法。

4 个答案:

答案 0 :(得分:5)

您的操作系统的调度程序应该按照毫秒而不是秒的顺序为您处理。详细信息取决于您正在运行的操作系统,但一种常见方法是,当调度程序在空闲CPU上运行时,它将检查是否可以从另一个具有太多CPU的CPU中窃取一个线程。这可以快速平衡所有CPU的线程。

作为一般规则,如果您需要设置CPU亲和性,要么您具有非常特殊且不寻常的用例,要么您的操作系统存在错误。

答案 1 :(得分:5)

在性能非常高的系统中,如果将对缓存敏感的低内存占用任务分配给特定内核,并且内核几乎只执行此任务,则性能会提高。效果是提高缓存命中率,这可以产生巨大的差异。如果不是这种情况,请将操作保留给操作系统的调度程序。它(如上所述)是一种相当专业的情况,但当它们出现时,处理器亲和力值得研究。

答案 2 :(得分:4)

首先需要调用get_native_handle成员函数,然后将获取的句柄传递给特定于平台的函数来设置线程的CPU亲和性(即pthread_setaffinity_np / SetThreadAffinityMask /...).

至于这是一个好主意:个人资料&找出...

答案 3 :(得分:0)

亲和力设定还有一个原因。对于一些现代系统(例如基于ARM的SOC),节电技术显着影响调度器。系统尽可能以最小cpu核心运行。如果所有当前任务都可以存在于一个核心上,则只有其他核心正在休眠。如果负载突然上升(运行新的繁重任务),则需要唤醒一个或多个核心。这个过程相对较慢,因此它可以使您的任务缺乏cpu,而调度程序正在平衡更多内核的负载。通过将手动关联设置为几个线程/进程,您可以保持所有核心运行(并始终为突然的负载上升做好准备)。它似乎对伪实时任务有好处。