2017-01-22 18 views
2

Я пытаюсь ускорить мою программу Matlab с использованием графического процессора, но поскольку функция «knnsearch» не поддерживает графический процессор, я решил написать свою собственную функцию перебораНайти K самых маленьких элементов в векторе, где K очень мало

(Конечно, есть другие варианты, такие как запись ядер CUDA или использование существующих библиотек, но настройка их должна занять некоторое время, а я на Windows 10, даже настройка Matlab для работы с файлами mex - это боль , с ошибками продолжают появляться ...., поэтому я буду придерживаться метода грубой силы на данный момент).

Несмотря на то, что это просто поиск грубой силы, я видел некоторые улучшения (код работает в 2 раза быстрее). Вот моя функция, а также результаты профилирования (это действительно коротко) enter image description here Функция принимает одну точку запроса и находит K-ближайших соседей среди контрольных точек (все точки хранятся в gpuArray). Сначала я думал, что расчет расстояний займет больше времени, однако, как вы можете видеть в результатах профилировщика, сортировка была наиболее трудоемкой.

Я хотел бы улучшить код, оптимизировав ту часть, где вы найдете наименьшие элементы K в массиве. Обратите внимание, что K очень мало (K < = 50), тогда как количество точек данных очень велико (> = 10000). Я понимаю, что есть алгоритмы, адаптированные к этой конкретной задаче (например, heapsort, но вам просто нужна часть кучи), но я не уверен, как реализовать их с помощью GPU и не замедлять работу. Может кто-нибудь мне помочь? Большое спасибо :)

+0

Какое количество контрольных точек? и каков размер размерности d? – rahnema1

+0

@ rahnema1 Число контрольных точек> = 10000 и размер измерения d> = 100 –

ответ

0

knnsearch поддерживается на графическом процессоре от MATLAB R2016b.

+0

Можете ли вы предоставить ссылку на документацию? Я попытался сделать Google, но для этого не было никакого результата :( –

+0

@DangManhTruong См. Https://www.mathworks.com/help/stats/release-notes.html. '" Поддержка GPU: pdist, pdist2 и knnsearch принимают gpuArray «под R2016b. – beaker

+0

@beaker: Большое спасибо. Я установлю эту версию и посмотрю, может ли она предложить ускорение. –