具有相同签名的函数

Posted

技术标签:

【中文标题】具有相同签名的函数【英文标题】:Function with same signature 【发布时间】:2013-12-31 09:21:21 【问题描述】:

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

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】:

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 也讨论了此解决方案。

【讨论】:

谢谢,真的很有帮助。 多么不幸。让您希望 nVIDIA 有一个功能申请表。

以上是关于具有相同签名的函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥具有“相同签名”的模板和非模板函数重载调用非模板函数?

为啥具有相同名称但不同签名的多个继承函数不会被视为重载函数?

派生类中具有相同名称但不同签名的函数

TypeScript 类方法具有与构造函数相同的重载签名

当两个重载具有相同的签名时调用构造函数重载

Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误