2008-09-02 14 views
10

現在、私はraytracerを実装しています。 raytracingは非常に計算量が重いので、とにかくCUDAプログラミングを検討しているので、誰かがこの2つを組み合わせた経験があるのだろうかと思っていました。私は実際に計算モデルが一致するかどうかわからないし、何を期待するか知りたいと思う。私はそれが天国で行われた正確な試合ではないという印象を得るが、まともなスピードの増分は何もないよりも良いだろう。CUDAによるレイトレーシング

答えて

20

CUDAに非常に注意が必要なことの1つは、根底にあるGPUハードウェアの構造のために、カーネルコードの発散的な制御フローが絶対にKILLSのパフォーマンスであることです。 GPUは通常、高度にコヒーレントな制御フローを備えた大量のデータ並列作業負荷を持っています(つまり、ピクセル数が数百万個あります)。正確なの同じシェーダプログラムで操作しますこれにより、1つの命令キャッシュ、フェッチユニット、および32スレッドのグループごとのロジックのデコードなど、ハードウェアの最適化を行うことができます。理想的なケースでは、グラフィックスで一般的です。同一サイクル内のすべての32セットの実行ユニットに同じ命令をブロードキャストすることができます(これはSIMDまたは単一命令の複数データと呼ばれます)。 MIMD(マルチ命令)およびSPMD(シングルプログラム)ストリーミング・マルチプロセッサー(SM)内のスレッドが分岐した場合(ブランチから異なるコード・パスを取り出した場合)、問題ロジックは実際にはオンになっている各コード・パスサイクルごとの基準。すべてのスレッドが別々のパスにある最悪の場合、ハードウェアの使用率が32倍に低下しただけで、CPUを使用してGPUで実行した場合の効果を効果的に打ち消すことは想像できます。 PCIeを介してCPUからデータセットをGPUにマーシャリングすることに伴うオーバーヘッド。レイ・トレースは、ある意味ではデータの並行性はあるものの、適度に複雑な場面でも幅広く異なる制御フローを持っていると言われています。たとえ同じSM上に互いに緊密に離して配置された密集した光線をマッピングしても、最初のバウンスのためのデータと命令の局所性は非常に長く保たれません。例えば、すべての32の高度にコヒーレントな光線が球体から跳ね返ると想像してください。このバウンスの後、彼らはすべてかなり違った方向に向かい、おそらく異なる材料で作られた物体、異なる照明条件などを打つでしょう。すべてのマテリアルと照明、オクルージョンなどの条件には、それに関連付けられた独自の命令ストリームがあり(屈折、反射、吸収などを計算するため)、同じ命令ストリームをかなりの割合で実行することは非常に困難になりますSM内のスレッドの数。この問題は、レイトレーシングコードの最新技術では、GPUの使用率を16〜32倍に低下させます。これは、アプリケーションにとって、特にリアルタイム(ゲームなど)のパフォーマンスを許容できなくする可能性があります。それでもなお、CPUに対して優れているかもしれない。レンダーファーム。

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

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

9

これは確かに行うことができ、レイトレーシングとクーダの間でホットな話題です。私は熟読することから始めるだろうhttp://www.nvidia.com/object/cuda_home.html

しかし、それは基本的に研究の問題です。それをうまくやっている人は、査読済みの研究論文を取りに行っています。しかし、でもこの時点では、最高のGPU/Cuda結果が、CPU /マルチコア/ SSEのクラス最高のソリューションとほぼ競合していることを示しています。ですから、Cudaを使ってレイ・トレーサを加速させると仮定するのはちょっと早いと思います。問題は、レイトレーシングは「恥ずかしいほどパラレル」ですが、GPUに直接マップする「固定された入力と出力のサイズ」の問題ではありません。ツリー、スタック、動的なデータ構造などが必要です。それはCuda/GPUで行うことができますが、扱いにくいです。

あなたの質問は、あなたの経験レベルやプロジェクトの目標については不明です。これがあなたの最初のレイトレーストレーサーで、あなたが勉強しようとしているだけの場合、私はCudaを避けるでしょう。開発に10倍の時間がかかります。あなたが適度に経験豊富なCudaプログラマーで、挑戦的なプロジェクトを探していて、レイトレーシングがクールなことであれば、是非Cudaでそれをやろうとしてください。商用アプリケーションを作っていて、競争力のあるスピードを求めているのならば、おそらくこの時点では駄目なことでしょう...パフォーマンスは向上するかもしれませんが、開発がより難しくなります。特定のハードウェアへの依存。

GPUスピード、Cudaコンパイラ開発、およびリサーチコミュニティの経験の別の世代か2年後に、答えが1年後に異なる可能性があります。

+0

私は最初のraytracerを構築する小さなプロジェクトを持っており、CUDAの作業を一度も行っていないので、何かを大きくするには不十分ですが、来年にはGPGPU技術を使って作業しています。これは私にCUDAに精通するようになり、私はこの知識をどの程度拡張できるのか疑問に思っていました。 –

+0

困ったことに並行して問題が起きていることは確かですか?マットJが指摘しているように、次の反射の対象とマテリアルハンドリングのバリエーションを見つけるために解決すると、並列処理を大幅に中断させるようです。しかし、もし私が間違っていれば私を修正してください。 –

4

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

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

+0

ありがとう、これは本当に興味深いものです! –

関連する問題