2016-10-28 3 views
0

テクスチャメモリの仕組みを理解しようとしています。私はそれがそうである理由私は理由を見つけることができなかった、CUDA:テクスチャリファレンスをファイルスコープでグローバルに宣言する必要があるのはなぜですか?

テクスチャ参照がファイルスコープでグローバルに宣言されなければならないことを、CUDA例による帳に

をお読みください。だから少し詳細にこれを理解するためのポインタ?

下記のコメントでnjuffaが指摘したように、ハードウェアの制限によってはHLLレベルでこの制限が課されましたが、これらの制限は何ですか?

+1

思い出したように、ハードウェアの制限により、この制限がHLLレベルで課せられました。より柔軟なものが必要な場合は、[テクスチャオブジェクト](https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-kepler-texture-objects-improve-performance-and-flexibility/)を見ることをお勧めします。 – njuffa

+0

@nuffaこれらのハードウェアの制限は何ですか?私はちょうどこれを知って好奇心です。 – gpuguy

+1

それは私が覚えていない、それは10年以上を過ごしました:-)知っているかもしれない人々のいくつかは、SOアカウントを持っているので、ちょっと待ってみてください。私の頭の中に浮かんでいるあいまいな概念は、参考文献がどのように機械命令に組み込まれているかと結びついているのは、製本プロセスの詳細に関するものだったということです。コンピューティングハードウェアに関する質問はここでは話題にはならないことに注意してください。 – njuffa

答えて

1

免責事項:ここで私はグラフィックプログラミングの経験から考えられる理由を推測します。それは、地上の真実とみなされるべきではなく、正しいものでもないと考えられます。

これは、それが年齢のシェーダで行われてきた方法です。

グラフィックスパイプラインはステートマシンであり、すべての状態遷移はグローバルです。現在のスナップショットは、ドライバとハードウェアの現在の状態を反映し、プログラム全体に影響します。 従来、リソースは、シェーダ言語で、上部のファイルスコープで参照されています。それはテクスチャバッファ、サンプラ、または他の任意のリソースです。アプリケーション側から適切なテクスチャスロットに適切なバッファをバインドし、サンプラオブジェクトをバインドします。通常、バインドされたリソースはどのシェーダステージでも使用できます。

私はCUDAが開発された時、誰も高水準の表現を変えるのは気にしませんでしたが、もちろん可能です。たとえば、任意のスコープの任意の場所でテクスチャリソースを宣言できますが、最終的にハードウェアの観点からは、リソースバインディングはグローバルにとどまり、スコープを離れるときには別のリソースにバインド解除またはリバウンドする必要があります。もちろん、これらの命令はコンパイラによって挿入することができます。実装はC++のデストラクタの場合と似ています。

APIを変更しない理由は、状態遷移がグローバルであり、通常は非常にコストがかかるという事実を明示的に反映している可能性があるため、APIユーザーからこれを隠すことはパフォーマンス上の理由から賢明ではありません。

関連する問題