【问题标题】:Find clusters in 3D point data using a massively parallel algorithm使用大规模并行算法在 3D 点数据中查找集群
【发布时间】:2015-10-22 13:22:43
【问题描述】:

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

将数组中的点分成簇,使簇中的每个点到簇中至少一个其他点的最大欧几里德距离为 X。

2D 示例:

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

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

【问题讨论】:

    标签: algorithm parallel-processing


    【解决方案1】:

    使用binning可以将算法简化为O(n):

    • 施加间隔为 X 的 3D 网格,即 3D 格子(格子的每个单元格都是一个立方箱);
    • 将空间中的每个点分配给相应的 bin(几何上包含这些点的 bin);
    • 每次您需要评估与一个点的距离时,您只需使用该点本身的 bin 中的点以及 26 个相邻 bin 中的点 (3x3x3 = 27)

    其他 bin 中的点比 X 更远,因此您根本不需要评估距离。

    这样,假设点的密度恒定,您只需计算恒定数量的对点/总点数的距离。

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

    如果点分布不均匀,则 bin 可能会更小(并且您必须考虑超过 26 个邻居来评估距离)并最终变得稀疏。

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

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

    参考:

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

    【讨论】:

    • 那么一些点可能彼此靠近(比 X 更近)但分配给两个相邻的 bin? @Hosdgfag2 如果 i 和 j 在两个不同的集群中,那么你需要 dist(i,j)>X 吗?
    • 是的:箱子是立方体的,一个点可以靠近立方体的一个面。可以保证,使用 edge=X 的立方体,距离
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2022-01-01
    • 2019-03-23
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多