質問

私はこれを読んだときにショックを受けました(から Opengl wiki):

Gltranslate、Glrotate、Glscale

これらのハードウェアは加速していますか?

いいえ、これを実行する既知のGPUはありません。ドライバーはCPUのマトリックスを計算し、GPUにアップロードします。

他のすべてのマトリックス操作は、CPUでも行われます:glpushmatrix、glpopmatrix、glloadidentity、glfrustum、glortho。

これが、これらの関数がGL 3.0で非推奨と見なされる理由です。独自の数学ライブラリを持ち、独自のマトリックスを作成し、マトリックスをシェーダーにアップロードする必要があります。

非常に、 非常に 長い間、OpenGL関数のほとんどがGPUを使用して計算を行うと思っていました。これが一般的な誤解であるかどうかはわかりませんが、しばらく考えた後、これは理にかなっています。古いOpenGL関数(2.x以降)は、状態スイッチが多すぎるため、実際のアプリケーションには実際には適していません。

これにより、おそらく多くのOpenGL関数がGPUをまったく使用していないことを実感できます。

だから、質問は次のとおりです。

どのOpenGL関数呼び出しがGPUを使用しませんか?

上記の質問に対する答えを知ることは、OpenGLでより良いプログラマーになるのに役立つと思います。あなたの洞察のいくつかを共有してください。

編集:

この質問は簡単に最適化レベルにつながることを知っています。それは良いことですが、それはこの質問の意図ではありません。

GPUを使用しない特定の一般的な実装(Ashleysbrainが示唆したように、Ashleysbrainが示唆しているように、おそらくOS依存性)でGL機能のセットを知っている場合、それが私が求めていることです!

もっともらしい最適化ガイドは後で来ます。このトピックについては、機能に焦点を当てましょう。

編集2:

このトピックは、マトリックス変換の仕組みに関するものではありません。がある 他の トピック そのために。

役に立ちましたか?

解決

少年、これは大きな主題です。

まず、私は明らかなことから始めます。CPUの関数(任意の関数)を呼び出しているので、少なくとも部分的にCPUで実行する必要があります。ですから、問題は、CPUでどれだけの作業が行われているか、GPUでどれだけの作業が行われているかです。

第二に、GPUが何らかのコマンドを実行するためには、CPUは渡すためにコマンドの説明を準備する必要があります。ここで最小限のセットは、何をすべきかを説明するコマンドトークンと、実行する操作のデータです。 CPUがGPUをトリガーしてコマンドを実行する方法もやや重要です。ほとんどの場合、これは高価であるため、CPUは頻繁にそれを行うのではなく、コマンドバッファーでコマンドをバッチすることは、GPUが処理するためのバッファー全体を単に送信します。

これはすべて、GPUへの仕事を渡すことは無料のエクササイズではないと言うことです。そのコストは、CPUで関数を実行するだけでピットする必要があります(私たちが何を話していても)。

一歩後退すると、なぜGPUが必要なのかを自問する必要があります。実際、純粋なCPU実装がジョブを行います(Ashleysbrainが言及しているように)。 GPUのパワーは、そのデザインから処理することから来ています。

  • 専門的なタスク(ラスター化、ブレンド、テクスチャフィルタリング、ブリットなど...)
  • CPUがシングルスレッド作業を処理するように設計されている場合、非常に並行したワークロード(DeadMGは彼の答えでそれを指しています)。

そして、それらは、チップに何が入るかを決定するために従うべき指導の原則です。 GPUで実行する必要があるものから利益を得ることができるものは何でも。他のものはCPUにあるべきです。

ちなみに、それは面白いです。 GLのいくつかの機能(ほとんどが非難の前)は、実際には明確に描写されていません。ディスプレイリストは、おそらくこのような機能の最良の例です。 GLディスプレイリストのセマンティクスが保持されている限り、各ドライバーはディスプレイリストストリームからGPU(通常はいくつかのコマンドバッファー形式)まで(通常はいくつかのコマンドバッファー形式)まで自由にプッシュできます(通常はいくつかのコマンドバッファー形式)。 難しい 一般に)。したがって、一部の実装は、ディスプレイリスト内の呼び出しの限られたサブセットを計算形式にプッシュすることのみを選択し、CPUの残りのコマンドストリームを単純に再生するだけです。

選択は、GPUで実行する価値があるかどうかが不明な別のものです。

最後に、一般に、API呼び出しとCPUまたはGPUの作業量との間にはほとんど相関関係がないと言わざるを得ません。状態設定APIは、ドライバーデータのどこかに構造を変更する傾向があります。その効果は、引き分け、またはそのようなものが呼び出されたときにのみ表示されます。

