如何从C程序获取100%CPU使用率


79

这是一个非常有趣的问题,所以让我开始讨论。我在国家计算机博物馆工作,我们刚刚设法让一台Cray Y-MP EL超级计算机从1992年开始运行,我们真的很想知道它能走多快!

我们认为最好的方法是编写一个简单的C程序,该程序将计算质数并显示执行此操作需要多长时间,然后在快速的现代台式PC上运行该程序并比较结果。

我们很快想出了以下代码来计算质数:

在运行Ubuntu(Cray运行UNICOS)的双核笔记本电脑上,它运行良好,获得100%的CPU使用率,耗时约10分钟。当我回到家时,我决定在我的六核现代游戏PC上进行尝试,这是我们收到的第一个问题。

我首先将代码修改为可以在Windows上运行,因为那是游戏PC所使用的,但是很遗憾地发现该过程仅获得CPU功率的15%。我认为Windows一定是Windows,因此我启动了Ubuntu的Live CD,以为Ubuntu可以像以前在笔记本电脑上那样充分发挥潜力,使该进程得以充分运行。

但是我只有5%的使用率!所以我的问题是,如何使该程序适应Windows 7或实时Linux上的游戏机上100%的CPU使用率?另一个很棒但不是必须的事情是,如果最终产品可以是一个可以轻松分发并在Windows计算机上运行的.exe。

非常感谢!

PS当然,该程序实际上无法与Crays 8专业处理器配合使用,这是另一个问题……如果您了解有关优化代码以在90年代的Cray超级计算机上工作的任何知识,我们也将大声疾呼!


8
我不敢相信没有unicos标签。;)
Edward Thomson 2012年

32
奇怪的是,这个单线程程序在DUAL CORE处理器上占用了100%的CPU使用率)))
mikithskegg

24
我是唯一一个根本不觉得这个问题有趣的人吗?来看一个,在n核计算机上运行一个单线程程序,并问为什么它使用1 / n的cpu只是...没关系,我只是
投票

16
@drhirsch好吧,这个问题表明了研究工作。我为此+1,即使OP缺少有关多核计算的基本知识。
Mysticial

9
@drhirsch网站上有很多有趣的问题。但是,有趣与否是主观的。他可能缺少基本面,这不是主观的。就像Mystical所说的那样,它确实显示了研究成果,并且不像看起来那样容易回答。
卡尔

Answers:


81

如果要100%CPU,则需要使用多个内核。为此,您需要多个线程。

这是使用OpenMP的并行版本:

我必须增加限制,1000000以使其在我的计算机上花费超过1秒的时间。

输出:

这台机器在29.753秒内计算了1000000以下的所有78498个质数

这是您的100%CPU:

在此处输入图片说明


1
@ cha0site是的,我主要回答了有关游戏机的问题。肯定有更多有趣的方式固定CPU。我做过的最臭名昭著的基准测试之一就是我对这个问题的回答-这使我测试的4台机器中的2台过热了。
Mysticial

1
@Mystical Offtopic:您正在运行什么硬件?我的16核AMD @ 3.2Ghz的做到了92数秒
包人

1
@Owen:他拥有Core i7 2600K ...我很嫉妒。
cha0site 2012年

19
啊!太...太多...粉红色!
Mateen Ulhaq

2
@MohammadFadin en.wikipedia.org/wiki/Parallel_computing基本上,你需要能够处理多任务并行能够利用多核计算机。
Mysticial

24

您在多核计算机上运行一个进程-因此它仅在一个核上运行。

该解决方案非常简单,因为您只是尝试固定处理器-如果您有N个内核,请运行程序N次(当然,并行运行)。

这是一些可以NUM_OF_CORES并行运行程序时间的代码。它使用的是POSIXy代码,fork因此您应该在Linux下运行它。如果我所读到的有关Cray的信息是正确的,则移植此代码可能比其他答案中的OpenMP代码更容易。

输出量


有点像需要运行Prime95时,它有多个实例...当然,有一种方法可以使一个进程使用多个内核吗?就像哈希破解程序一样。
包人

嗯,一个进程可以使用线程来进行多处理,但是我认为这不是您的意思,因为在这种情况下,线程几乎是一个单独的进程。我们真正在这里谈论的是“执行负责人”,无论是线程还是进程。因此,没有,没有办法使单线程程序在多个内核上运行,您必须重写它。有时真的很难。有时实际上是不可能的。
cha0site 2012年

