如何在Windows 7中使用所有的CPU核心?

5
我不确定这属于Stackoverflow还是Superuser,但我想在这里问一下。
我有一个基于C语言的控制台应用程序,在Windows 7 64位操作系统上终止需要大约一个小时。任务管理器报告该应用程序仅使用了可用CPU的25%。我想通过增加CPU使用率来缩短运行时间。
有没有办法让该应用程序使用所有四个内核(笔记本电脑配备Core i5),而不仅仅是一个内核?我假设任务管理器报告25%,因为该程序只分配给一个内核。
5个回答

15

如果不重写应用程序以支持多线程,那么你无法改变应用程序的行为。 唯一可能做的事情是,如果应用程序可以处理输入数据的范围,则可以启动4个实例的应用程序,每个实例处理不同范围的输入数据,然后在它们全部完成后合并结果。

想象一下渲染3D动画,渲染器是单线程的,但是您可以指定起始和结束帧。您有100帧要渲染,您将启动4个实例,并指定起始和结束帧范围0-25、26-50、51-75、76-100。然后将所有输出组合到最终电影文件中。


3
+1是因为这种方法对某些情况肯定有效。一个经典案例是在大数据文件中处理连续数据。将文件分成4个小文件,运行程序4次,15分钟内就能完成,而不是一个小时。 - Chris Thornton
是的!聪明!我总是忘记那个。 - Andres Jaan Tack

7

为了使用多个核心,应用程序需要以多线程的方式编写。单线程应用程序无法使用多个核心。


1
永远不要说“永远不”,将输入拆分几乎总是可能的。 - user177800

4

您可以考虑使用OpenMP或POSIX线程,我建议使用OpenMP,因为它具有相当基础的结构,根据您的程序不同,可以使实现快速简便。


这需要重写。 :) - BobbyShaftoe

3

目前还没有标准工具可以将任意的C程序转换为多线程程序。因此,如果作为开发人员,您没有明确编写多线程代码,则不要期望您的程序在不使用使用线程编写的第三方库函数的情况下使用多个核心。

如果适用于您的情况,为了更好地利用CPU,您可以将输入切片成N个块,并在每个块上多次运行程序,然后在完成所有操作后对输入进行合并。


2
严谨地说,你的应用程序已经在使用所有核心。没有一个特定的核心分配给该进程,正如你上面所说的(除非你明确努力将进程绑定到一个特定的核心)。
该进程使用所有核心,但是它们是顺序使用: 它在一个核心上运行一点,然后在另一个核心上运行更多,以此类推。也就是说,你的应用程序消耗的CPU时间平均分布在系统中的所有核心上。由于任何时刻只使用一个核心,因此CPU负载永远不会超过25%(你的系统显然有4个核心)。
如果你想超过25%的限制,你必须能够同时使用两个或更多核心,这意味着至少有一些代码必须并行运行。为了做到这一点,应用程序必须专门编写以并行运行。普通的单线程应用程序永远不会自己完成这一点。

1
这并不完全正确。这个编译器/虚拟机(http://sourceforge.net/apps/mediawiki/ildjit/index.php?title=Main_Page)能够并行化(单线程)CLI代码(也包括其他语言)。而且操作系统会尽力将同一个应用程序保持在同一个核心上,以避免缓存刷新。 - Luca
2
Windows 7非常努力地将一个进程与其正在运行的CPU亲和,以尽可能长的时间保持这种关系。调度程序与XP及其之前的NT显示的退化行为完全不同。 - user177800
是的,但说实话这些话太多了,对于回答问题并没有多大帮助。 :) - BobbyShaftoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接