質問

現在レイトレーサーを実装中です。レイトレーシングは非常に計算量が多く、私はいずれにしても CUDA プログラミングを検討するつもりなので、この 2 つを組み合わせた経験のある人はいるだろうかと疑問に思いました。計算モデルが一致するかどうかは実際にはわかりませんが、何が予想されるのか知りたいと思っています。まさに天国のような試合ではないような印象を受けますが、速度がある程度向上したほうが、何もしないよりはマシでしょう。

役に立ちましたか?

解決

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

そうは言っても、レイ トレーシングは、ある意味ではデータ並列ではありますが、ある程度複雑なシーンであっても、広範囲に分岐する制御フローを持ちます。たとえ互いに隣り合って放たれる密集した光線の束を同じ SM 上にマッピングできたとしても、最初のバウンスで得たデータと命令の局所性はそれほど長くは保持されません。たとえば、32 本のコヒーレント性の高い光線がすべて球体から反射すると想像してください。このバウンドの後、それらはすべてかなり異なる方向に進み、おそらく異なる素材や異なる照明条件などで作られた物体に衝突するでしょう。あらゆるマテリアルとライティング、オクルージョンなどのセット。条件には、それに関連付けられた独自の命令ストリーム (屈折、反射、吸収などを計算するため) があるため、SM 内のスレッドのかなりの部分であっても同じ命令ストリームを実行することは非常に困難になります。この問題は、レイ トレーシング コードの現在の最先端技術では、GPU 使用率を 16 ~ 32 分の 1 に削減し、特にリアルタイムの場合 (例:ゲーム)。それでも、たとえば、CPU よりも優れている可能性があります。レンダーファーム。

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

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

他のヒント

それは確かに実行可能であり、実行されており、現在レイトレーシングと 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 世代経つと、答えは変わってくるかもしれません。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top