我有一个3D向量类,其中的成员函数标记为主机和设备函数。以下是其中一个成员函数的片段:
__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文件时,我会收到以下错误信息:
“函数“Vector :: GetMagReciprocal”已经定义”
现在我想知道为什么NVIDIA不支持这种重载方式。
我可以想到其他方式来实现分离,但它们也有自己的问题:
1. 在向量类中创建单独的主机和设备成员函数,比如 GetMagReciprocalHost 和 GetMagReciprocalDevice,并在主机/设备代码中调用适当的函数。 2. 有一个单一的成员函数GetMagReciprocal,但是将标志传递给成员函数以在主机代码和设备代码之间选择。
也许有另一种更简单的实现方法。如果有人有任何建议,那就太好了。
修订:我没有提及使用CUDA ARCH标志进行条件编译以生成单独的主机和设备的可能性。这实际上是我修改成员函数时做的第一件事。但是我想到了一些东西,说这不起作用。也许我对使用这个编译标志的理解是错误的。因此,sgarizvi建议的答案是正确的。
CUDA_ARCH
确实解决了这个问题。您可以使用__host__
和__device__
两个修饰符装饰一个函数,然后使用CUDA_ARCH
宏进行条件编译,以改变设备代码的代码生成方式。 - Robert Crovella