1

openmp を使用して c でマルチスレッド プログラムを作成しました。このプログラムには、約 400 の並列化された関数呼び出しがあります。これらの関数には、いくつかのデバッグ情報を出力するためのいくつかの printf 関数があります。これらの printf 関数を削除すると、プログラムの実行時間が 1.2 秒から 1.6 秒に増加することがわかりました。私はこれらの現象を一貫して観察しています。これはどのように可能ですか?

4

1 に答える 1

2

並列関数呼び出しは何らかの形で相互に依存していますか? これを 400 コアで実行する可能性は低いため、さまざまなスレッドがスケジュールされるため、コンテキスト スイッチでオーバーヘッドが発生します。printf が (stdout への書き込み中に) CPU を解放する可能性があり、CPU を解放するのに適した場所である (つまり、その時点で他のスレッドをブロックしていない) 可能性があります。

私は、時折ディスクへの同期書き込みを行うマルチプロセス アプリケーションに取り組んでいます。私が見てきたことの 1 つは、すべての同期書き込みをなくすとそのプロセスの速度が向上するということですが、その代償としてシステム全体がスムーズに動作しなくなります。代わりに、セマフォ ロックを保持している間は書き込みを避けるようにします。

同期書き込みが完了するのを待ってプロセスが常に一時停止していて、それが他に何もブロックしていない場合、すべてが非常に低いレイテンシーで実行される可能性があり、システム全体がかなり高速になります。

于 2012-07-18T11:59:27.567 に答える