Я пытаюсь ускорить мою программу Matlab с использованием графического процессора, но поскольку функция «knnsearch» не поддерживает графический процессор, я решил написать свою собственную функцию перебораНайти K самых маленьких элементов в векторе, где K очень мало
(Конечно, есть другие варианты, такие как запись ядер CUDA или использование существующих библиотек, но настройка их должна занять некоторое время, а я на Windows 10, даже настройка Matlab для работы с файлами mex - это боль , с ошибками продолжают появляться ...., поэтому я буду придерживаться метода грубой силы на данный момент).
Несмотря на то, что это просто поиск грубой силы, я видел некоторые улучшения (код работает в 2 раза быстрее). Вот моя функция, а также результаты профилирования (это действительно коротко) Функция принимает одну точку запроса и находит K-ближайших соседей среди контрольных точек (все точки хранятся в gpuArray). Сначала я думал, что расчет расстояний займет больше времени, однако, как вы можете видеть в результатах профилировщика, сортировка была наиболее трудоемкой.
Я хотел бы улучшить код, оптимизировав ту часть, где вы найдете наименьшие элементы K в массиве. Обратите внимание, что K очень мало (K < = 50), тогда как количество точек данных очень велико (> = 10000). Я понимаю, что есть алгоритмы, адаптированные к этой конкретной задаче (например, heapsort, но вам просто нужна часть кучи), но я не уверен, как реализовать их с помощью GPU и не замедлять работу. Может кто-нибудь мне помочь? Большое спасибо :)
Какое количество контрольных точек? и каков размер размерности d? – rahnema1
@ rahnema1 Число контрольных точек> = 10000 и размер измерения d> = 100 –