C++ 为什么不能重载CUDA C+的主机/设备成员功能+;班

C++ 为什么不能重载CUDA C+的主机/设备成员功能+;班,c++,cuda,overloading,device,member-functions,C++,Cuda,Overloading,Device,Member Functions,我有一个3d向量类,其成员函数标记为主机和设备函数。下面是其中一个成员函数的片段: __host__ __device__ double Vector::GetMagReciprocal() { double result = 1/sqrt(x*x + y*y + z*z); return result; } 我想要实现的是对主机和设备函数有单独的定义,以便在设备上执行时使用CUDA math内在函数rqsrt可以获得更好的性能。我的方法是为主机和设备重载此成员函数: __ho

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

__host__ __device__
double Vector::GetMagReciprocal()
{
    double result = 1/sqrt(x*x + y*y + z*z);
    return result;
}
我想要实现的是对主机和设备函数有单独的定义,以便在设备上执行时使用CUDA math内在函数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文件时,我得到以下错误

已定义函数“Vector::GetMag倒数”

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

我可以想出其他实现分离的方法,但它们有自己的问题:

  • 在vector类中为主机和设备创建单独的成员函数,如GetMagReciproCarHost和GetMagReciproCarDevice,并在主机/设备代码中调用相应的函数
  • 具有单个成员函数,但向成员函数传递一个标志,以便在主机代码和设备代码之间进行选择
也许还有另一种更简单的方法来实现这一点。如果有人有什么建议,那就好了


重新编辑:我没有提到使用CUDA ARCH标志生成单独主机和设备的条件编译的可能性。这实际上是我在修改成员函数时做的第一件事。但我的脑海里浮现出这样的想法:这行不通。也许我对这个编译标志用法的理解是错误的。因此,sgarizvi给出的答案是正确的

您可以使用条件编译标志
\uuuuuu CUDA\u ARCH\uuuu
\uuuuuuuu主机\uuuuuuuuuuu设备
函数中为主机和设备生成不同的代码

\uuuuu CUDA\u ARCH\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

__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;
}

我总是使用nvcc编译,所以它为主机和设备功能生成相同的代码。不起作用这是绝对正确的答案,任何关于这不起作用的断言都是完全错误的。@nurabha不,它不会为主机和设备生成相同的代码<代码>nvcc
不是编译器。它是一个编译器驱动程序,将代码传递给后端的实际主机和设备编译器。将生成代码的两个版本。一个是主机编译器,一个是设备编译器。@sgarizvi:我知道nvcc是一个编译器驱动程序。@nurabha。。。好的,你能解释一下你想要的是什么吗?我是说为什么你需要两个独立的函数?如果您能添加更多详细信息,我们可能会提供另一种解决方案。
CUDA_ARCH
确实解决了这个问题。您可以使用
\uuuuuu host\uuuuu
\uuuu device\uuuuuu
来修饰单个函数,然后使用
CUDA\u ARCH
宏的条件编译来更改设备代码的代码生成。这是我做的第一件事。但在我看来,它似乎不起作用。如果你提供了一个简短、完整的代码,其他人可以复制、粘贴、编译和运行,看看问题出在哪里,我相信这是可以解释的。但是一些小代码片段以及“这不起作用”的断言是不可能为您整理出来的。我认为,如果这个问题不是以重复的形式结束的话,它也可以以缺少一个重复的形式结束。请务必在将来提供MCVE。