【发布时间】:2011-12-26 01:15:16
【问题描述】:
我的代码在很大程度上依赖于计算 3D 空间中两点之间的距离。 为了避免昂贵的平方根,我始终使用平方距离。 但它仍然占用了大部分计算时间,我想用更快的东西替换我的简单函数。 我现在有:
double distance_squared(double *a, double *b)
{
double dx = a[0] - b[0];
double dy = a[1] - b[1];
double dz = a[2] - b[2];
return dx*dx + dy*dy + dz*dz;
}
我也尝试使用宏来避免函数调用,但没有太大帮助。
#define DISTANCE_SQUARED(a, b) ((a)[0]-(b)[0])*((a)[0]-(b)[0]) + ((a)[1]-(b)[1])*((a)[1]-(b)[1]) + ((a)[2]-(b)[2])*((a)[2]-(b)[2])
我考虑过使用 SIMD 指令,但找不到一个好的示例或完整的指令列表(理想情况下是两个向量上的乘法+加法)。
GPU 不是一个选项,因为在每个函数调用中只知道一组点。
计算距离平方的最快方法是什么?
【问题讨论】:
-
如果您的点是静止的预计算(全部?)距离对可能是有益的。
-
您必须在其他地方进行优化。这应该已经是最佳的了(正如大卫所说)。也许您可以提供更广泛的问题视图..也许您不必重新计算所有内容或使用其他技巧..
-
您要整体计算什么。这显然是某些算法的底部,但是您是否试图在一组 n 或其他东西中找到两个点的闭合点。也许如果您描述您实际尝试计算的内容,可能会有替代算法而不是蛮力。
-
这些点不是静止的,因此无法进行预计算。我已经在考虑其他算法了。这不是蛮力代码(kdtree 实现)的一部分,但仍需要经常计算,以便对其进行优化。我只是想知道一般来说最快的方法是什么,因为我找不到有关该主题的任何信息。
标签: c optimization simd