我的程序只使用了 25% 的 CPU 功率

Posted

技术标签:

【中文标题】我的程序只使用了 25% 的 CPU 功率【英文标题】:My program use only 25% of cpu power 【发布时间】:2014-02-06 20:34:31 【问题描述】:

我的单线程程序仅使用 25% 的 CPU 和 2 核 (intel i5-3210M)。为什么不是 50%(一个核心)?程序正在使用 windows 7 64 的 macbook pro 上进行测试。我认为问题是超线程,因为这个程序只使用一个逻辑核心(25% 的 cpu 功率)。如何为我的程序提供更多的 CPU 能力? 这对我来说很重要,因为这个程序可以处理大量数据,完成计算大约需要 30 个小时。

【问题讨论】:

"我怎样才能给我的程序更多的 CPU 能力?"您可能需要分享有关您的程序的更多信息,例如什么语言,到目前为止你所拥有的工作示例 - 我们不需要你的所有逻辑,只需要了解它是如何工作的。 您的程序并没有真正使用 25% 的可用处理能力,因为您没有四个物理内核;你有两个物理核心,两个“虚拟”核心(由于启用了超线程)。因此,CPU 使用率估计会出现偏差;您使用的任何程序都可能 报告 25% 的 CPU 使用率,但实际上接近 50%(您使用的是 2 个内核中的 1 个,而不是 4 个内核中的 1 个)。启用超线程不会神奇地使您的计算潜力翻倍。出于兼容性原因,“超线程”显示为离散 CPU,而不是因为您可以执行双倍的工作负载。请记住这一点。 当然,我在一小部分模型数据上测试了我的程序。并且程序工作正常。现在我正在测试算法然后编码。我知道最好的方法是使用多线程,但这是另一个问题。 @Mike Strobel 谢谢你的回答!我知道“超线程不会神奇地使您的计算潜力翻倍”,但我认为它会将单线程应用程序的计算潜力降低两倍(降低到 25% 而不是 50%)。 @maxibystro 它没有那样做;这就是我的观点。这些使用估计是虚假的。他们将 25% 的每个分配给两个计算潜力相对较小的“虚拟”CPU。仅仅因为任务管理器这样说,您并没有使用 1/4 的计算潜力。你真的使用了接近 1/2 (50%)。忽略数字。如果它让您感觉更好,请禁用超线程,以便它您正在使用 50%,但这不会产生太大影响。 【参考方案1】:

正如您所说的 CPU(具有 4 个逻辑处理器),这是可以预料的。您可以搜索转换程序以使用多个线程的方法。我可以推荐你搜索“并行编程”、“并发编程”、“多线程”。如果您使用的是 MS VC++ PPL 库,那么它很容易使用。OpenMP 是一个更强大的工具,它也可以在 Linux 中使用。这个问题有很多方法和库,但你需要根据你的操作系统、编译器、环境、编程语言和你的问题来选择它。

但是,最简单的解决方案是在具有更好 CPU 的台式机上运行它,并尽可能快地获得结果。

【讨论】:

【参考方案2】:

此程序仅使用一个逻辑核心(25% 的 cpu 功率)。我怎样才能给我的程序更多的 CPU 能力? ...这个程序适用于大量数据...完成计算大约需要 30 小时。

将您的数据集分成(至少)4 个单独的部分。有了这么多数据,您需要考虑数据的索引,而不是将数据元素复制到 4 个单独的结构中。为数据的每个段创建一个单独的线程,并让该线程只处理一个段。您可能需要为线程设置处理器关联。

如果数据流或必须按顺序处理,请考虑排队元素进行处理,然后各个线程将出列并处理每个项目。当入队操作与处理项目相比相对较快并且可以由单个主线程完成时,这很有效,而每个出队/处理操作都更昂贵。

选择正确的线程数很棘手。现代 CPU 和操作系统旨在不时切换任务。这将始终是一项昂贵的操作,但调度程序会希望每隔一段时间做一些其他事情,即使您的进程可能看起来是最好的候选人。因此,您通常可以通过小范围的 CPU 过载来获得最佳吞吐量,这样您可能希望每个逻辑 CPU 有两个或三个线程。管理此问题的一种方法是使用 ThreadPool 对象。

【讨论】:

谢谢,但我知道如何使用多线程。只有我想知道的是为什么进程只使用 25% 的 cpu 功率(而不是 50%)。现在我知道一个物理核心可以 100% 工作,尽管任务管理器报告大约 25%。

以上是关于我的程序只使用了 25% 的 CPU 功率的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的进程只消耗 5% 的处理器功率?

是否有可能/容易确定程序正在使用多少功率?

Process.GetProcesses() 占用过多的 CPU 利用率

通过 Socket 传输视频帧

高 CPU 使用率 perf .net 应用程序

我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制