【问题标题】:Is there a way to set thread affinity to a processor core with the boost thread library?有没有办法使用 boost 线程库将线程关联设置到处理器内核?
【发布时间】:2012-10-31 09:37:13
【问题描述】:

如果我需要处理器内核以 100% 的速度运行十几秒钟,或者如果我让系统决定如何处理线程,我会获得更好的性能吗?

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

【问题讨论】:

    标签: c++ multithreading boost-thread affinity


    【解决方案1】:

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

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

    【讨论】:

    • 好吧,最后我必须自己找出答案。但你是对的,最好让系统来决定。总体而言,我的性能稍好一些,而且要处理的代码更少。
    【解决方案2】:

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

    【讨论】:

    • 此外,在这种情况下,您几乎总是需要隔离 CPU 内核。将线程关联设置到 CPU 核心而不隔离该 CPU 核心将意味着您的线程最终将与其他线程竞争该特定 CPU 核心。如果另一个线程在该核心上运行 - 您的缓存将被污染。所以 - 如果你正在做线程关联 - 你也应该绝对隔离那个 CPU 内核。如果您无法隔离该 CPU 内核 - 您可能不应该进行线程关联。
    • 这是一个关键点。你真的不希望另一个进程破坏你的缓存。
    【解决方案3】:

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

    至于这是否是个好主意:配置文件并找出...

    【讨论】:

      【解决方案4】:

      亲和集还有一个原因。对于某些现代系统(例如基于 ARM 的 SOC),省电技术会显着影响调度程序。系统以尽可能少的 cpu 内核运行。如果所有当前任务都可以在一个内核上运行,则只有其他内核处于休眠状态。如果负载突然上升(运行新的繁重任务),则需要唤醒一个或多个内核。此过程相对较慢,因此当调度程序正在为更多内核平衡负载时,它可能会使您的任务缺乏 CPU。通过将手动关联设置为几个线程/进程,您可以保持所有内核运行(并随时准备好应对突然的负载上升)。它看起来很适合伪实时任务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 2018-12-16
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多