12

現在、レイトレーサーを実装しています。レイトレーシングは非常に計算量が多いため、とにかく CUDA プログラミングを検討する予定であるため、2 つを組み合わせた経験がある人がいるかどうか疑問に思っていました。計算モデルが一致するかどうかはわかりませんが、何が期待できるか知りたいです。私はそれがまさに天国で行われた試合ではないという印象を受けますが、まともな速度の増加は何もないよりはましです.

4

4 に答える 4

24

CUDA で非常に注意すべきことの 1 つは、基になる GPU ハードウェアの構造が原因で、カーネル コード内の発散制御フローがパフォーマンスを完全に損なうことです。通常、GPU には、高度にコヒーレントな制御フローを備えた大規模なデータ並列ワークロードがあります (つまり、数百万のピクセルがあり、それぞれ (または少なくともその大部分) が正確に操作されます)。同じシェーダー プログラムで、すべてのブランチで同じ方向をとります。これにより、32 スレッドのグループごとに命令キャッシュ、フェッチ ユニット、デコード ロジックを 1 つだけにするなど、ハードウェアの最適化を行うことができます。グラフィックスで一般的な理想的なケースでは、同じサイクルで 32 セットの実行ユニットすべてに同じ命令をブロードキャストできます (これは SIMD、または単一命令複数データとして知られています)。彼らはエミュレートすることができますMIMD (Multiple-Instruction) および SPMD (Single-Program) ですが、Streaming Multiprocessor (SM) 内のスレッドが分岐する (分岐から異なるコード パスを取得する) 場合、発行ロジックは実際にはサイクルバイで各コード パスを切り替えます。 -サイクルベース。最悪の場合、すべてのスレッドが別々のパスにある場合、ハードウェアの使用率が 32 分の 1 に低下し、CPU ではなく GPU で実行することで得られるメリットが事実上失われることを想像できます。 CPU から PCIe を介して GPU へのデータセットのマーシャリングに関連するオーバーヘッド。

とはいえ、レイ トレーシングは、ある意味ではデータ並列ですが、適度に複雑なシーンであっても、大きく分岐する制御フローを備えています。互いに隣接してキャストする狭い間隔の光線の束を同じ SM にマッピングできたとしても、最初のバウンスで得たデータと命令の局所性は、それほど長くは保持されません。たとえば、32 個の高コヒーレントな光線すべてが球体で跳ね返ると想像してください。この跳ね返りの後、それらはすべてかなり異なる方向に進み、おそらく異なる材料で作られたオブジェクト、異なる照明条件などにぶつかるでしょう. すべてのマテリアルとライティング、オクルージョンなどの条件のセットには、それに関連付けられた独自の命令ストリームがあります (屈折、反射、吸収などを計算するため)。そのため、SM 内のスレッドの大部分でさえ、同じ命令ストリームを実行することは非常に困難になります。この問題は、レイ トレーシング コードの現在の最先端技術では、GPU 使用率を 16 ~ 32 分の 1 に減らします。これにより、特にリアルタイム (ゲームなど) の場合、アプリケーションのパフォーマンスが許容できないものになる可能性があります。レンダー ファームなどでは、CPU よりも優れている可能性があります。

MIMD または SPMD アクセラレータの新たなクラスが研究コミュニティで現在検討されています。私は、これらをソフトウェアのリアルタイム レイトレーシングの論理的なプラットフォームと見なします。

関連するアルゴリズムとコードへのマッピングに興味がある場合は、POVRay をチェックしてください。また、フォトン マッピングも調べてください。これは、レイ トレーシングよりも物理的現実の表現に一歩近づく興味深い手法です。

于 2008-09-19T06:05:18.650 に答える
9

それは確かに実行可能であり、実行されており、現在レイトレーシングとCudaの達人の間でホットなトピックです。まず、 http: //www.nvidia.com/object/cuda_home.htmlを熟読します。

しかし、それは基本的に研究上の問題です。それをうまくやっている人々はそれから査読された研究論文を手に入れています。しかし現時点では、GPU / Cudaの最高の結果は、CPU/マルチコア/SSEのクラス最高のソリューションとほぼ競合していることを意味します。したがって、Cudaを使用するとレイトレーサーが高速化されると考えるのは少し早いと思います。問題は、レイトレーシングは(彼らが言うように)「驚異的並列」ですが、GPUに直接マッピングされる「固定入力および出力サイズ」の問題ではないということです。ツリー、スタック、動的データ構造などが必要です。 .Cuda / GPUを使用して実行できますが、注意が必要です。

あなたの質問はあなたの経験レベルやあなたのプロジェクトの目標について明確ではありませんでした。これが初めてのレイトレーサーであり、学習しようとしているだけの場合は、Cudaを避けます。開発に10倍の時間がかかり、おそらく十分な速度が得られないでしょう。中程度の経験を積んだCudaプログラマーで、やりがいのあるプロジェクトを探していて、レイトレーシングを学ぶのは楽しいことです。ぜひ、Cudaでやってみてください。商用アプリを作成していて、競争力のあるスピードエッジを目指している場合は、この時点ではおそらくクラップスシュートです...パフォーマンスエッジを得る可能性がありますが、開発がより困難になり、特定のハードウェアへの依存。

1年後にもう一度確認してください。GPU速度、Cudaコンパイラの開発、および研究コミュニティでの経験が1、2世代続くと、答えが異なる場合があります。

于 2008-09-02T13:54:29.247 に答える
6

CUDA raytracer の私のオープンソースで移植可能な (Windows/Linux) GPL 実装へのポインタです。

于 2011-09-07T09:17:28.760 に答える
4

Nvidia は、今年のカンファレンス NVision で CUDA のレイトレーサーのデモを行いました。これについてのスライドへのリンクがあります。

http://www.nvidia.com/object/nvision08-IRT.html

于 2008-09-29T05:12:53.290 に答える