C++11 用于constexpr深度和IEEE 754指数计算的NVIDIA nvcc编译标志

C++11 用于constexpr深度和IEEE 754指数计算的NVIDIA nvcc编译标志,c++11,cuda,constexpr,ieee-754,nvcc,C++11,Cuda,Constexpr,Ieee 754,Nvcc,考虑以下代码,该代码以IEEE 754标准指定的格式将双浮点数的指数计算为常量表达式 template <typename T> constexpr T abs_CE(const T x){return x>=0?x:-x;} constexpr unsigned long long int __double_exponent_CE_(const double x){return x==0?0:(x>=2.?(__double_exponent_CE_(

考虑以下代码,该代码以IEEE 754标准指定的格式将双浮点数的指数计算为常量表达式

    template <typename T>  constexpr T abs_CE(const T x){return x>=0?x:-x;}
    constexpr unsigned long long int __double_exponent_CE_(const double x){return x==0?0:(x>=2.?(__double_exponent_CE_(x/2.)+1):(x<1?__double_exponent_CE_(x*2.)-1:0));}
    constexpr unsigned long long int __double_exponent_CE(const double x){return (x==0)?0:(__double_exponent_CE_(abs_CE(x))+1023);}
在某些输入(如std::numeric_limits::max)的正常编译标志情况下,该代码无法编译为gcc中的常量表达式。它无法编译的原因是它超过了常量表达式的最大递归深度512是默认值。例如,std::numeric_limits:max需要1024个调用,超过了限制

如果添加了-fconstexpr depth=2048标志,那么代码将完美编译,并计算为可以作为模板参数传递的常量表达式

该代码无法在nvcc下编译,标记为-Xcompiler-fconstexpr depth=2048,特别是当nvcc发出cicc命令时,它会崩溃,那么有没有办法更改nvcc中的深度限制?我还没有找到任何可以更改它的标志

只是在NVCC中没有这样的等价标志,有没有人知道在编译时用双倍的指数来计算少于512次递归调用的指数?

你应该考虑使用标志:

实验旗:

允许主机代码调用_设备_constexpr函数,允许设备代码调用_主机_constexpr函数

请注意,在未来的编译器版本中,此标志的行为可能会更改

还包括:

默认情况下,不能从具有不兼容执行空间的函数调用constexpr函数。实验性的nvcc标志-expt relaxed constexpr消除了这个限制。指定此标志后,主机代码可以调用_u设备_uuconstexpr函数,而设备代码可以调用_u主机_uuconstexpr函数


C++14允许在constexpr函数中进行迭代。这可以避免递归深度问题。您发布的代码在CUDA 10上编译得非常干净,nvcc-std=c++11 t400.cu,centOS 7,gcc 4.8。5@RobertCrovella当您使用输入std::numeric\u limits::max将结果作为模板参数传递时,代码是否编译?