7

私は独自のグラフィックス ライブラリを作成しており (そう、宿題です:)、cuda を使用してすべてのレンダリングと計算を高速に実行しています。

塗りつぶされた三角形の描画に問題があります。1つのプロセスで1つの三角形を描くように書きました。シーンに小さな三角形がたくさんある場合は問題なく動作しますが、三角形が大きい場合はパフォーマンスが完全に低下します。

私の考えは、2 つのパスを実行することです。最初に、スキャンラインに関する情報を含むタブのみを計算します (ここからそこまで描画します)。これは、現在のアルゴリズムのようにプロセス計算ごとに三角形になります。2 番目のパスでは、三角形ごとに複数のプロセスでスキャンラインを実際に描画します。

しかし、それは十分に速いでしょうか?多分もっと良い解決策がありますか?

4

3 に答える 3

3

このブログを確認できます: A Software Rendering Pipeline in CUDA。それが最適な方法だとは思いませんが、少なくとも著者はいくつかの有用な情報源を共有しています。

次に、この論文を読んでください: A Programmable, Parallel Rendering Architecture . これは最新の論文の 1 つであり、CUDA ベースでもあると思います。

これを行う必要がある場合は、Larrabee (TBR) または REYES のようなデータ並列ラスター化パイプラインを使用して、CUDA に適応させます。

http://www.ddj.com/architect/217200602 http://home.comcast.net/~tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip (プレゼンテーションの後半を参照)

http://graphics.stanford.edu/papers/mprast/

于 2010-01-13T21:10:13.663 に答える
0

CUDA とその使用方法について誤解していると思われます。特に、CUDA 用語では「プロセス」という用語がない場合に「プロセス」を参照しているためです。

ほとんどの CUDA アプリケーションでは、良好なパフォーマンスを得るために 2 つの重要なことがあります。メモリ アクセスを最適化することと、ワープ内の「アクティブな」CUDA スレッドのそれぞれが、ワープ内の他のアクティブなスレッドと同時に同じ操作を実行するようにすることです。これらはどちらも、アプリケーションにとって重要であるように聞こえます。

メモリ アクセスを最適化するには、グローバル メモリからの読み取りとグローバル メモリへの書き込みが確実に結合されるようにする必要があります。詳細については、CUDA プログラミング ガイドを参照してください。ただし、基本的には、ハーフ ワープ内の隣接するスレッドが、隣接するメモリ位置から読み取りまたは書き込みを行う必要があることを意味します。また、各スレッドは一度に 4、8、または 16 バイトを読み書きする必要があります。

メモリ アクセス パターンがランダムな場合は、テクスチャ メモリの使用を検討する必要があります。ブロック内の他のスレッドによって読み取られたメモリを参照する必要がある場合は、共有メモリを使用する必要があります。

あなたの場合、入力データが何であるかはわかりませんが、少なくとも書き込みが結合されていることを確認する必要があります。読み取りを効率的に行うには、かなりの労力を費やす必要があるでしょう。

2 番目の部分では、各 CUDA スレッドが出力画像の 1 ピクセルを処理することをお勧めします。この戦略では、スレッドごとのデータに応じて実行時間が長くなったり短くなったりするカーネル内のループに注意する必要があります。ワープの各スレッドは、同じ順序で同じ数のステップを実行する必要があります。これに対する唯一の例外は、warp 内の一部のスレッドが操作を実行せず、残りのスレッドが同じ操作を一緒に実行しても、実際のパフォーマンスのペナルティがないことです。

したがって、各スレッドでそのピクセルが特定の三角形の内側にあるかどうかをチェックすることをお勧めします。そうでない場合は、何もしないでください。そうであれば、そのピクセルの出力色を計算する必要があります。

また、基本的な基礎のいくつかをよく理解していないまま深いところに飛び込んでいるように見えるので、CUDA についてもっと読むことを強くお勧めします。

于 2010-01-13T12:51:26.193 に答える
-1

失礼ではありませんが、とにかくこれはグラフィックカードが行うように設計されていることではありませんか?標準のOpenGLおよびDirect3DAPIを使用する方が理にかなっているようです。

はるかに低レベルのCUDAではなく、APIを使用して基本的なレンダリングを行ってみませんか?次に、サポートされていない追加の操作を実行したい場合は、CUDAを使用してそれらを上に適用できます。または、シェーダーとして実装することもできます。

于 2010-01-15T19:22:49.393 に答える