3d稀疏几何的希尔伯特曲线

时间:2011-07-30 21:57:11

标签: optimization cuda opencl hilbert-curve

我有一个包含稀疏几何体的非立方边界框的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]];
}

2 个答案:

答案 0 :(得分:3)

希尔伯特曲线是一个很高的顺序。似乎很难找到一种能够随机访问曲线上各点指数的公式。

然而,Morton ordering是合理的,并且具有一些相同的优良特性,因为它也是一个空间填充曲线。还有一个随机访问程序,用于查找N维点的Morton数。

您可能会考虑两个步骤:

  1. 对您的数据应用流压缩步骤,以选择您要处理的卷元素

  2. 使用Morton indices as the sorting key

  3. 对此压缩数据进行排序

    您可以将thrust用于流压缩和键值排序。

    这应该产生一个促进连续性的排序中的体积元素列表。也就是说,重新组织数据的开销可能会占据原始不规则访问模式的成本。

答案 1 :(得分:1)

这听起来很不可能。

你已经排除了kdtree或octree吗?

数字配方中kdtree(第21.2章)和八叉树(第21.8章)的描述是可以理解的: http://apps.nrbook.com/rollover/index.html