0

実際にはサインではない関数がいくつかありますが、それらは従来の処理よりもはるかに高速で、単純な放物線関数です。

これは、組み込みのグラフィック サイン関数よりもグラフィック プロセッサで高速になりますか。

    float  par (float xx){////// sinus approximation
        half xd =((fmod(abs(xx), 2.4)) - 1.2);
        if ( fmod (abs(xx) , 4.8)  > 2.4) { xd=(-xd*xd)+2.88;}
        else {xd = xd*xd;}
        xd = -xd*0.694444444+1;
        if (  (xx<0) ) { xd=-xd;}
        return xd;
    }
4

2 に答える 2

3

主な答え

あなたの関数がどのグラフィックス カードの組み込みの sin/cos 関数よりも高速になる方法は絶対にありません。

シェーダー命令 sin 、 cos 、および tan は、これまでに製造されたほぼすべてのグラフィックス カードの単一サイクル命令です。現在、シングル サイクルでないグラフィックス カードを購入することはできません。

質問を大局的に見ると、グラフィックカードでは、正弦波(sin関数)を取得するのと同じように、複数の2つの数値(mul命令)に同じ時間がかかります-単一のGPUサイクル。

シェーダーを作成するときは、コンパイラーのコマンド ライン オプションを確認してください。生成されたアセンブリ コードを出力するオプションがあり、ほとんどのコンパイラは最短パス (命令とサイクルの数) と最長パスの合計を提供します。これらの合計は、フェッチなどによってパイプラインが停止する可能性があるため、保証された期間ではありませんが、現在求めている質問の種類に答えます。

シェーダー命令はカードごとに異なりますが、最長の単一命令は 4 GPU サイクルだと思います。

関数のシェーダー コンパイラ アセンブリ出力を見ると、多くのサイクルを使用して多くの命令を呼び出しており、1 サイクルの命令よりも速く実行できるかどうかを尋ねています。

グラフィックチップの全体的な目的は、命令セットを実行する際に非常に高速で非常に並列であることです (これらの命令が他のプロセッサでどれほど複雑であっても)。シェーダーをプログラミングするときは、プロセッサーの設計目的にコードを集中させます。シェーダー プログラミングは、ソフトウェア開発の他の場所で行うプログラミングとは考え方が異なりますが、サイクルをカウントし、フェッチ ストールを最小限に抑えることについて考え始めると、すぐにシェーダー処理の真の力を発揮し始めるでしょう。

幸運を祈ります。

于 2013-09-21T05:18:30.123 に答える
3

補足概念ヘルプ

始める前に、私は GPU メーカーで働いたことがないことを説明しておく必要があります。以下で私が言うことのいくつかは事実上間違っているかもしれませんが、それは私がプログラマーとして理解している方法です.

以下は、最新の GPU のイメージです。この画像は、それぞれが 8 つのキューを含む 8 つの汎用パイプを示しているため、クロックのサイクルごとに 64 命令の単一命令操作を処理できます。

古い GPU には固定されたプログラム不可能なパイプラインがありましたが、私たちはそれらにあまり関心がありません。中間の GPU には、ベクター プログラムを実行するための特定のパイプと、ピクセル シェーディング用の別のパイプがありました。最新の GPU には、あらゆるタイプのプログラム (テッセレーション、計算などを含む) を実行できる汎用パイプがあります。

アービトレーション プローブとアロケーション プローブは、どのパイプでどのプログラムを実行するか、どの入力をパイプに送信するかを決定し、各サイクルでできるだけ多くのプロセッサが使用されるようにします。プログラマーとして、私たちはこれらとは何の関係もないので、これは私にとって完全なブラック ボックスです。

パイプを制御するプログラムを書いています。したがって、AA プローブが pipe0 をピクセル シェーダーとして使用することを決定したと想像してください (頂点が飛び跳ねる原因となる丸めについて心配していないため、プログラムは色で何かを行っていると思います)。次に、同じプログラム (テクスチャを参照) を必要とする 8 つのピクセルを選択し、それらをプロセス バッファにロードします。次に、プログラムが完了するまで、8 つのピクセルすべてが一度に 1 命令ずつ並列に実行され、パイプが AA プローブに戻されて新しいジョブが与えられます。そのプログラムを必要とするピクセルが 8 ピクセル未満の場合、プロセス バッファの一部が空の状態でパイプが実行され、チップが十分に活用されていません。画面上のすべてのテクスチャが異なると、GPU が殺されます。

したがって、1 サイクルで 1 つの計算パイプは 8 ピクセルに対して 8 muls または 8 ピクセルに対して 8 sin を実行できますが、すべてのピクセルに対してすべての命令を直線的に実行する必要があります。これが、if ステートメントがシェーダー プログラムにとって非常に複雑である理由です。条件に合格したピクセルは処理されますが、失敗したピクセルは、合格したピクセルが処理されるまでサイクルを待機する必要があります。

明らかに、私がピクセルと言ったすべての場所は、頂点または CU 要素である可能性があります。

ここで言及したと私が考えることができる唯一のことは、精度です。精度を下げると、処理バッファーをより密に詰めることができます。したがって、どこでも半精度を使用している場合、GPU は 1 秒あたり 64 の数値を処理する代わりに、128 などを処理できます。

それがGPUの仕組みです。確かに、アーキテクチャを理解することで、シェーダー プログラムがそのようになっている理由がより理解できるようになりました。 最新のグラフィックス チップのアーキテクチャ

于 2013-09-21T10:56:32.617 に答える