C 如何使用Windows7中的所有内核?

C 如何使用Windows7中的所有内核?,c,windows-7,multicore,C,Windows 7,Multicore,我不确定这是属于Stackoverflow还是Superuser,但我想我会在这里问一下 我有一个用C编写的基于控制台的应用程序,目前在Windows7 64位操作系统中需要大约一个小时才能终止。任务管理器报告应用程序仅使用25%的可用CPU。我想通过提高cpu使用率来减少运行时间 有没有办法让应用程序使用全部四个核心(笔记本电脑有核心i5)而不是一个?我假设task manager报告25%,因为只有一个内核分配给程序。您可以使用OpenMP或POSIX线程,我推荐OpenMP,因为它有一个非

我不确定这是属于Stackoverflow还是Superuser,但我想我会在这里问一下

我有一个用C编写的基于控制台的应用程序,目前在Windows7 64位操作系统中需要大约一个小时才能终止。任务管理器报告应用程序仅使用25%的可用CPU。我想通过提高cpu使用率来减少运行时间


有没有办法让应用程序使用全部四个核心(笔记本电脑有核心i5)而不是一个?我假设task manager报告25%,因为只有一个内核分配给程序。

您可以使用OpenMP或POSIX线程,我推荐OpenMP,因为它有一个非常基本的结构,根据您的程序,它可以使实现变得快速和简单。

应用程序需要以多线程方式编写,以便使用多核。无法让单线程应用程序使用多核。

目前还没有将任意C程序转换为多线程程序的标准工具。因此,如果作为开发人员,您没有显式地编写多线程代码,那么不要期望您的程序一次使用多个内核,除非您调用使用线程编写的第三方库函数


为了更好地使用CPU,您所能做的最多的事情(如果与您的情况相关的话)是将您的输入分为N个块,并在每个块上多次运行该程序,然后在输入全部完成后再进行一些组合

如果不将应用程序重新写入多线程模式,则无法更改应用程序的行为。 你唯一能做的事情是,如果应用程序可以处理一系列输入数据,那么你可以启动4个应用程序实例,其中包含不同范围的输入数据进行处理,并在全部完成后合并结果

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


学究般地说,您的应用程序已经使用了所有内核。正如您上面所说,没有为流程分配一个特定的核心(除非您做出明确的努力将流程绑定到一个特定的核心)

该进程使用所有内核,但它是按顺序使用它们的:它在一个内核上运行一点,然后在另一个内核上运行一点,以此类推。也就是说,应用程序消耗的CPU时间平均分布在系统中的所有核心上。由于在任何给定时刻只使用一个内核,CPU负载将永远不会超过25%的限制(显然,您的系统有4个内核)


如果您想超过25%的限制,您必须能够同时使用两个或多个内核,这意味着至少部分代码必须并行运行。为了做到这一点,应用程序必须专门编写以并行运行。普通的单线程应用程序本身永远不会做到这一点。

+1因为这在某些情况下肯定会起作用。一个典型的例子是对大数据文件中的顺序数据进行操作。将文件拆分为4个较小的文件,运行程序4次,您可以在15分钟而不是一小时内完成。是的!聪明!我总是忘记那件事。这不完全是真的。此编译器/虚拟机()能够并行化(单线程)CLI代码(但也可以并行化其他语言)。操作系统试图将同一个应用程序保存在同一个内核上,以避免缓存刷新。Windows 7非常努力地使进程尽可能长时间地与它所运行的CPU保持密切联系,调度程序与XP及之前所显示的退化行为完全不同,但老实说,这是一大堆话,并没有真正增加多少来回答这个问题永远不要说“永不”,拆分输入几乎总是可能的,但这需要重写。:)