18

Open GLShaderLanguageの速度sin()とその速度に関する情報に興味があります。cos()

GLSL仕様書には、次のことが示されています。

組み込み関数は、基本的に3つのカテゴリに分類されます。

  • ..。
  • ..。
  • これらは、グラフィックハードウェアがいずれかの時点で加速する可能性が高い操作を表しています。三角関数はこのカテゴリに分類されます。

編集:

指摘されているように、個々の操作のクロックサイクルを数えることは、パフォーマンスストーリー全体を実際に伝えるものではsin()ありcos()ません。

ですから、私の質問を明確にするために、私が本当に興味を持っているのは、最適化して一般的なケースsin()を要求する価値があるかどうかです。cos()

たとえば、私のアプリケーションでは、引数がであることが非常に一般的です0。したがって、このようなことは理にかなっています:

float sina, cosa;

if ( rotation == 0 )
{
   sina = 0;
   cosa = 1;
}
else
{
   sina = sin( rotation );
   cosa = cos( rotation );
}

それとも、コンパイラGLSLまたは実装は私のためにそのような最適化を処理しますか?sin()cos()

4

6 に答える 6

20

たとえば、私のアプリケーションでは、引数が0になるのが非常に一般的です。したがって、次のような意味があります。

いいえ。

コンパイラは2つのことのいずれかを実行します。

  1. 実際の条件分岐を発行します。可能な限り最良のケースでは、0がローカルでコヒーレントな値である場合(シェーダーのグループが0またはゼロ以外にヒットすることが多いなど)、パフォーマンスが向上する可能性があります。
  2. 条件の両側を評価し、正しい方の結果のみを保存します。その場合、あなたは何も得ていません。

一般に、このような小さなパフォーマンスを踊るために条件付きロジックを使用することはお勧めできません。それは価値があるために本当に大きい必要があります、discardまたは何かのように。

また、浮動小数点の等価性は機能しない可能性があることに注意してください。正確に0.0を含むユニフォームまたは頂点属性を実際にシェーダーに渡さない限り、そうではありません。0とゼロ以外の間を補間しても、フラグメントに対して正確に0が生成されることはありません。

于 2012-04-14T19:46:40.750 に答える
9

これは良い質問です。私もこれが気になりました。

グーグルのリンクによるcossin、2005年頃から主流のカードではシングルサイクルです。

于 2012-08-06T06:23:18.267 に答える
5

sinこれを自分でテストする必要がありますが、シェーダーでの分岐は、またはcos計算よりもはるかにコストがかかると確信しています。GLSLコンパイラは、シェーダーの最適化に非常に優れています。これを心配するのは時期尚早の最適化です。後で、プログラム全体を通して、シェーダーがボトルネックであることがわかった場合は、これを最適化することを心配することができます。

特定のプラットフォーム用のシェーダーのアセンブリコードを確認したい場合は、AMDGPUShaderAnalyzerをお勧めします。

于 2012-04-14T19:46:08.823 に答える
2

これがあなたの質問に答えるかどうかはわかりませんが、GPUに大きく依存するため、命令に必要なクロック/スロットの数を知ることは非常に困難です。通常、それは単一のサイクルです。ただし、そうでない場合でも、コンパイラは命令の実行順序を並べ替えて、実際のコストを隠すことができます。命令を実行するのと同じように、sin/cosのテクスチャルックアップを使用するのは確かに遅くなります。

于 2012-04-14T16:28:06.053 に答える
1

math.abs、frac、ectと比較して、1つのシェーダーで連続して取得できるsinの数を確認してください... gtx 470はフラグメントごとに200のsin関数を処理できると思いますが、フレームは10%遅くなります。空のシェーダー。非常に高速で、結果を送信できます。これは、計算効率の優れた指標になります。

于 2014-08-19T15:45:02.137 に答える
-1

コンパイラーは両方のブランチを評価するため、条件が非常に高くなります。シェーダーでsinとcosの両方を使用する場合、sin(x)* sin(x)+ cos(x)*であるため、sin(a)とcos(a)= sqrt(1.0-sin(a))のみを計算できます。 cos(x)は常に1.0です

于 2015-08-14T17:49:23.447 に答える