C++11 用于constexpr深度和IEEE 754指数计算的NVIDIA nvcc编译标志
考虑以下代码,该代码以IEEE 754标准指定的格式将双浮点数的指数计算为常量表达式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_(
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只是在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将结果作为模板参数传递时,代码是否编译?