好吧,我想这并不会像使Cray程序正常运行那样困难。考虑到我对此很陌生(是什么让我失望了:P),哪里是一个不错的起点?
包人

@Owen:好吧,UNICOS看起来它和Unix有点相似(维基百科还是这么认为的),所以它大概有fork()。我认为您应该去学习如何使用它。
cha0site 2012年

2
哦!有了示例,您就+1了。:)
Mysticial

7

我们真的很想看看它能走多快!

您生成质数的算法效率很低。将其与Primegen在奔腾II-350上仅用8秒钟即可生成高达50000000534的灌注量的Primegen进行比较。

要轻松消耗所有CPU,您可以解决一个令人尴尬的并行问题,例如,计算Mandelbrot集或使用遗传编程在多个线程(进程)中绘制Mona Lisa

另一种方法是采用Cray超级计算机的现有基准测试程序,并将其移植到现代PC上。


该算法效率不高没关系,因为目标不是实际计算素数,而是执行一般困难的任务,并看它比现代台式机好多少。一个高效的算法只会使这种比较变得更加困难,并且如果效果如此之好甚至有目的地利用现代CPU功能/怪癖,甚至可能破坏结果。
Numeron

5

十六进制核心处理器获得15%的收益的原因是因为您的代码在100%的情况下使用1个核心。100/6 = 16.67%,使用移动平均和流程计划(您的流程将在正常优先级下运行)可以很容易地报告为15%。

因此,为了使用100%cpu,您将需要使用CPU的所有内核-为六核内核CPU启动6个并行执行代码路径,并且可以将此规模扩展到Cray计算机拥有的许多处理器:)


这样做的问题是,如何才能清楚地了解每台机器的速度?另外,克雷有“向量处理器”很明显,因此它需要比这更负荷工作,得到它的正常运行
包人

不知道 调度过程中可能存在差异。
卡尔

2

也要非常清楚如何加载CPU。一个CPU可以完成许多不同的任务,尽管许多任务都被报告为“ 100%加载CPU”,但它们各自可能占用100%的CPU不同部分。换句话说,很难比较两个不同的CPU的性能,尤其是两个不同的CPU体系结构。执行任务A可能会使一个CPU优先于另一个CPU,而执行任务B则很容易采用另一种方法(因为两个CPU内部可能具有不同的资源,并且执行的代码可能非常不同)。

这就是为什么软件与使硬件达到最佳性能同样重要的原因。对于“超级计算机”也确实如此。

一种衡量CPU性能的指标可能是每秒的指令数,但是在不同的CPU架构上,指令的创建就不同了。另一个指标可能是缓存IO性能,但缓存基础架构也不相等。然后,度量可能是所使用的每瓦特指令数,因为功率和功耗通常是设计集群计算机时的限制因素。

因此,您的第一个问题应该是:哪个性能参数对您很重要?您要测量什么?如果要查看哪台机器在Quake 4中获得最高的FPS,答案很简单;您的游戏设备将会运行,因为Cray根本无法运行该程序;-)

欢呼声,斯蒂恩


2

TLDR;公认的答案既低效又不兼容。关注算法的速度提高了100倍

MAC上可用的gcc编译器无法运行omp。我必须安装llvm (brew install llvm )。但是我没有看到运行OMP版本时CPU空闲状态会下降

这是运行OMP版本时的屏幕截图。 在此处输入图片说明

另外,我使用了基本的POSIX线程,该线程可以使用任何c编译器运行nos of thread= no of cores= 4(MacBook Pro,2.3 GHz Intel Core i5)时,几乎消耗了整个CPU。这是程序-

请注意整个CPU是如何用完的- 在此处输入图片说明

PS-如果增加线程数,则实际CPU使用率会下降(尝试使线程数=20。),因为系统在上下文切换中使用的时间比实际计算要多。

顺便说一句,我的机器不如@mystical强大(接受的答案)。但是我的带有基本POSIX线程的版本比OMP更快。结果是-

在此处输入图片说明

PS在不到一秒钟的时间内完成处理,将线程负载增加到250万以查看CPU使用率。


0

尝试使用例如OpenMP并行化程序。这是组成并行程序的非常简单有效的框架。


0

为了快速改善一个内核,请删除系统调用以减少上下文切换。删除这些行:

第一个特别糟糕,因为它每次迭代都会产生一个新进程。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.