对矢量的最小K个元素进行排序,以在GPU上实现暴力K最近邻算法

时间:2014-07-04 18:41:09

标签: sorting cuda gpu thrust knn

我使用纯CUDA和Thrust库函数调用在GPU上实现了 K 最近邻居。

欧几里德距离是用纯CUDA内核计算的。然后,推力分选设施(基数排序)用于按递增顺序对距离进行排序。最后,从排序后的向量中检索 K 第一个元素(即 K 最近邻居)。

我的实施效果很好。但是,排序整个欧氏距离矩阵(集合可以包含超过250000列车样本)只是为了检索 K -nn似乎不是最优的。

因此,我正在寻找一种GPU算法实现,它允许在找到 K 最小元素后停止排序计算,或者执行高效的 K 输出 N 排序。对于小 K 而言,确实比对整个矩阵进行排序更快。

如果没有这样的实现,我也会对建议感兴趣,以便在纯CUDA或Thrust中有效地实现它。我想在每个测试样本中使用几个线程来查找最接近的 K ,每个线程都运行到欧氏距离的一部分。我会在共享内存中维护一个大小为 K 的缓冲区。我将遍历距离并将Knn插入共享内存向量中。但是,它需要一些warp级别同步和线程分歧。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您正在寻找 K 最近邻问题的方法,包括两个步骤:

  1. 找出元素之间的欧几里德距离;
  2. 查找提供K最小距离的第一个K元素。
  3. 似乎这种方法已经存在并已在

    中实施

    K.Kato and T.Hosino, "Solving k-Nearest Neighbor Problem on Multiple Graphics Processors"

    并在2009年GTC大会上作为

    提交

    K.Kato and T.Hosino, "You Might Also Like: A Multi-GPU Recommendation System"

    该方法通过

    解决了上述两个步骤
    1. 使用L.Nyland,M.Harris,J.Prins,“Fast N -body simulation with CUDA”开发的经典 N -body方法,在: GPU Gems III。 NVIDIA(2007)677-695计算欧氏距离;
    2. 使用partial sorting技术,基于并行的heapsort理念。
    3. 同样,正如我在上面的评论中所提到的,避免使用“蛮力”的更好方法是使用KD-trees