CUDA - 计算2 float3之间欧氏距离的最有效方法是什么?

时间:2015-05-29 16:00:06

标签: cuda distance gpgpu

目前我正在使用以下代码来计算我从其中一个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));
}

有没有(可能更低级别)的方式更快地完成它?

1 个答案:

答案 0 :(得分:1)

CUDA在数学库中具有函数norm3d{f}(),这在计算3向量的欧几里德距离时是最佳的,因为它们确保了最大精度并避免了中间计算中的溢出。如果需要规范化向量,则需要查看rnorm3d{f}()。这些将是此操作的规范选择,应该是最佳的。

请注意,有可能以距离平方而不是距离运行计算,这将消除昂贵的平方根操作,并且应该比使用欧几里德距离快得多。

[这个答案主要来自评论,并作为社区wiki条目添加,以便从CUDA标签的未答复列表中获取问题]