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

Sorting 对向量的最小K个元素进行排序以在GPU上实现蛮力K近邻算法,sorting,cuda,gpu,thrust,knn,Sorting,Cuda,Gpu,Thrust,Knn,我使用纯CUDA和推力库函数调用在GPU上实现了一个K-最近邻 欧几里德距离是用纯CUDA核计算的。然后,使用推力排序工具(基数排序)按递增顺序对距离进行排序。最后,从排序向量中检索K个第一元素(即K个最近邻) 我的实现运行良好。然而,仅仅为了检索K-nn而对整个欧几里德距离矩阵(集合可以包含超过250000个训练样本)进行排序似乎不是最优的 因此,我正在寻找一种GPU算法实现,它允许在找到K个最小元素后停止排序计算,或者执行有效的N取K排序。对于小K,它确实比对整个矩阵进行排序要快 如果这样的

我使用纯CUDA和推力库函数调用在GPU上实现了一个K-最近邻

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

我的实现运行良好。然而,仅仅为了检索K-nn而对整个欧几里德距离矩阵(集合可以包含超过250000个训练样本)进行排序似乎不是最优的

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

如果这样的实现不可用,我也会感兴趣的建议,以实现它在纯CUDA或推力有效。我在考虑对每个测试样本使用几个线程来查找最近的K,每个线程运行到欧几里德距离的一部分。我会在共享内存中维护一个大小为K的缓冲区。我将遍历这些距离,并将Knn插入共享内存向量中。但是,它需要一些扭曲级别的同步和线程发散


感谢您的帮助。

您正在寻找一种解决K-最近邻问题的方法,该方法包括两个步骤:

  • 求元素之间的欧氏距离
  • 查找提供
    K
    最小距离的第一个
    K
    元素
  • 这种方法似乎已经存在,并已在欧洲实施

    并在2009年GTC会议上作为

    该方法通过以下步骤解决上述两个步骤:

  • 使用L.Nyland,M.Harris,J.Prins,“CUDA快速N体模拟”,在:GPU Gems III.NVIDIA(2007)677–695中开发的经典N体方法来计算欧氏距离
  • 使用该技术,基于并行堆的思想

  • 同样,正如我在上面的评论中提到的,避免使用“暴力”的更好方法是使用

    对于StackOverflow,建议或查找库的问题是离题的。然而,在我看来,你最好需要一种方法,而不是一个图书馆。你不妨据此重新提出你的问题。据我所知,K-最近邻是通过KD树方法有效解决的,请参见示例。@JackOLantern谢谢您的回答。然而,我的目标是在GPU上实现“蛮力”KNN算法,而不是kd树版本。你们是对的,提出推荐图书馆的问题是离题的,所以我修改了我的问题。我希望现在一切都好。谢谢你@Jackolanten这正是我想要的。这些科学论文很有用。我只是依靠你,但你的想法似乎更聪明。