Я реализовал ближайшего соседа K на графическом процессоре, используя как чистые вызовы функций CUDA, так и библиотечные функции Thrust.
Евклидовы расстояния вычисляются с помощью чистого ядра CUDA. Затем используются средства сортировки Thrust (сортировка по основанию) для сортировки расстояний в порядке возрастания. Наконец, первые K элементов (т. Е. K ближайших соседей) извлекаются из отсортированных векторов.
Моя реализация работает хорошо. Однако сортировка всей матрицы евклидовых расстояний (наборы могут содержать более 250000
образцов поездов) только для получения K -nn кажется неоптимальной.
Поэтому я ищу реализацию алгоритма графического процессора, которая позволяет останавливать вычисления сортировки, как только будут найдены K наименьших элементов, или которая выполняет эффективную K из N сортировка. Это действительно будет быстрее для небольшого K, чем сортировка всей матрицы.
Если такая реализация недоступна, меня также будут интересовать советы по ее эффективной реализации на чистом CUDA или Thrust. Я думал использовать несколько потоков на тестовые образцы для поиска ближайшего K, причем каждый поток проходит на часть евклидовых расстояний. Я бы сохранил буфер размером K в общей памяти. Я пробегал через расстояния и вставлял Knn в вектор разделяемой памяти. Однако это потребует некоторой синхронизации уровня деформации и расхождения потоков.
Спасибо за помощь.