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

Posted

技术标签:

【中文标题】稀疏几何的 3d 希尔伯特曲线【英文标题】:3d Hilbert Curve for a sparse geometry 【发布时间】:2011-10-16 16:54:34 【问题描述】:

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

【问题讨论】:

您是要遍历所有卷的单元格,还是只遍历非空单元格?您希望对单元格应用什么计算? 我只想遍历非空单元格,因为它们稍后将存储在数组中。我已经用更多信息更新了原始问题。 【参考方案1】:

希尔伯特曲线将是一项艰巨的任务。似乎很难找到一个允许随机访问曲线上点的索引的公式。

然而,Morton ordering 是合理的,并且具有一些与空间填充曲线相同的良好特性。还有一个随机访问过程可以找到一个 N 维点的莫顿数。

您可能会考虑一个两步过程:

    对您的数据应用流压缩步骤以选择您希望处理的卷元素

    使用他们的Morton indices as the sorting key对压缩后的数据进行排序。

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

这应该会生成一个按顺序排列的卷元素列表,以促进连续性。也就是说,重组数据的开销可能会主导原始不规则访问模式的成本。

【讨论】:

【参考方案2】:

这听起来很不可能。

您是否已经排除了 kdtree 或 octree?

数值配方中对kdtree(21.2章)和octree(21.8章)的描述很好理解: http://apps.nrbook.com/rollover/index.html

【讨论】:

以上是关于稀疏几何的 3d 希尔伯特曲线的主要内容,如果未能解决你的问题,请参考以下文章

稀疏解的几何理解

Python中的稀疏3d矩阵/数组?

从稀疏 3D 点云中检测静态和动态行人

基于3d稀疏卷积的centerpoint部署

在 Python 中生成 3D 希尔伯特空间填充曲线的算法

R中的多维稀疏数组(3路张量)