2011-06-23 12 views
3

私は何らかの理由で待機するようなものを使わずに、毎秒forループを実行するプログラムをC++で作成しました。これは一貫してCPUの2〜10%を使用します。プログラムをより複雑にすることなく、より多くのCPUを使用し、より多くの計算を行うように強制する方法はありますか?さらに、私はWindowsコンピュータ上でC :: Bを使ってコンパイルします。基本的には、CPUの使用量を増やすことでプログラムを高速化する方法があるかどうかを尋ねています。C++プログラムのCPU使用量を増やす

+1

空のループを追加しますか? – Flimzy

+1

なぜ私はフォークボムを読んでいるのですか?.. – karlphillip

+0

@karlphillip、私はフォーク爆弾を作っていたのですが、CPU消費はどうですか?私はそうではありませんが、もし私がそうであれば、私のプロセスはより少ないパワーを必要とします。私のプログラムは数字を生成するはずだから頼んでいる。また、私は何のために-1を得ましたか?私のゲストは目的に固有のものであり、品質の向上には非常に有用です。解決策を説明するものは何も見つかりませんでした。 – TimeCoder

答えて

2

アプリケーションに電源があると仮定すると(PROCESS_SET_INFORMATIONアクセス権)、SetPriorityClassを使用すると、他のすべてのプロセスの通常の損害につながります。

あなたは(私は強くあなたはおそらくはこの1つ打撃を与えるべきではないことを示唆している)ABOVE_NORMAL_PRIORITY_CLASS(最初にこれを試してみてください)、HIGH_PRIORITY_CLASS(これには充分に注意してください)またはREALTIME_PRIORITY_CLASSを行くことができます。

より高い優先度を試してもそれでもクロックがかなり低い場合は、出力ファイルにデータを書き込んでいる場合など、CPUにバインドされていない可能性があります。その場合、おそらくへの道を見つける必要があります。自分自身をCPUにバインドさせてください。

このようにすることは必要ではない(または望ましいこともあります)ことに留意してください。もしあなたが他のスレッドよりも高い優先順位で走っていて、まだ多くのCPUを吸い上げていないのであれば、それはおそらくWindowsが必要と思わない(正当な理由で)必要があるからです。

1

スレッドを作成すると、スレッドに高い優先度を与える&が1つの方法である可能性があります。

+0

優先度が高い場合は10%を使用します。 – TimeCoder

4

システムから追加のリソースを要求することは、プログラムの権利または責任ではありません。それはリソーススケジューラとしてのOSの仕事です。

OSが適合するよりも多くのCPU時間を使用する必要がある場合は、プラットフォーム依存のAPIを使用してOSから要求する必要があります。この場合、それはSetPriorityClassまたはSetThreadPriorityの行に沿ったものと思われます。

5

これは、CPUの10%しか使用しない理由によって異なります。マルチCPUマシンを使用していて、プログラムが1つのCPUしか使用していない場合は、その追加の馬力を使用するためにコードに並行性を導入する必要があります。

何か他のもの(ディスクとの間でデータをコピーするなど)によって制限されている場合、CPUに集中する必要はありません。ボトルネックが何であれ、それに集中する必要があります。おそらく、リミッタはディスクから読み込みます。これは、より良いキャッシングメカニズムを使用して改善することができます。

0

一部のプロファイラは、コードのボトルネックがどこにあるかを非常にうまく示しています。たとえば、CodeAnalyst(AMDチップの場合のみ)にはサイクルごとの命令があります。私は確かにインテルのプロファイラーは似ています。

ビリー・オニールが言っているように、CPUの10%でスタックされている8コアでの走りが正しいとすれば。これがあなたの問題なら、WindowsのmsvC++は標準アルゴリズムのパラレルモード(parallel patterns library)を持っています。これは、あなたのループをC++の方法で書いていれば、並列化を無料で行うことができます(ループがスレッドセーフであることを確認する責任があります)。私はmsvcバージョンを使用していませんが、gnu::__parallel_for_eachなどは扱いになります。

関連する問題