具有相同签名的功能

Ita*_*chi 2 cuda overloading nvcc

我想在主机和设备端有一个类的相同成员函数的两个版本.让我们说

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);
    }  
};
Run Code Online (Sandbox Code Playgroud)

但是当我使用nvcc编译此代码时,它会中止function redefinition错误.

Seb*_*ler 5

CUDA/C++不支持这种函数重载,因为最终没有不同的函数签名.常用的方法有两种,即hostdevice版本是使用__host__结合__device__一起用#ifdef,如

__host__ __device__ double stdinvcdf(float x)
{
#ifdef __CUDA_ARCH__
    /* DEVICE CODE */
#else
    /* HOST CODE */
#endif
}
Run Code Online (Sandbox Code Playgroud)

此解决方案也在NVIDIA开发人员论坛的这个主题中讨论过.