如何编写测试应用程序以完全加载CPU?

时间:2012-10-23 15:54:51

标签: c linux benchmarking cpu-usage

只要能够节省电力并保持冷却,CPU就会进入低功耗模式,我想制定一个程序来防止这种情况发生。

我正在开发一些不同的嵌入式平台(飞思卡尔Coldfire 8052,TI Sitara AM3359,可能是管道系统中的其他几个),所以我想制作一个能够让CPU满负荷进行基准测试的应用程序。我想写自己的,因为交叉编译然后为每个目标寻找解决方案会更容易。

我最初的想法只是:

while(1);

问题1:
但在我过度简化这个? top显示该程序占用了大约99.4%的CPU使用率,所以我猜它正在运行,但似乎不应该这么简单。 :)任何人都知道是否应该有更多的东西?

问题2:
如果我想扩展它以执行不同的负载(例如,50%,75%或其他),我该怎么办?我通过以下方式获得了18%~20%的CPU使用率:

while(1){usleep(1);}

是否有一种更科学的方式,而不仅仅是猜测和检查睡眠值?我认为无论如何,每个目标都会有所不同。

3 个答案:

答案 0 :(得分:2)

while(1);会占用你所有的CPU周期,但不会占用CPU的大部分(更不用说GPU了)。如果不使用,大多数现代CPU都能够有选择地关闭各个执行单元:防止它的唯一方法是:

  1. 告诉CPU / SoC驱动程序禁用省电功能
  2. 锻炼你的CPU / GPU /芯片组的所有单位以及诸如此类的东西(这将是一项难以实现的任务,所以你可能最好用(1))

答案 1 :(得分:1)

所以我会尝试将此作为答案发布。如果您查看usleep的规范,您会注意到以下行:

  

usleep()函数将导致调用线程暂停执行...

这意味着18%~20%的CPU使用率实际上是在上下文切换期间花费的时间。代码中的while(1)将使用CPU周期,因为它已被调度,但它不会将CPU用于其全部功能。 C程序有很多选项可以尝试使用100%的CPU。他们中的大多数使用多个线程与基于数学的应用程序混合。

有关示例,请参阅此thread

答案 2 :(得分:1)

一会儿(1); loop很可能一直在运行,操作系统没有做其他事情,比如处理中断或运行守护进程。你遇到的问题是top实际上并没有显示程序实际运行的时间,而是用于内部调度计算的粗略估计。在某些系统上,你最终可能会因为数学有点偏离而超过100%的CPU使用率。

在正确加载cpu时,这取决于你想做什么。触摸cpu的每个部分?最大用电量?这不是一个简单的问题,特别是当你可能不知道问题究竟是什么时。