2

私はレイトレーサーを書いています。

最近、i5クアッドコアの追加コアを活用するために、プログラムにスレッドを追加しました。

奇妙な出来事の中で、アプリケーションのデバッグバージョンの実行速度は遅くなりましたが、最適化されたビルドは、スレッドを追加する前よりも速く実行されています。

デバッグビルドの場合は「-g-pg」フラグをgccに渡し、最適化ビルドの場合は「-O3」フラグを渡します。

ホストシステム:Ubuntu Linux10.4AMD64。

デバッグシンボルがプログラムにかなりのオーバーヘッドを追加することは知っていますが、相対的なパフォーマンスは常に維持されています。つまり、より高速なアルゴリズムは、デバッグビルドと最適化ビルドの両方で常に高速に実行されます。

なぜ私がこの振る舞いを見ているのか、何か考えはありますか?

デバッグバージョンは「-g3-pg」でコンパイルされます。「-O3」で最適化されたバージョン。

Optimized no threading:        0m4.864s
Optimized threading:           0m2.075s

Debug no threading:            0m30.351s
Debug threading:               0m39.860s
Debug threading after "strip": 0m39.767s

Debug no threading (no-pg):    0m10.428s
Debug threading (no-pg):       0m4.045s

これは、「-g3」が奇妙なパフォーマンスデルタのせいではなく、むしろ「-pg」スイッチであることを私に確信させます。「-pg」オプションは、スレッドのパフォーマンスを測定するための何らかのロックメカニズムを追加する可能性があります。

とにかくスレッド化されたアプリケーションでは「-pg」が壊れているので、削除します。

4

4 に答える 4

8

-pg旗なしで何が得られますか?これは、シンボルのデバッグではなく(コード生成に影響を与えません)、プロファイリング用です(影響を及ぼします)。

マルチスレッドプロセスでのプロファイリングには、マルチスレッドバージョンを遅くする追加のロックが必要であり、非マルチスレッドバージョンよりも遅くなる可能性があります。

于 2010-05-21T14:46:01.193 に答える
2

あなたはここで2つの異なることについて話している。デバッグシンボルとコンパイラの最適化。コンパイラが提供しなければならない最も強力な最適化設定を使用する場合、デバッグに役立つシンボルが失われる結果として使用します。

シンボルのデバッグが原因でアプリケーションの実行速度が低下することはありません。コンパイラーによる最適化が少ないため、アプリケーションの実行速度が低下します。

デバッグシンボルは、より多くのディスクスペースを占有するという事実を超えて「オーバーヘッド」にはなりません。最大最適化(-O3)でコンパイルされたコードは、デバッグシンボルを追加しないでください。これは、上記の記号が不要な場合に設定するフラグです。

デバッグシンボルが必要な場合は、コンパイラの最適化を失うことを犠牲にしてそれらを取得します。ただし、繰り返しになりますが、これは「オーバーヘッド」ではなく、コンパイラの最適化がないだけです。

于 2010-05-21T09:09:22.077 に答える
2

インストルメンテーション呼び出しを挿入するプロファイルコードは、あなたを傷つけるのに十分な関数になっていますか?
アセンブリ言語レベルでシングルステップを実行すると、すぐにわかります。

于 2010-05-21T15:40:41.683 に答える
0

マルチスレッドコードの実行時間は、gprofが期待するとおりに常に測定されるとは限りません。違いを確認するには、gprofに加えて他のタイマーを使用してコードの時間を計る必要があります。

私の例:2NUMAノードのINTEL Sandy Bridge(8コア+ 8コア)でLULESH CORALベンチマークを実行し、サイズは-s 50および20回-i、gcc 6.3.0、-O3でコンパイルします。

1つのスレッドが実行されている場合:-pgなしで〜3,7、それありで〜3,8ですが、gprof分析によると、コードは3,5でしか実行されていません。

16個のスレッドが実行されている場合:-pgなしで〜0,6、それありで〜0,8ですが、gprof分析によると、コードは〜4,5で実行されています...

太字の時間は、並列領域(メイン関数の開始と終了)の外側でgettimeofdayで測定されています。

したがって、アプリケーション時間を同じ方法で測定した場合、-pgを使用した場合と使用しない場合で同じspeeduoが表示される可能性があります。並行して間違っているのは、gprofメジャーだけです。LULESHopenmpバージョンではどちらの方法でも。

于 2018-02-05T21:37:28.600 に答える