C++ 有没有一种方法可以通过boost线程库将线程关联设置为处理器核心?

C++ 有没有一种方法可以通过boost线程库将线程关联设置为处理器核心?,c++,multithreading,boost-thread,affinity,C++,Multithreading,Boost Thread,Affinity,如果我需要处理器内核100%运行十几秒,那么这样做是一个好主意,还是让系统决定如何处理线程,我会获得更好的性能 我需要的是快速执行,我担心系统在使用所有内核之前可能会花费几秒钟的时间,但我还没有找到任何方法使用boost thread来实现这一点。您的操作系统的调度程序应该以毫秒为单位,而不是以秒为单位。详细信息取决于您运行的操作系统,但一种常见的方法是,当调度程序在空闲CPU上运行时,它将检查是否可以从另一个CPU上窃取一个线程,该CPU有太多线程。它可以快速平衡所有CPU上的线程 作为一般规

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


我需要的是快速执行,我担心系统在使用所有内核之前可能会花费几秒钟的时间,但我还没有找到任何方法使用boost thread来实现这一点。

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


作为一般规则,如果需要设置CPU相关性,要么您有一个非常特殊的用例,要么您的操作系统有一个bug。

在非常高性能的系统中,如果您将对缓存敏感的内存占用率较低的任务分配给特定的内核,而该内核几乎只执行此任务,则性能会提高。其效果是提高了缓存命中率,这将产生巨大的影响。如果情况并非如此,则将事情留给操作系统的调度程序处理。这是(如上所述)一种相当特殊的情况,但当它们出现时,处理器亲缘关系值得研究。

您首先需要调用成员函数,然后将获得的句柄传递给平台特定的函数,以设置线程的CPU亲缘关系(即pthread_setaffinity_np/SetThreadAffinityMask/…)


至于这是否是个好主意:profile&find…

还有一个原因需要设置关联。对于某些现代系统(例如基于ARM的SOCs),节能技术会显著影响调度器。系统以尽可能少的cpu内核运行。如果所有当前任务都可以在一个内核上运行,那么只有其他内核处于休眠状态。如果负载突然上升(运行新的繁重任务),则需要唤醒一个或多个内核。这个过程相对比较慢,所以当调度程序平衡更多内核的负载时,它会导致任务缺少cpu。通过将手动关联设置为几个线程/进程,您可以保持所有内核运行(并随时准备负载突然上升)。它似乎适合于伪实时任务。

好吧,最后我不得不自己去发现这一点。但你是对的,最好由系统来决定。总体而言,我的性能稍好一些,需要处理的代码也少了一些。另外,在这种情况下,您几乎总是需要隔离CPU核心。在不隔离CPU核心的情况下将线程关联性设置为CPU核心,这意味着您的线程最终将与其他线程竞争该特定CPU核心。如果另一个线程在这个核心上运行,你的缓存就会被污染。因此,如果您正在执行线程关联,那么您也应该绝对隔离CPU核心。如果你不能隔离CPU核心-你可能不应该做线程关联。这是一个关键点。你真的不希望另一个进程破坏你的缓存。