目前我正在使用以下代码来计算我从其中一个Nvidia样本中获取的两个float3之间的欧氏距离。
inline __host__ __device__ float3 operator-(float3 a, float3 b)
{
return make_float3(a.x - b.x, a.y - b.y, a.z - b.z);
}
inline __host__ __device__ float dot(float3 a, float3 b)
{
return a.x * b.x + a.y * b.y + a.z * b.z;
}
inline __host__ __device__ float euclideanDistance(float3 v)
{
return sqrtf(dot(v, v));
}
有没有(可能更低级别)的方式更快地完成它?
答案 0 :(得分:1)
CUDA在数学库中具有函数norm3d{f}()
,这在计算3向量的欧几里德距离时是最佳的,因为它们确保了最大精度并避免了中间计算中的溢出。如果需要规范化向量,则需要查看rnorm3d{f}()
。这些将是此操作的规范选择,应该是最佳的。
请注意,有可能以距离平方而不是距离运行计算,这将消除昂贵的平方根操作,并且应该比使用欧几里德距离快得多。
[这个答案主要来自评论,并作为社区wiki条目添加,以便从CUDA标签的未答复列表中获取问题]