首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >体贴的,动态的CPU负载管理

体贴的,动态的CPU负载管理
EN

Stack Overflow用户
提问于 2011-10-11 10:22:02
回答 2查看 421关注 0票数 3

我正在编写一个CPU密集型的图像处理库。为了更好地利用可用的CPU,我可以检测机器上的核心总数,并让我的库使用这个线程数来运行。当我的库为每个核心分配一个线程时,它使用100%可用的处理器时间进行优化。

当我的进程只运行CPU时,上述方法工作得很好。如果另一个CPU密集型进程正在运行,或者甚至是我自己代码的另一个实例,那么OS只分配我们可用内核的一小部分,而我的库中运行的线程太多,这既效率低下,又不考虑其他进程。

因此,我想找到一种方法来确定在特定负载下运行的线程的“公平份额”数量。例如,如果我的进程的两个实例在8核计算机上运行,每个实例都将以4个线程运行。每个线程都需要一种根据机器负载的波动动态调整线程计数的方法。

所以,我的问题是:

  • 是否有任何操作系统特性或第三方库,允许我的进程动态调整线程计数以使用它在CPU?

中的公平份额?

我关注的是Windows,但对非Windows解决方案也感兴趣。

编辑:要弄清楚,这是关于优化的。我正试图通过运行适合于我的CPU份额的最佳线程数来实现峰值效率。

EN

回答 2

Stack Overflow用户

发布于 2011-10-11 10:36:29

在我看来,应用程序不应该决定要生成多少线程。这是打电话的人应该知道的信息。在linux中,"-j“或”-作业“参数被广泛使用(缺省值: 1)。

还可以设置处理任务的优先级吗?因此,如果调用者知道,处理是任务关键,他可以增加prio (可能阻塞整个系统)。您的处理库永远不会知道,处理这个图像有多重要。如果调用方不关心,则使用默认的低prio,这不应影响系统的其他部分。如果是这样的话,你应该看看到底是什么阻塞了系统(也许可以将图像文件写入hdd,缩小内存大小以防止交换,.)。如果你知道这一点,你就可以精确地优化这一点。

如果您以(cpu-核心)*2开始处理,直到正常优先级为止,您的系统应该是可用的。没人会料到这会毁了整个系统。

只是我的两分钱。

票数 1
EN

Stack Overflow用户

发布于 2011-10-12 08:58:51

实际上,这不是多线程问题,而是同时执行多个程序的问题。这在大多数个人电脑的操作系统上是很难的,因为它与分时的思想相冲突。

让我们假设一些工作流。

假设我们有8个核心,我们创建了8个线程来喂养它们;好的,这很容易。接下来,我们选择监视内核加载,以总结在某个核心上运行的任务数量;嗯,这需要一些统计假设,例如在Linux上,您可以得到一个1/5/15分钟的负载平均值图表,但这是可以做到的。统计图表是清楚的,现在我们得到了有多少CPU绑定进程正在运行,例如,看到其他3个CPU密集型进程。

然后,我们谈到了重点:我们必须让三个多余的线程睡觉,但哪三个呢?

通常我们任意选择3个线程,因为调度程序会自动安排其他8个CPU绑定线程。在某些情况下,我们显式地将线程放在高负载内核上以供休眠,将其他线程分配到某些低负载内核,并让调度程序完成其余的事情。大多数调度策略也试图“保持CPU缓存热”,这意味着它们倾向于禁止在内核之间传输线程。我们合理地期望我们的CPU密集型线程能够利用核心缓存,因为其他进程被调度到3个拥挤的核心上。一切看起来都很好。

然而,在严格同步的计算中,这可能会失败。在这个场景中,我们需要同时运行我们的5个线程。同时,这意味着这5个线程必须获得CPU,并且几乎同时运行。我不知道PC上是否有任何调度器能为我们做到这一点。在大多数低负荷的情况下,事情仍然很好,因为同时等待的成本是微不足道的。但是当一个核心的负载很高,甚至我们的5个线程中有一个被干扰时,我们偶尔会发现我们在等待中花费了很多生命周期。

它可能有助于安排您的计划作为一个实时程序,但这不是一个完美的解决方案。从统计上讲,当它获得更多CPU控制优先级时,它会导致一个更宽的时间窗口。我不得不说,这不能保证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7724514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档