具有相同签名的功能

时间:2013-12-31 09:21:22

标签: 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);
    }  
};

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

1 个答案:

答案 0 :(得分:5)

CUDA / C ++不支持这种函数重载,因为最终没有不同的函数签名。同时使用hostdevice版本的常用方法是将__host____device__结合使用#ifdef,例如。

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

此解决方案也在NVIDIA开发人员论坛中进行了in this thread讨论。