GL APIの多くはそのように機能します。その時点で、かどうかを尋ねます glEnable(GL_BLEND) CPUまたはGPUで実行されるのはかなり意味がありません。重要なのは、描画が呼び出されたときにGPUでブレンドが起こるかどうかです。だから、その意味で、 多くの GLエントリポイントはまったく加速されません。

また、データ転送について少し拡張することもできましたが、Danvilはそれに触れました。

小さな「S/Wパス」で終わります。歴史的に、GLは、ハードウェアの特別なケースが何であれ、仕様のために作業しなければなりませんでした。つまり、H/Wが特定のGL機能を処理していない場合、それをエミュレートするか、ソフトウェアに完全に実装する必要がありました。これには多くのケースがありますが、多くの人を襲ったのは、GLSLが現れ始めたときです。

GLSLシェーダーのコードサイズを推定する実用的な方法がなかったため、GLはシェーダーの長さを有効にすることになっていることが決定されました。含意はかなり明確でした。任意の長さのシェーダーを使用できるH/Wを実装するか、当時は現実的ではなく、/wシェーダーエミュレーションを実装します(または、一部のベンダーが選択したように、単に準拠することができません)。したがって、フラグメントシェーダーでこの条件をトリガーした場合、可能性がありました 全体 あなたのGLは、少なくともその抽選のために、GPUのアイドル状態を装着していたとしても、CPUで実行されました。

他のヒント

問題は、おそらく「どの機能が予期せず大量のCPU時間を食べるのか」であるべきです。

投影とビューのためにマトリックススタックを保持することは、GPUがCPUよりもうまく処理できるものではありません(それどころか...)。別の例は、シェーダーコンパイルです。なぜこれがGPUで実行する必要があるのですか?パーサー、コンパイラ、...、C ++コンパイラのような通常のCPUプログラムです。

たとえば、「危険な」関数呼び出しは潜在的にあります glReadPixels, 、データは、限られたバス上でホスト(= CPU)メモリ(= GPU)メモリにコピーできるためです。このカテゴリには、ような関数もあります glTexImage_D また glBufferData.

したがって、一般的に言えば、OpenGLコールがどれだけのCPU時間が食べられるかを知りたい場合は、その機能を理解してみてください。そして、ホストからデバイスへのデータをコピーして戻ってくるすべての機能に注意してください!

通常、操作が1人の場合、GPUで発生します。例は、実際の変換です - これは頂点ごとに1回行われます。一方、大規模な操作ごとに1回のみ発生した場合、変換マトリックスの作成など、CPU上にあります。

それは単なる一般的な答えであり、いくつかの機能は逆の方法で発生し、実装に依存します。ただし、通常、プログラマーであるあなたにとって重要ではありません。 GPUがゲームシムなどをしているときや堅実なスレッドモデルを持っているときにそれを十分に行うのに十分な時間をかけることを許可している限り、それをそれほど心配する必要はありません。

@Sending Datas to GPU:私が知る限り(Direct3Dのみ)、それはすべてシェーダー内で行われます、それがシェーダーの目的です。

Gltranslate、Glrotate、Glscaleは、現在のアクティブ変換マトリックスを変更します。もちろん、これはCPU操作です。モデルビューと投影行列は、レンダリングコマンドを発行するときにGPUが頂点を変換する方法を説明します。

したがって、Gltranslateを呼び出すことにより、まだ翻訳されていません。現在の投影とモデルビューマトリックスが掛けられる前に(MVP =投影 *モデルビュー)、この単一マトリックスがGPUにコピーされ、GPUが各頂点に対してマトリックス *頂点乗算(「T&L」)を行います。したがって、頂点の翻訳/スケーリング/投影 GPUによって行われました。

また、これらの機能をどこかに内側のループで使用しない場合、パフォーマンスを心配するべきではありません。 Gltranslateの結果 追加。 GlscaleとGlrotateはもう少し複雑です。

私のアドバイスは、線形代数についてもう少し学ぶべきだということです。これは、3D APIを使用するために不可欠です。

OpenGLのソフトウェアレンダリングされた実装があるので、 いいえ OpenGL関数はGPUで実行されます。また、ハードウェアで特定のレンダリング状態をサポートしないハードウェアもあるため、特定の状態を設定する場合は、ソフトウェアレンダリングに切り替えて、GPUには何も実行されません(そこにありますが)。したがって、「GPU加速機能」と「非GPU加速機能」には明確な区別がないと思います。

安全な側にいるために、可能な限りシンプルなものを保ちます。 Zバッファリングのようなververticesと基本的な機能を備えた簡単なレンダリングは 最も可能性が高い ハードウェアを加速するために、最小の状態の変更でそれに固執することができれば、ハードウェアを加速させる可能性が最も高くなります。これはまた、ハードウェアアクセラレーションレンダリングのパフォーマンスを最大化する方法でもあります。グラフィックカードは、1つの状態にとどまり、頂点を大量に計算することを好みます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top