相关疑难解决方法(0)

为什么不能使CUDA C++类的主机/设备成员函数超载

我有一个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不支持这种超载.

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

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

也许有另一种更简单的方法来实现这一目标.如果有人有任何建议,那就太好了.

REEDITED:我没有提到使用CUDA ARCH标志生成单独的主机和设备的条件编译的可能性.这实际上是我在修改成员函数时所做的第一件事.但有些事情在我脑海中浮现,说这不起作用.也许我对我对这个编译标志的使用的理解是错误的.因此,sgarizvi提出的答案是正确的答案

c++ cuda overloading device member-functions

3
推荐指数
1
解决办法
1693
查看次数

__CUDA_ARCH__宏的行为

在主机代码中,__CUDA_ARCH__宏似乎不会生成不同的代码路径,相反,它将生成代码以确保当前设备的代码路径.

但是,如果__CUDA_ARCH__在设备代码中,它将为编译选项(/ arch)中指定的不同设备生成不同的代码路径.

谁能证实这是正确的?

cuda gpu nvidia

1
推荐指数
1
解决办法
4193
查看次数

标签 统计

cuda ×2

c++ ×1

device ×1

gpu ×1

member-functions ×1

nvidia ×1

overloading ×1