我有一个包含稀疏几何的非立方边界框的 3d 数组。
如果 (x,y,z) 是计算域的一部分,则数组 geometry[x][y][z] 包含值 0,否则为 1。
为了重新排序计算,我想使用希尔伯特曲线遍历这个空间。
上下文是优化内存绑定 GPU 程序中的全局内存访问。
我该如何实施?
更新:我只想遍历非空单元格,因为我只会将这些单元格(在数组中)与一个跟踪元素的 19 个相邻节点的邻接列表一起存储。
计算只是在两个数组之间复制:
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]];
}