web-dev-qa-db-ja.com

プロセスを同時に複数回実行する

画像を入力として受け取り、ポーズ推定、色検出、写真を実行するopencvライブラリを備えたc ++プログラムがあります。このプログラムをコマンドラインから実行すると、完了するまでに約4〜5秒かかります。約60%CPUかかります。 2つの異なるコマンドラインウィンドウから同じプログラムを同時に実行しようとすると、プロセスが完了するまでに約10〜15秒かかり、両方のプロセスがほぼ同時に終了します。 CPU使用率は最大100%に達します。

Exec()コマンドを使用してこのc ++ exeを呼び出すWebサイトがあります。そのため、2人のユーザーが画像をアップロードして実行しようとすると、上記のコマンドラインで説明したように時間がかかります。これは、c ++プログラムに高い計算が含まれ、CPUが100%に達すると、速度が低下するためですか?しかし、CPUが100%に達することは、コンピューターがプログラムを実行するためにその全容量を使用しているため、悪いことではないことを読みました。これは私のc ++プログラムによるものですか、それともサーバー(コンピューター)の設定と関係がありますか?コマンドラインから実行しようとすると速度が低下するため、これはおそらくApacheサーバーの問題ではありません。クアッドコアプロセッサを使用していますが、同じプロセスを同時に実行しようとすると、4つのCPUすべてが100%に達するので、すべてのプロセッサに分散していると思います。だから私はもう少し質問があります:

1)これは私のc ++コードでマルチスレッドを使用することで解決できますか?今のところ私はそれを使用していませんが、マルチスレッドはc ++コードをより計算コストが高くし、CPU使用率を増加させます(これが問題である場合)。

2)速度が低下する理由は何ですか?プロセスはキューにあり、各プロセスは特定の時間だけ実行され、2つのプロセスを切り替えますか?

3)これが高計算を伴うためである場合、いくつかの関数をopencv gpu関数に変更すると役立ちますか?

4)この問題を解決する方法はありますか?アイデアやヒントはありますか?

1つのプロセスを実行し、同じプロセスを2回同時に実行したときに、topの結果を挿入しました。

バージョン5はプロセスであり、一度実行します enter image description here 同時に実行されている2つのVersion5 enter image description here

2
user1583647

その理由は、キャッシュのトラッシングである可能性があります。 CPU負荷は、単なる計算ではありません。これはCPUアクティビティです。つまり、スリープとI/Oの待機を除くすべてです。

単一のプロセスが実行されている場合、おそらくほとんどのCPUキャッシュを使用できます。 2番目のプロセスを開始すると、カーネルは2つのプロセス間でコードを共有するのに十分賢いかもしれませんが、データ(のほとんど)を共有しません。

したがって、コードの関連する(全体的なCPUアクティビティに)部分が高い局所性を持つデータを使用し、このデータの量がキャッシュサイズの半分を超える場合、両方のプロセスは常に互いのデータをキャッシュからスローします。つまり平均メモリ遅延は大幅に増加します。メモリアクセスはCPU負荷の一部です。

アクセスのどのシェアがどのキャッシュレベルまたはRAMによって提供されているかを確認する可能性はありません。

もう1つの可能性は、プロセスが大量のメモリを必要とするため、スワッピング(「外部キャッシュでさえ...」)が問題になる可能性があります。しかし、この場合、それは私にはそれほどありそうにないようです。

2
Hauke Laging