超快速的 k 近邻与全 k 近邻搜索算法
1. 背景与问题提出
在高性能计算领域,有研究表明在矩阵乘法并行化时,共享内存比 GPU 内存更快,通过避免分支操作,能实现超线性加速。在 GPU 中,有足够的计算能力一步计算出查询与数据库中所有元素的距离。而且,可用线程数量远多于全局 GPU 内存中分配的数据库元素数量。然而,计算完所有距离后,如何识别出距离最小的对象是个挑战,关键在于避免线程间的干扰(即避免比较两个线程的结果)。
这个问题可以类比为:在一个有一千人的房间里,每个人拿到一张写有数字的纸,如何在不与他人交流的情况下,知道自己是否是数字最小的 k 个人之一。排序算法对于这个问题来说过于复杂,逐个查看他人数字的方法又太慢。因此,需要一种无需中央监督就能找出数组中前 k 个最小元素的算法。
2. 解决方案
为了找出数组中前 k 个最小元素,实现了三种不同的解决方案,具体流程如下:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(计算查询与数据库元素的距离):::process
B --> C(Partition: 划分工作子