2017-05-19 7 views
1

実際には、チェーン化シェーダは、単一のシェーダを使用して同じ作業を行う場合と比較して、どれだけのオーバーヘッドがかかりますか?チェインメタルシェーダとシングルシェーダのパフォーマンスはどちらですか?

つまり、シェーダをチェーン化して1つのモンスターシェイダーを開発する方がよいでしょうか?または、それらを連鎖させるオーバーヘッドは、可能な限り少ないシェーダを使用するように指示しますか?

例として、@ warrenmのサンプル「画像処理」projectを考えてみましょう。 gaussian_blur_2dシェーダにはadjust_saturationシェーダがチェーンされています。両方のシェーダを組み合わせて1つのシェーダにすると、パフォーマンスが大幅に向上するのでしょうか、それとも実質的に同じでしょうか?

答えて

0

adjust_saturationgaussian_blur_2dに結合するという例では、かなりの量のパフォーマンス向上が見込まれます(名前が示すとおりです)。

GPUの観点から、両方の操作は実行する必要がある数学の点でかなり簡単ですが、パフォーマンスはテクスチャの取得と結果の書き込みによって完全に支配されます。私はガウスのぼかしは、おそらく出力フラグメントごとに複数のテクスチャサンプルを行うので、もう少し作業をしていると思います。 2つのシェーダを組み合わせることで、彩度を調整するテクスチャの取り込みと書き込みのコストを完全に排除できます。

2つの操作を組み合わせることで、パフォーマンスを大幅に向上させることが期待できます。 iOSはCPU/GPUのクロック速度を非常に積極的に管理しているため、フレームレートに違いは見られない可能性があるので、正確に測定するのは難しいです。

+0

私はそれを疑うことはありません。 GPUのテクスチャキャッシングとプリフェッチではサンプリングのレイテンシが大幅に削減され、ぼかしカーネル(特に非分割の2Dカーネル)と何かを組み合わせると、実際にはかなり多くの冗長な作業が行われます。彩度調整はおそらくrgbからhsvに変換され、1ピクセルあたり1回実行されればそれほど多くの指示はないが、小さな3x3 2Dぼかしカーネルのみを考慮すると、1ピクセルあたり9回、そのうち8回は完全に冗長です... –

+0

ぼかしカーネルの出力ではなく、ぼかしカーネルの出力に対して彩度調整を行います。 – Columbo

+0

少なくともモバイルデバイスの場合、私はColumboの答えに同意します。通常、単一のシェーダでパスを組み合わせる価値があります。 GPUだけでなくCPUの場合でも、例えばアンドロイド上で現在のレンダリングターゲットを切り替えてドローコールを実行すると、CPUコストは無視できないほどです...ドライバで何が起きているのかはっきりしませんが、レンダリングターゲットスイッチのコストは約0.2/0.3ms。 –

0

テクスチャのサイズとキャッシュのサイズによって異なります。あなたが絶対にそれを最適化しなければならない場合、それらを1つのシェーダに組み合わせる価値があります。コードを再利用したい場合は、よりシンプルなシェーダを作成して組み合わせることができます(VideoShaderプロジェクトhttps://github.com/snakajima/vs-metalのように)。

ところで、複数のシェーダを組み合わせる場合は、1つのコマンドバッファを作成し、シェーダごとにコマンドバッファを作成する代わりに、すべてのシェーダをそのコマンドバッファにエンコードすることをお勧めします。これにより、Metalはある種の最適化を実行できます。

関連する問題