スパース ジオメトリの非立方バウンディング ボックスを含む 3D 配列があります。
配列 geometry[x][y][z] には、(x,y,z) が計算領域の一部である場合は値 0 が含まれ、そうでない場合は 1 が含まれます。
計算を並べ替えるために、ヒルベルト曲線を使用してこの空間をトラバースしたいと考えています。
コンテキストは、メモリにバインドされた GPU プログラムでグローバル メモリ アクセスを最適化しています。
どうすればこれを実装できますか?
更新:要素の19個の隣接ノードを追跡する隣接リストと一緒に(配列に)格納するだけなので、空でないセルをトラバースしたいだけです。
計算は、2 つの配列間でコピーするだけです。
dst[i] = src[adjacency_map[i]]
これは疎格子ボルツマン法の伝播段階であり、物理的な解釈は隣接するサイトから「流体粒子」をストリーミングしています。
adjacency_map の値が連続的であるほど、次のようになります。より合体したメモリアクセスが得られることを願っています。
OpenCL カーネル:
__kernel void propagation(__global double *dst, __global double *source,
__global const int *adjacency_map, const uint max_size)
{
size_t l = get_global_id(0);
if( l > max_size )
return;
dst[l] = src[adjacency_map[l]];
}