OpenCL を使用して、2 組の 3D ポイント間の最近傍を見つけています。
Nearest Neighbour: DataSet 内の各ポイント (x、y、z) について、モデル内で最も近いものを見つける必要があります。二乗距離 = (Ax-Bx)^2 + (Ay-By)^2 + (Az-Bz)^2
ここで私がこれまでに行ったこと:
struct point {
int x;
int y;
int z;
};
__kernel void
nearest_neighbour(__global struct point *model,
__global struct point *dataset,
__global int *nearest,
const unsigned int model_size)
{
int g_dataset_id = get_global_id(0);
int dmin = -1;
int d, dx, dy, dz;
for (int i=0; i<model_size; ++i) {
dx = model[i].x - dataset[g_dataset_id].x;
dx = dx * dx;
dy = model[i].y - dataset[g_dataset_id].y;
dy = dy * dy;
dz = model[i].z - dataset[g_dataset_id].z;
dz = dz * dz;
d = dx + dy + dz;
if(dmin == -1 || d < dmin)
{
nearest[g_dataset_id] = i;
dmin = d;
}
}
}
コードは機能しているように見えますが、最適化できると確信しています。ローカルメモリを利用して改善する方法を知りたいです。
ありがとう
PS kd-tree のように、最も近い隣人を見つけるための他の (より良い) 方法があることは知っていますが、今のところ、簡単な方法を実行したいと思います。