我使用纯CUDA和Thrust库函数调用在GPU上实现了 K 最近邻居。
欧几里德距离是用纯CUDA内核计算的。然后,推力分选设施(基数排序)用于按递增顺序对距离进行排序。最后,从排序后的向量中检索 K 第一个元素(即 K 最近邻居)。
我的实施效果很好。但是,排序整个欧氏距离矩阵(集合可以包含超过250000
列车样本)只是为了检索 K -nn似乎不是最优的。
因此,我正在寻找一种GPU算法实现,它允许在找到 K 最小元素后停止排序计算,或者执行高效的 K 输出 N 排序。对于小 K 而言,确实比对整个矩阵进行排序更快。
如果没有这样的实现,我也会对建议感兴趣,以便在纯CUDA或Thrust中有效地实现它。我想在每个测试样本中使用几个线程来查找最接近的 K ,每个线程都运行到欧氏距离的一部分。我会在共享内存中维护一个大小为 K 的缓冲区。我将遍历距离并将Knn插入共享内存向量中。但是,它需要一些warp级别同步和线程分歧。
感谢您的帮助。
答案 0 :(得分:1)
您正在寻找 K 最近邻问题的方法,包括两个步骤:
K
最小距离的第一个K
元素。似乎这种方法已经存在并已在
中实施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"
该方法通过
解决了上述两个步骤同样,正如我在上面的评论中所提到的,避免使用“蛮力”的更好方法是使用KD-trees。