使用大规模并行算法在3D点数据中查找聚类

时间:2015-10-22 13:22:43

标签: algorithm parallel-processing

我在3D空间(x,y,z)中有大量的点,表示为3个浮点结构的数组。我还可以使用具有CUDA功能的强大显卡。我想要以下内容:

将数组中的点划分为群集,以便群集中的每个点与群集中的至少一个其他点的最大欧氏距离为X.

2D中的考试:enter image description here

“蛮力”这样做的方法当然是计算每个点和每个其他点之间的距离,看看是否有任何距离低于阈值X,如果是,则将这些点标记为属于相同的集群。这是一个O(n²)算法。

这可以在使用n²线程的CUDA中并行完成,但是有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

使用 binning

可以将算法简化为O(n)
  • 施加间隔为X的3D网格,即3D网格(网格的每个单元格是立方体网格);
  • 将空间中的每个点分配给相应的bin(几何上包含该点的bin);
  • 每当你需要评估一个点的距离时,你只需要使用点本身的bin中的点和26个相邻的bin中的点(3x3x3 = 27)

其他分档中的分数比X大,所以你根本不需要评估距离。

通过这种方式,假设点中的密度恒定,则必须仅为恒定数量的对点数/总点数计算距离。

将点分配给箱子也是O(n)。

如果这些点不是均匀分布的,那么这些区域可以更小(并且你必须考虑超过26个邻居来评估距离)并最终稀疏。

这是用于分子动力学,光线追踪,网格划分的典型技巧......但是我知道分子动力学模拟中的术语:可以改变名称(链接单元格,kd-tree也使用相同的原理) ,即使更加明确,算法保持不变!

而且,好消息是,该算法非常适合并行实现。

参考文献:

https://en.wikipedia.org/wiki/Cell_lists