0

レンダリングCコードをC++で書き直しています。古いCコードは基本的に必要なものをすべて計算し、各フレームでレンダリングします。新しいC++コードは、代わりに必要なものを事前に計算し、それをリンクリストとして格納します。

現在、実際のレンダリング操作は、変換、色の変更、およびGLリストの呼び出しです。

リンクリストで操作を実行するのは非常に簡単ですが、結果のメソッド呼び出しは古いバージョンよりも時間がかかるように見えます(毎回すべてを計算します-もちろん、新しいバージョンが再計算されないことを確認しました)。

変なこと?古いバージョンよりも少ないOpenGL操作を実行します。しかし、それはさらに奇妙になります。操作の種類ごとにカウンターを追加し、メソッドの最後に古き良きprintfを追加すると、高速になりました。gprofと手動測定の両方でこれが確認されています。

また、両方の場合(トレースありとなし)でG ++によって生成されたアセンブリコードを確認するのも面倒でしたが、大きな変更はありません(これは私の最初の疑いでした)-唯一の違いは、カウンターに割り当てられたスタックワードがいくつかあることです、上記のカウンターを増やし、printfの準備をしてからジャンプします。

また、これは-O2と-O3の両方に当てはまります。UbuntuMaverickでgcc4.4.5とgprof2.20.51を使用しています。

私の質問は、何が起こっているのかということだと思います。私は何が間違っているのですか?私の測定値とgprofの両方から何かが外れていますか?

4

2 に答える 2

3

printfに時間を費やすことで、次のOpenGL呼び出しでのストールを回避できる可能性があります。

于 2011-06-05T15:35:55.737 に答える
1

これ以上の情報がなければ、ここで何が起こっているのかを知ることは困難ですが、ここにいくつかのヒントがあります。

  • OpenGL呼び出しは同じですか?いくつかのツールを使用して、発行された呼び出しを比較できます。実行される順序が異なる可能性があるため、状態が変化していないことを確認してください。
  • 実行時にプロファイラーを使用しようとしましたか?多くのオブジェクトがある場合、リストをループしているときにポインターを追跡するという単純な事実により、キャッシュミスが発生する可能性があります。
  • CPU側またはGPU側のいずれかで、特定のボトルネックを特定しましたか?

これが、何がうまくいかないかについての私自身の推測です。GPUに送信する呼び出しは、完了するまでに時間がかかります。前のコードは、CPU操作とGPU呼び出しを混合することにより、CPUとGPUを並行して動作させました。それどころか、新しいコードは、GPUがアイドリングしている間に最初にCPUに多くのことを計算させ、次にCPUに何もすることがない間に、実行するすべての作業をGPUに供給します。

于 2011-06-06T09:44:49.717 に答える