3

CPU被设计为在可以节省电力和保持凉爽的情况下进入低功耗模式,我想制作一个程序来防止这种情况发生。

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

我最初的想法是:

while(1);

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

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

while(1){usleep(1);}

有没有比仅仅猜测和检查睡眠值更科学的方法?无论如何,我认为每个目标都会有所不同。

4

3 回答 3

2

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

  1. 告诉 CPU/SoC 驱动程序禁用省电
  2. 锻炼你的 CPU/GPU/芯片组的所有单元和诸如此类的东西(这将是一项艰巨的任务,所以你可能最好使用 (1))
于 2012-10-23T16:00:14.967 回答
1

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

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

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

有关许多示例,请参见此线程

于 2012-10-23T16:03:50.383 回答
1

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

当涉及到正确加载你的 CPU 时,这取决于你想要做什么。触摸cpu的每个部分?最大用电量?这不是一个简单的问题,尤其是当您可能不知道问题实际上是什么时。

于 2012-10-23T16:03:55.093 回答