2015-05-29 63 views
1

目前我使用下面的代码来计算两个float3之间的欧氏距离,我从一个Nvidia采样中获取。CUDA - 计算2个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)); 
} 

有没有(也许更低级别)的方式来做到更快?

+4

你真的需要的距离?你能以平方距离工作吗? – talonmies

+1

建立在talonmies暗含的意义上....'sqrtf'将主宰距离的计算时间。 –

+4

请注意,CUDA具有函数'norm3d {f}()',它在计算3-矢量的欧几里得距离时最为合适,因为它们可以确保最大的准确性并避免中间计算中的溢出。如果你需要对矢量进行归一化,那么你应该看看'rnorm3d {f}()'。 – njuffa

回答

1

CUDA在数学库中具有函数norm3d{f}(),它在计算3-矢量的欧几里得距离时是最合适的,因为它们确保最大精度并避免中间计算中的溢出。如果你需要对矢量进行归一化处理,你可以看看rnorm3d{f}()。那些将是这个操作的标准选择,应该是最佳的。

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

[这个答案大多来自评论组装并添加为社区维基条目,以获得问题关闭解答列表为CUDA标签]

相关问题