3

CPU は、電力を節約して冷却を維持するために、可能な限り低電力モードに移行するように設計されています。そうならないようにプログラムを作成したいと思います。

私はいくつかの異なる組み込みプラットフォーム (Freescale 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 を最大限に使用することはありません。100% CPU を使用しようとする C プログラムには、多くのオプションがあります。それらのほとんどは、数学ベースのアプリケーションと混合された複数のスレッドを使用します。

いくつかの例については、このスレッドを参照してください。

于 2012-10-23T16:03:50.383 に答える
1

しばらく(1); loop は、オペレーティング システムが割り込みの処理やデーモンの実行などの他の処理を行っていないときに常に実行されている可能性があります。あなたが抱えている問題は、プログラムが実際に実行されている時間を top が実際に示すのではなく、内部のスケジューリング計算に使用されるかなり粗い見積もりであることです。一部のシステムでは、計算が少しずれているため、CPU 使用率が 100% を超えることがあります。

CPU を適切にロードすることになると、何をしたいかによって異なります。CPUのすべての部分に触れますか?最大電力使用量? 特に質問が実際に何であるかわからない場合は特に、簡単な質問ではありません。

于 2012-10-23T16:03:55.093 に答える