我想在主机和设备端有一个类的相同成员函数的两个版本。 让我们说
class A {
public:
double stdinvcdf(float x) {
static normal boostnormal(0, 1);
return boost::math::cdf(boostnormal,x);
}
__device__ double stdinvcdf(float x) {
return normcdfinvf(x);
}
};
但是当我使用nvcc编译此代码时,它会因function redefinition
错误而中止。
答案 0 :(得分:5)
CUDA / C ++不支持这种函数重载,因为最终没有不同的函数签名。同时使用host
和device
版本的常用方法是将__host__
与__device__
结合使用#ifdef
,例如。
__host__ __device__ double stdinvcdf(float x)
{
#ifdef __CUDA_ARCH__
/* DEVICE CODE */
#else
/* HOST CODE */
#endif
}
此解决方案也在NVIDIA开发人员论坛中进行了in this thread讨论。