我有一个3d矢量类,其成员函数标记为主机和设备函数。下面是其中一个成员函数的片段:
__host__ __device__
double Vector::GetMagReciprocal()
{
double result = 1/sqrt(x*x + y*y + z*z);
return result;
}
我想要实现的是对主机和设备功能进行单独定义,以便在设备上执行时使用CUDA数学内部函数 rqsrt 可以获得更好的性能。我这样做的方法是为主机和设备重载这个成员函数:
__host__
double Vector::GetMagReciprocal()
{
double result = 1/sqrt(x*x + y*y + z*z);
return result;
}
__device__
double Vector::GetMagReciprocal()
{
double result = rsqrt(x*x + y*y + z*z);
return result;
}
现在,当我使用nvcc(-x cu flag)编译Vector.cpp文件时,出现以下错误
函数“Vector :: GetMagReciprocal”已经定义
现在我想知道为什么NVIDIA不支持这种超载。
我可以考虑实现分离的其他方式,但它们有自己的问题:
也许有另一种更简单的方法来实现这一目标。如果有人有任何建议,那就太好了。
REEDITED :我没有提到使用CUDA ARCH标志生成单独的主机和设备的条件编译的可能性。这实际上是我在修改成员函数时所做的第一件事。但有些事情在我脑海中浮现,说这不起作用。也许我对我对这个编译标志的使用的理解是错误的。因此,sgarizvi提出的答案是正确的答案
答案 0 :(得分:8)
您可以使用条件编译标记__CUDA_ARCH__
在__host__ __device__
函数中为主机和设备生成不同的代码。
__CUDA_ARCH__
仅针对设备代码定义,因此要为主机和设备创建不同的实现,您可以执行以下操作:
__host__ __device__
double Vector::GetMagReciprocal()
{
double result;
#ifdef __CUDA_ARCH__
result = rsqrt(x*x + y*y + z*z);
#else
result = 1/sqrt(x*x + y*y + z*z);
#endif
return result;
}