4

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

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

4

4 回答 4

6

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

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

于 2012-11-11T21:35:30.063 回答
6

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

于 2012-11-12T19:46:20.100 回答
4

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

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

于 2012-11-12T20:13:32.370 回答
0

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

于 2015-09-16T08:12:07.257 回答