我正在编写一个CPU密集型的图像处理库。为了更好地利用可用的CPU,我可以检测机器上的核心总数,并让我的库使用这个线程数来运行。当我的库为每个核心分配一个线程时,它使用100%可用的处理器时间进行优化。
当我的进程只运行CPU时,上述方法工作得很好。如果另一个CPU密集型进程正在运行,或者甚至是我自己代码的另一个实例,那么OS只分配我们可用内核的一小部分,而我的库中运行的线程太多,这既效率低下,又不考虑其他进程。
因此,我想找到一种方法来确定在特定负载下运行的线程的“公平份额”数量。例如,如果我的进程的两个实例在8核计算机上运行,每个实例都将以4个线程运行。每个线程都需要一种根据机器负载的波动动态调整线程计数的方法。
所以,我的问题是:
中的公平份额?
我关注的是Windows,但对非Windows解决方案也感兴趣。
编辑:要弄清楚,这是关于优化的。我正试图通过运行适合于我的CPU份额的最佳线程数来实现峰值效率。
发布于 2011-10-11 10:36:29
在我看来,应用程序不应该决定要生成多少线程。这是打电话的人应该知道的信息。在linux中,"-j“或”-作业“参数被广泛使用(缺省值: 1)。
还可以设置处理任务的优先级吗?因此,如果调用者知道,处理是任务关键,他可以增加prio (可能阻塞整个系统)。您的处理库永远不会知道,处理这个图像有多重要。如果调用方不关心,则使用默认的低prio,这不应影响系统的其他部分。如果是这样的话,你应该看看到底是什么阻塞了系统(也许可以将图像文件写入hdd,缩小内存大小以防止交换,.)。如果你知道这一点,你就可以精确地优化这一点。
如果您以(cpu-核心)*2开始处理,直到正常优先级为止,您的系统应该是可用的。没人会料到这会毁了整个系统。
只是我的两分钱。
发布于 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控制优先级时,它会导致一个更宽的时间窗口。我不得不说,这不能保证。
https://stackoverflow.com/questions/7724514
复制相似问题