-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnearestNeighbor.cpp
81 lines (74 loc) · 3.04 KB
/
nearestNeighbor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
======================================================
Copyright 2017 Liang Ma
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
======================================================
======================================================
Copyright 2016 Fahad Bin Muslim
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
======================================================
*
* Author: Liang Ma
*
* This C++ code is based on the OpenCL code by Fahad Bin Muslim at https://github.com/fahadmuslim/KNN.
* This kernel aims to calculate the distances
* between the query point and all the points in reference data set.
*
*----------------------------------------------------------------------------
*/
#include "params.h"
// This computes the resultsCount nearest neighbors, one per work item.
extern "C" void nearestNeighbor (float*dist, float *d_distances,
int *indices,
const float numRecords,
const float resultsCount
) {
#pragma HLS interface m_axi port = d_distances bundle = gmem
#pragma HLS interface s_axilite port = d_distances bundle = control
#pragma HLS interface m_axi port = dist bundle = gmem
#pragma HLS interface s_axilite port = dist bundle = control
#pragma HLS interface m_axi port = indices bundle = gmem0
#pragma HLS interface s_axilite port = indices bundle = control
#pragma HLS interface s_axilite port = numRecords bundle = gmem
#pragma HLS interface s_axilite port = resultsCount bundle = gmem
#pragma HLS interface s_axilite port = numRecords bundle = control
#pragma HLS interface s_axilite port = resultsCount bundle = control
#pragma HLS interface s_axilite port = return bundle = control
float dmin1 = 0;
int numR = *(int*)&numRecords;
int count = *(int*)&resultsCount;
for(int localId=0;localId < count; localId++) {
float dist1;
float dmin = INFINITY;
int count = 0;
for (int k = 0; k < numR; k++) {
#pragma HLS PIPELINE
dist1 = dist[k];
if (dist1 < dmin && dist1 > dmin1) {
dmin = dist1;
count = k;
}
if (k == numR-1) {
dmin1 = dmin;
indices[localId] = count;
d_distances[localId] = dmin;
}
}
}
}