Планирам да направя изпълнението на Verilog на KNN. Но проблемът е терминът за измерване на евклидовото разстояние, свързан с KNN, тъй като се нуждае от изваждане, повдигане на квадрат, събиране. Мисля, че кодът ще стане сложен, когато кодирам knn с евклидово distance.Is има някакъв прост метод (удобен за хардуер) за намиране на разстоянието, така че сложността на кода и следователно сложността на синтезираната верига ще намалее. Идеята ми е да съхраня кодовата книга в паметта и когато дадем вход, индексът на k най-близките съседи ще се генерира като изход.
k-алгоритъм за най-близък съсед във Verilog
Отговори (1)
Намирането на k-най-близките съседи включва две части: 1) Изчислете разстоянието между вашия входен вектор и всеки референтен вектор и 2) Намерете k най-малките разстояния.
За част 1) можете да проектирате конвейерна функция за евклидово разстояние, която се състои от изваждане, множител и акумулатор. Изваждането и натрупването (събирането) изискват относително малък тактов период спрямо умножението. В зависимост от широчината на битовете, може да си струва да ги тръбопроводите също. Умножителят с един цикъл ще изисква прекалено висок тактов период, така че със сигурност ще трябва да бъде конвейеризиран.
Тук предположих, че работите с цели числа; ако трябва да работите с плаваща запетая, тогава нямате късмет, тъй като умножението и събирането с плаваща запетая не могат да бъдат конвейерни поради тяхното различно разклоняване.
За част 2) трябва да сравните всички разстояния, за да намерите най-малкото k. Това може да стане по няколко начина; един възможен начин е с дърво от компаратори, което намира най-малкото разстояние. След като това бъде намерено, можете да премахнете това разстояние от набора от разстояния и да повторите k пъти.
Забележете, че за част 1 вие основно внедрявате функционалната единица на CPU/GPU; и това почти сигурно ще бъде по-бързо от внедряването на Verilog. Най-голямото подобрение, което ще получите спрямо CPU/GPU, е с част 2) намиране на k минимални разстояния.