为什么不能重载 host/device CUDA C++ class 的成员函数

Why it is not possible to overload host/device member function of a CUDA C++ class

我有一个 3d 向量 class,其成员函数标记为主机和设备函数。下面是其中一个成员函数的片段:

__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 标志) 编译 Vector.cpp 文件时,出现以下错误

function "Vector::GetMagReciprocal" has already been defined

现在我想知道为什么 NVIDIA 不支持这种重载。

我可以想到实现分离的替代方法,但它们有自己的问题:

也许还有另一种更简单的方法可以实现这一点。如果有人有什么建议,那就太好了。

REEDITED:我没有提到使用 CUDA ARCH 标志进行条件编译以生成单独的主机和设备的可能性。这实际上是我在修改成员函数时做的第一件事。但是我想到了一些事情,说这行不通。也许我对这个编译标志的用法的理解是错误的。所以 sgarizvi suugested 的答案是正确的答案

您可以使用条件编译标志 __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;
}