6

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

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

4

13 に答える 13

9

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

また、Windows(BSODのためにOSだと思います)がもう回復できない方法でRAMを破損する、ある種の非常に奇妙なメモリバグである可能性もあります(非常にありそうにありませんが、誰が知っていますか)。

私が考えることができる別の可能性は、ウィンドウを強制終了するスレッド実装にエラーがあることです。

しかし、最初に、オーバークロックの問題を見ていきます...

于 2009-03-07T12:38:08.033 に答える
5

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

多くのパフォーマンス調整を行ったという観点から、各スレッドが積極的に最適化されていない限り、サイクル削減の余地がたくさんある可能性があることを付け加えておきます。

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

  1. 車を速く走らせる
  2. 立ち寄りや寄り道を減らす

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

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

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

ただし、私はこれを頻繁に行います。私の方法は次のとおりです。 http://www.wikihow.com/Optimize-Your-Program%27s-Performance

于 2009-03-09T13:06:12.240 に答える
1

SIMD 演算の使用を検討してください。この場合、SSEが必要だと思います。多くの場合、それらは並列化よりも優れた最初のステップです。なぜなら、それらは正しいことが容易であり、ほとんどの線形代数タイプの演算にかなりのブーストを提供するからです。

SIMD を使用して取得したら、並列化を検討します。CPUもバタンと閉めているように聞こえるので、ビジー状態の待機の代わりにスリープを実行し、スレッドを適切にクリーンアップまたは再利用していることを確認してください。

于 2009-03-07T23:11:38.433 に答える
1

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

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

于 2009-03-07T12:48:47.183 に答える
0

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

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

于 2015-06-16T19:19:19.160 に答える
0

BSOD エラー コード (検索に役立つ) がないため、これを解決するのは少し難しくなります。

メモリを物理的に取り付け直してみるかもしれません ((取り外してドロップインします)。私と私が知っている他の何人かは、これが必要ないくつかのマシンで作業しました。たとえば、あるマシンで OS X をアップグレードしようとして、クラッシュし続けました...最後に、メモリを取り出して元に戻しましたが、すべて問題ありませんでした。

于 2009-03-07T17:14:13.160 に答える
0

スリープ(1); CPU使用率が半分になります。CPU を集中的に使用するアルゴリズムで同じ問題に遭遇しました。

于 2009-03-07T22:43:22.883 に答える
-1

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

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

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

于 2009-03-07T12:44:07.817 に答える