我有一个3d矢量类,其成员函数标记为主机和设备函数.下面是其中一个成员函数的片段:
__host__ __device__
double Vector::GetMagReciprocal()
{
double result = 1/sqrt(x*x + y*y + z*z);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是对主机和设备功能进行单独定义,以便在设备上执行时使用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;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我使用nvcc(-x cu flag)编译Vector.cpp文件时,出现以下错误
函数"Vector :: GetMagReciprocal"已经定义
现在我想知道为什么NVIDIA不支持这种超载.
我可以想到实现分离的其他方法,但它们有自己的问题:
也许有另一种更简单的方法来实现这一目标.如果有人有任何建议,那就太好了.
REEDITED:我没有提到使用CUDA ARCH标志生成单独的主机和设备的条件编译的可能性.这实际上是我在修改成员函数时所做的第一件事.但有些事情在我脑海中浮现,说这不起作用.也许我对我对这个编译标志的使用的理解是错误的.因此,sgarizvi提出的答案是正确的答案
在主机代码中,__CUDA_ARCH__宏似乎不会生成不同的代码路径,相反,它将生成代码以确保当前设备的代码路径.
但是,如果__CUDA_ARCH__在设备代码中,它将为编译选项(/ arch)中指定的不同设备生成不同的代码路径.
谁能证实这是正确的?