Рассмотрим следующий код, который вычисляет показатель двойного числа с плавающей запятой как константное выражение (в формате, указанном в стандарте 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);}
Этот код не компилируется как константное выражениев gcc при нормальных условиях флагов компиляции для определенных входных данных, таких как std :: numeric_limits :: max.Причина, по которой он не компилируется, заключается в том, что он превышает максимальную глубину рекурсии для константного выражения (512 является значением по умолчанию).Например, для std :: numeric_limits :: max требуется 1024 вызова, что превышает ограничение.
Если добавлен флаг -fconstexpr-deep = 2048, то код отлично компилируется и вычисляется как константное выражение.это может быть передано в качестве параметра шаблона.
Этот код не может быть скомпилирован под nvcc с флагом -Xcompiler -fconstexpr-depth=2048
(в частности, он падает, когда nvcc выдает команду cicc), поэтому есть ли способ изменить ограничение глубиныв nvcc?Я не нашел ни одного флага, чтобы изменить его в Опции NVCC .
На всякий случай, если в nvcc нет такого эквивалентного флага, кто-нибудь знает какой-либо другой способ вычисления степени двойногово время компиляции с менее чем 512 рекурсивными вызовами?