我不确定这是否属于Stackoverflow或超级用户,但我想我会问这里。
我有一个用C语言编写的基于控制台的应用程序,目前在Windows 7 64位操作系统中需要大约一个小时才能终止。任务管理器报告该应用程序仅使用可用CPU的25%。我想通过增加cpu使用来减少运行时间。
有没有办法让应用程序使用所有四个核心(笔记本电脑有Core i5)而不只是一个?我假设任务管理器报告25%,因为只有一个核心被分配给该程序。
答案 0 :(得分:15)
如果不重新编写应用程序为multi = threaded no,则无法更改应用程序的行为。 您可以做的唯一事情是,如果应用程序可以处理输入数据的范围,那么您可以启动具有不同输入数据范围的应用程序的4个实例来处理,并在完成所有结果后合并结果。
想象一下渲染3D动画和 渲染器是单线程的,但是 您可以指定开始和结束帧。 你有100帧渲染你 将启动4个实例,并指定 开始和结束帧范围0 - 25,26 - 50,51 - 75,76 - 100.然后你将所有的输出结合到你的 最终的电影文件。
答案 1 :(得分:7)
应用程序需要以多线程方式编写才能使用多个内核。没有办法让单线程应用程序使用多个核心。
答案 2 :(得分:4)
你可以看一下使用OpenMP或POSIX线程,我建议使用OpenMP,因为它有一个非常基本的结构,根据你的程序可以快速简单地实现。
答案 3 :(得分:3)
目前还没有用于将任意C程序转换为多线程程序的标准工具。因此,如果作为开发人员,您没有显式编写多线程代码,请不要指望您的程序一次使用多个核心,除非您调用使用线程编写的第三方库函数。
为了更好地使用CPU,你可以做的最多(如果相关)是将输入切分为N个块,并在每个块上多次运行程序,然后做一些事情来组合输入一旦它们全部完成。
答案 4 :(得分:2)
迂腐地说,您的应用程序已经在使用所有核心。如上所述,没有一个特定的核心分配给流程(除非您明确努力将流程绑定到一个特定的核心)。
该进程使用所有核心,但它依次使用它们 :它在一个核心上运行一点,然后在另一个核心上运行一点,依此类推。即平均而言,您的应用程序消耗的CPU时间均匀分布在系统中的所有核心上。由于在任何给定的时刻只使用一个内核,CPU负载永远不会超过25%的限制(您的系统显然有4个内核)。
如果要超过25%的限制,则必须能够同时使用两个或更多个 核心,这意味着至少部分代码必须并行运行 < / em>的。为此,必须专门编写应用程序以并行运行。普通的单线程应用程序本身永远不会这样做。