質問

多くの浮動小数点演算を使用して、CPUの負荷が高い計算を行うマルチスレッドプログラムを作成しました。具体的には、アニメーションシーケンスをフレームごとに比較するプログラムです。つまりアニメーションAのすべてのフレームについて、アニメーションAのフレームデータとアニメーションBのすべてのフレームを比較します。異なるアニメーションに対してこの集中的な操作を並行して実行するため、プログラムはABペア、BCペア、CAペアで作業できます平行。プログラムはQtConcurrentと" map"を使用しています。動きのあるコンテナを関数にマッピングする関数。 QtConcurrentはスレッドプールを管理してくれます。IntelQuad Coreプロセッサに取り組んでいるので、4つのスレッドが生成されます。

今、問題はプロセスがCPUを破壊することです。使用率は100%一定であり、プログラムを十分に大きなモーションセット(非ページ領域でのページフォールト)で実行すると、実際に死のブルースクリーンが表示されます。これは、コンピューターがオーバークロックされているためと思われます。しかし、これはプログラムのコーディング方法が原因である可能性がありますか?マシンの安定性をテストするために使用した非常に集中的なベンチマーキングツールは、PCをクラッシュさせることはありませんでした。プログラムがCPUを使用して負荷を減らす方法を制御する方法はありますか?それとも、自分の問題を誤解しているのでしょうか?

役に立ちましたか?

解決

ここには優れた回答がいくつかあります。

追加するのは、多くのパフォーマンスチューニングを行ったという観点からですが、各スレッドを積極的に最適化しない限り、サイクルを削減する余地が十分にある可能性があります。

長距離の自動レースを例にとると、次の2つの方法があります。

  1. 車を速くする
  2. ストップとサイドトリップを減らす

私の経験では、最初に書かれたほとんどのソフトウェアは、ソフトウェアが大きくなるにつれて特に最も直接的なルートをとるには程遠いです。

プログラムで無駄なサイクルを見つけるには、ケネス・コクランが言ったように、決して推測しません。問題であることを証明せずに何かを修正する場合、推測に投資しています。

パフォーマンスの問題を見つける一般的な方法は、プロファイラーを使用することです。

しかし、私はこれを何度も行います。私の方法は次のとおりです。 http: //www.wikihow.com/Optimize-Your-Program%27s-Performance

他のヒント

PCのオーバークロックは、あらゆる種類の奇妙な問題を引き起こす可能性があります。それが問題の根本的な原因であると疑われる場合、妥当な範囲で時間を計り、テストを再試行してください。

また、Windows(BSODのせいでOSが回復できない)でRAMが破損する、かなり奇妙なメモリバグの可能性もあります(ほとんどありませんが、誰が知っていますか)。

別の可能性として考えられるのは、ウィンドウを強制終了するスレッド実装でエラーが発生したことです。

しかし、最初はオーバークロックの問題を調べます...

説明した操作の種類は、すでに高度に並列化可能です。複数のジョブを実行すると、実際にパフォーマンスが低下する可能性があります 。これは、プロセッサのキャッシュのサイズが制限されており、同時に実行しようとするほど、各スレッドのキャッシュ共有が小さくなるためです。

GPUを使用して処理負荷の一部を吸収するオプションを検討することもできます。最新のGPUは、ほとんどの種類のビデオ変換に対して、同世代のCPUよりもはるかに効率的です。

  

これは、コンピューターがオーバークロックされているためと思われます。

それは間違いなく可能です。しばらく通常の速度に設定してみてください。

  

これは、プログラムをコーディングした方法のせいでしょうか?

ユーザーモードで実行されているプログラムがBSODを引き起こすことはほとんどありません。

推測では、3コアマシン(または100%の使用率で4)を実行していないと思います。コアよりも多くのスレッドを使用すると、並列化によりパフォーマンスが大幅に低下します。 CPUコアごとに1つのスレッドのみを作成します。何をするにしても、同時に異なるスレッドからデータにアクセスしないでください。ほとんどのマルチコアCPUのキャッシュロックアルゴリズムは、パフォーマンスを完全に破壊します。この場合、Lフレームアニメーションを処理するNコアCPUでは、フレーム0-(L / N)のスレッド1、フレーム(L / N)-(2 * L / N)のスレッド2を使用します。 ..フレームのスレッドN((N-1)* L / N)-L。キャッシュをスラッシングしないように、さまざまな組み合わせ(A-B、B-C、C-A)を順番に実行します。また、コーディングがより簡単になります。

補足として?このような実際の計算は100%CPUを使用する必要があります 、それはそれが可能な限り高速になることを意味します。

オーバークロックは、不安定性の最も可能性の高い原因です。 CPUを集中的に使用するアルゴリズムでは、CPUスラッシングが発生します。オーバークロックに耐えられないので、パフォーマンスのボトルネックを見つけるための優れたパフォーマンスプロファイラーを見つけるでしょう。問題がどこにあるか推測しないでください。パフォーマンスに実質的な影響を及ぼさない何かを最適化したり、パフォーマンスが低下したりする可能性さえあります。

ハードウェアのせいにするのはとても簡単です。別のシステムでプログラムを実行してみて、同じデータでどのようになるかを確認することをお勧めします。

おそらくバグがあります。

SIMD操作の使用を検討してください。この場合、SSEが必要だと思います。多くの場合、並列化よりも最初のステップの方が正しいのが簡単であり、ほとんどの線形代数タイプの演算をかなり強化します。

SIMDを使用して取得したら、並列化を検討します。 CPUを非難しているように聞こえるので、おそらく忙しい待機の代わりにいくつかのスリープを行い、スレッドを適切にクリーンアップまたは再利用していることを確認してください。

BSODエラーコードがないため(検索に便利)、これを支援するのは少し難しくなります。

メモリを物理的に取り付け直してみてください((取り出してドロップイン)。私と私が知っている他の人は、これが必要ないくつかのマシンで働いていました。マシンがクラッシュし続けました...最後にメモリを取り出して、再びドロップインしましたが、すべて正常でした。

Sleep(1); CPU使用率を半分に削減します。 CPUを集中的に使用するアルゴリズムで同じ問題が発生しました。

プロセッサに2つ以上のコアがある場合は、タスクマネージャーに移動してプロセスに移動し、プログラム名を右クリックして[ Set affinity ]をクリックし、使用するコアを少なくするようにプログラムを設定します。

その後、求めているアクションを実行するのに時間がかかりますが、CPU使用率が大幅に低下します。

死のブルースクリーンは、カーネルメモリ領域が破損したときに発生すると思います。 したがって、マルチスレッドを使用して並列操作を実行することは、この理由にはなりません。

それぞれが重い浮動小数点演算を実行する複数のスレッドを作成している場合、CPU使用率は間違いなく最大100%に達します。

各スレッドでいくらかのスリープを与えて、他のプロセスがチャンスを得ることができればより良いでしょう。 スレッドの優先度を下げることもできます。

Windowsプラットフォームの場合、何らかの作業の後に関数への呼び出しを1回実行して、CPUに他のプロセスに対してCPUを使用することを通知します。そのようなスリープ機能を呼び出す:

Slepp(0);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top