こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラム上のCPU稼働率低減に関して

C++の簡易なプログラムを長時間実行しっぱなしにしたいのですが、
CPUが常に100%の稼働率になってしまうため、PCが熱暴走してしまうのではないかと心配しております。
対策としてはPCの冷却を徹底することも考えられるのですが、
プログラムを工夫して(例えばメモリの使用領域を設定変更する)CPUの負担を軽減することは可能でしょうか?
プログラムの内容は[1000][300000]の配列を宣言し、
1秒間に20回、配列の中身を0~1000まで永遠に書き換え、
その内容をグラフィックで示すものです。

メモリの使用量は膨大になることは覚悟していたのですが、
CPUの稼働率が終始100%になってしまうのは、困っております。

対策をご教授いただけると助かります。
もしくは説明不足な点がありましたらお申し付けください。

投稿日時 - 2008-01-01 21:52:14

QNo.3643254

困ってます

質問者が選んだベストアンサー

単純な処理なのでCPUが100%になるのは当たり前でしょう。
普通のアプリがCPUが100%にならない理由は、
・ファイルの読み書き待ちでCPUが空いている。
・メッセージ待ちでWAITしている。
などなど何らかの理由でCPUに空きが出来るからです。
どうしても100%にしたく無かったら、sleepするのが定番です。その分処理時間は長くなりますので秒間20回は無理でしょうが。これは仕方ありません。この問題はトレードオフなので、どちらかしか選べないと思います。

効果があるかは不明ですが、配列をランダムにアクセスしているなら、シーケンシャルにアクセスすればCPUの仕組みとしては早くなるはずです。

投稿日時 - 2008-01-05 16:36:49

お礼

ありがとうございます。
当方のプログラムは
・メッセージ待ちでWAITしている。
状態でした。

さっそくSleepを使って負荷を低減させてみます。
配列もとりあえず宣言しただけですので、シーケンシャルに
アクセスするように改良します。

大変助かりました。

投稿日時 - 2008-01-06 01:00:29

ANo.5

このQ&Aは役に立ちましたか?

23人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

1秒間に20回と書かれていますがこれはどのようにして実現されていますか?

ビジーループまたはsleepなどよる待ち処理が考えられますが、CPUが100%稼動ということですので、以下の状況が考えられます。

ビジーループの場合:
CPUの処理能力は足りているがビジーループで100%使い切っている
この場合はsleepを使用する方法で待つことでCPU使用率は下がります。

sleepなどによる待ち処理:
CPUの処理能力が足りておらずまったくsleepせず処理しっぱなしになっている。
この場合は処理量を減らす(1秒間に10回などにする)ことでCPUの処理能力を上回らないようにすれば、CPU使用率は下がります。

蛇足ですが、本来はCPUに100%の処理を長時間行わせても熱暴走しない状態で使用するのが通常です。もし長時間の高負荷で熱暴走するのであれば、一瞬の高負荷でも熱暴走する可能性があるので、熱対策をするべきです。

投稿日時 - 2008-01-05 13:26:55

お礼

すみません。
ビジーループの状態にしておりました。

グラフィックへの出力待ちの段階で、
間髪入れずにビジーループをかけておりました。
おそらくここの処理速度には余裕がありますので、
早速対策してみます。

ありがとうございます。

投稿日時 - 2008-01-06 01:03:02

ANo.3

>ANo.2

1千回とか1万回に1度、ディスクに書き込むのに作業負荷を
考える必要はありません。

投稿日時 - 2008-01-03 15:13:34

補足

すみません。説明不足でした。
書き換えは1000まで行くとまた0から
上書きされますので、メモリ使用量の絶対量は
かわりません。
もしもっと処理速度の速い配列のアドレスの設定方法や、
その他対策ご存知でしたらご教授願います。

投稿日時 - 2008-01-04 00:55:05

ANo.2

途中結果を保存しながら計算するという方法はいかがでしょうか。
プログラムを停止しても、途中結果を元にそこから再開できるようにプログラムしておくといいですね。

普通のパソコンで熱暴走は考えにくいと思います。

投稿日時 - 2008-01-02 09:36:36

補足

途中経過を保存するというのは、
私の素人感覚では、保存の方が、作業負荷が高く、
余計にPCへの負担がおおきくなるような気がしてしまうのですが、
そんなことはないのでしょうか?

投稿日時 - 2008-01-03 12:06:33

ANo.1

C++をお使いであれば、マルチスレッドにして、適当にSleepすれば回避できるのではないでしょうか?

C++ ワーカースレッド Thread.Sleep GetMessage PeekMessage

などでググってみられるとサンプルが転がっていると思います。
現役のPGではないので細かなアドバイスができずに恐縮ですが、ヒントになれば幸いです。

投稿日時 - 2008-01-02 02:10:49

補足

ワーカースレッド調べました。
当方、マイコン制御では何度か使用したことが
あるのですが、PCの場合はスレッドで実行するというのは、
10ある処理速度を単純に5:5にしてしまうなどと、
要は限りある処理能力を分けて使うというものでは
ないのでしょうか?
もしそうであると、現在でもCPUがフル稼働しておりますので、
処理効率が変わらないように思えてしまうのですが、、

無知で申し訳ないです。

投稿日時 - 2008-01-04 12:47:30

お礼

ありがとうございます。
まだワーカースレッドを理解できておりませんが、
挑戦してみたいと思います。

投稿日時 - 2008-01-03 12:05:54

あなたにオススメの質問