c++ - 为什么不可能重载 CUDA C++ 类的主机/设备成员函数

标签 c++ cuda overloading device member-functions

<分区>

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

__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 不支持这种重载。

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

  • 在 vector 类中为主机和设备创建单独的成员函数,比如 GetMagReciprocalHostGetMagReciprocalDevice 并在主机/设备代码中调用适当的函数
  • 有一个成员函数GetMagReciprocal,但将一个标志传递给成员函数以在主机代码和设备代码之间进行选择

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

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

关于c++ - 为什么不可能重载 CUDA C++ 类的主机/设备成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29668884/

相关文章:

c++ - 在 OS X 中从 main 返回时中止陷阱 6 但在 linux 中不

opencv - 是否可以直接从USB网络摄像头读取GPU内存

c# - .net 根据参数类型选择了错误的调用方法

c++ - 在父容器中调用基于子容器的重载函数

kotlin - Kotlin函数重载(varargs与单个参数)

C++:使用 mem_fn 和 bind1st 创建函数对象

C++11 constexpr 过时的模板元编程?

C++:类 "X"没有名为 "Y"的成员

c++ - 链接 Cuda (cudart.lib) 使 DXGI DuplicateOutput1() 失败

python - 是否可以调用间接调用另一个 cuda.jit 函数的 cuda.jit 函数?