1

カーネル内の最後と次のインデックス座標にアクセスしようとしています。

例:int idx = blockIdx.x * blockDim.x + threadIdx.x;

次に、pos [idx] .x、pos [idx] .y、pos [idx] .zは、ポイントの現在の座標を示します。ただし、他の2つにはアクセスできません。CUDAを使用してGPUレベルで変化する三角形の法線を計算しようとしています。

4

2 に答える 2

0

引き続きidx+1、idx + 2を実行でき、GPUはすべての共有メモリにアクセスできます

最高の効率を得るには、近くのポイントのメモリが同じコア上にあるように、ジョブをブロック/スレッドなどに分割する方法について少し注意する必要があります。

于 2012-10-22T15:10:09.320 に答える
0

GPUで法線を簡単に計算できるかどうかは、メッシュトポロジによって異なります。

三角形リストトポロジのメッシュの法線を計算するのは簡単です。三角形ごとに1つのGPUスレッドを使用します。これにより、非常に定期的な読み取りと書き込みが行われ、CUDAのブロックとスレッドの有効な構成で機能します。残念ながら、三角形リストトポロジはあまり役に立ちません(最初は、追加の処理を使用しない限り、フラットシェーディングになります)。

三角ストリップトポロジ(一般的に使用される)のメッシュの法線を計算するのは[はるかに]困難です。問題は、頂点が複数の三角形で使用されているため、複数の三角形法線を組み合わせて、各頂点法線の[加重]平均を累積する必要があることです。三角形ごとに1つのGPUスレッドを使用するということは、複数の頂点ノルムが複数のGPUスレッドから「同時に」影響を受けることを意味します。または、頂点ごとに1つのGPUスレッドを使用するということは、その頂点を参照する三角形のリストが必要であることを意味します。次に、頂点ノルムを計算できるように、三角形を読み取る必要があります(追加の頂点のペア)...これは難しいですが、しかし、不可能ではありません。

最後に、モデルがインデックス付きの頂点を使用している場合、これにより追加の[セミランダム]ルックアップが課され、問題が発生する可能性があります。この問題は、空間分割で対処できます。

于 2015-03-15T23:25:21.760 に答える