我有一个包含稀疏几何体的非立方边界框的3d数组。
如果(x,y,z)是计算域的一部分,则数组几何[x] [y] [z]包含值0,否则为1.
为了重新排序计算,我想使用Hilbert曲线遍历这个空间。
上下文是在内存绑定的GPU程序中优化全局内存访问。
我该如何实现?
更新: 我只想遍历非空单元格,因为我只会将它们(在一个数组中)与一个邻接列表一起存储,该邻接列表跟踪一个元素的19个相邻节点。
计算只是在两个数组之间复制:
dst[i] = src[adjacency_map[i]]
这是稀疏格子Boltzmann方法的传播阶段,物理解释是从邻近站点流出“流体粒子”。
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]];
}
答案 0 :(得分:3)
希尔伯特曲线是一个很高的顺序。似乎很难找到一种能够随机访问曲线上各点指数的公式。
然而,Morton ordering是合理的,并且具有一些相同的优良特性,因为它也是一个空间填充曲线。还有一个随机访问程序,用于查找N维点的Morton数。
您可能会考虑两个步骤:
对您的数据应用流压缩步骤,以选择您要处理的卷元素
您可以将thrust用于流压缩和键值排序。
这应该产生一个促进连续性的排序中的体积元素列表。也就是说,重新组织数据的开销可能会占据原始不规则访问模式的成本。
答案 1 :(得分:1)
这听起来很不可能。
你已经排除了kdtree或octree吗?
数字配方中kdtree(第21.2章)和八叉树(第21.8章)的描述是可以理解的: http://apps.nrbook.com/rollover/index.html