1

C# にはBitmap、約 10000x5000 の 2 つの大きな s を取り、3D モデルで写真と光線の衝突操作を実行して 3D モデルに写真をマッピングする、頑丈なアルゴリズムがあります。

このようなアルゴリズムを OpenCL に変換して、アルゴリズム中の並列操作を最適化できるかどうかを知りたいです。しかし、アルゴリズムの詳細に入る前に、私のアルゴリズムが OpenCL に変換可能かどうかを調査する方法を知りたいです。

私は OpenCL の経験がありません。OpenCL に参加してその仕組みを学ぶ価値があるかどうかを知りたいです。グラフィックカードで確実に動作しないものを探す必要がありますか? (for ループ、再帰)

アップデート:

私のアルゴリズムは次のようになります。

foreach photo
    split the photo in 64x64 blocks
    foreach block
        cast a ray from the camera to the 3D model
        foreach triangle in 3D model
            perform raycheck
4

3 に答える 3

2

はい、openclはこのタイプの作業で非常に可能です。レイキャスティングは、GPUハードウェアが輝く場所です。

これを分割する1つの方法:

foreach photo - work done by host application. (openmp?)
foreach block - use one opencl work group per block
foreach triangle in 3D model - single work item

このアルゴリズムを実装する際に考慮すべき点が他にもいくつかあります。

1)ブロックごとにキャストされる光線は常に64 ^ 2ありますか?

2)画像やジオメトリに「当たる」光線の比率はどれくらいですか?条件付きブランチは、GPUハードウェアのパフォーマンスを低下させます。

3)画像ではなく、ジオメトリの観点からキャストすることを検討しましたか?つまり、foreach三角形、foreach頂点、カメラからの光線のキャスト、画面上の位置の検出です。三角形の残りのポイントを補間し、結果をZバッファリングして、ピクセルの再描画を防ぐことができる場合があります。

4)グラフィックを処理するだけの場合、opengl / directxにはすでに必要なものがありますか?

于 2012-09-04T13:48:17.317 に答える
1

OpenCL でそれを行う前に、それをマルチスレッド C プログラムに変換する中間ステップを実行します。このステップからすでに大幅な速度の増加が見られますが、それははるかに簡単です. また、OpenCL でカーネルを作成するには、通常の C に非常に似ている OpenCL C を使用する必要があります。したがって、この中間ステップからの変換ステップは、C# から直接行うよりも簡単です。

最終的にOpenCLバージョンを実行するには、ホストからの写真のメモリをGPUと共有する必要があります(実際、画像の場合、OpenGLと何らかの形で互換性のあるピクセルエンコーディングを認識している画像専用の特別なメモリAPIがあります) 次に、raycheck カーネルを作成し、ホストから、各ブロック/トライアングルの raycheck カーネルをキューに入れます。

ATI からの OpenCL に関する優れた紹介講演がここにあります

http://www.youtube.com/watch?v=ecYIsu83c0I

于 2012-09-04T14:07:37.620 に答える
1

特定の質問に対して: for ループは問題ありません (ただし、最適ではありません)。GPU では再帰はできません。

一般に、GPU で適切に機能するアルゴリズムには、多くの独立したデータ並列操作が必要です。多くのビットマップ操作はこのカテゴリに分類されますが、レイ トレーシングは難しい場合があります。

アルゴリズムを変更して、最高レベルに多数 (数千) の独立したブロックを配置できる場合、ブロック内の下位レベルの依存関係は問題ありません。

このような一般的なトピックについて言えることはそれだけだと思います。

于 2012-09-04T09:26:00.277 に答える