【问题标题】:How to use all the cores in Windows 7?如何使用 Windows 7 中的所有内核?
【发布时间】:2010-06-16 17:29:57
【问题描述】:

我不确定这属于 Stackoverflow 还是超级用户,但我想我会在这里问。

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

有没有办法让应用程序使用所有四个内核(笔记本电脑有 Core i5)而不是一个?我假设任务管理器报告 25%,因为只有一个内核分配给程序。

【问题讨论】:

    标签: c windows-7 multicore


    【解决方案1】:

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

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

    【讨论】:

    • +1 因为这肯定适用于某些情况。一个经典案例是对大数据文件中的顺序数据进行操作。将文件拆分为 4 个较小的文件,运行程序 4 次,您在 15 分钟内完成,而不是一个小时。
    • 是的!聪明的!我总是忘记这一点。
    【解决方案2】:

    应用程序需要以多线程方式编写才能使用多个内核。没有办法让单线程应用程序使用多个内核。

    【讨论】:

    • 永远不要说永远,拆分输入几乎总是可能的
    【解决方案3】:

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

    【讨论】:

    • 这需要重写。 :)
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      学究式地说,您的应用程序已经在使用所有内核。正如您在上面所说的那样,没有为流程分配一个特定的核心(除非您明确努力将您的流程与一个特定的核心联系起来)。

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

      如果您想突破 25% 的限制,您必须能够同时使用两个或更多内核,这意味着至少有一些代码必须并行运行。为此,必须专门编写应用程序以并行运行。一个普通的单线程应用程序自己永远不会这样做。

      【讨论】:

      • 这并不完全正确。此编译器/虚拟机 (sourceforge.net/apps/mediawiki/ildjit/index.php?title=Main_Page) 能够并行化(单线程)CLI 代码(也包括其他语言)。并且操作系统试图在同一个内核上维护同一个应用程序以避免缓存刷新。
      • Windows 7 非常努力地尽可能长时间地保持进程与 CPU 的亲和,调度程序与 XP 和之前 NT 中显示的退化行为完全不同
      • 是的,但老实说,这是很多话,并不能真正增加回答问题的内容。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2011-06-11
      • 2020-01-07
      • 1970-01-01
      • 2011-08-29
      • 2016-05-31
      • 1970-01-01
      相关资源
      最近更新 更多