Флаг компиляции NVIDIA nvcc для глубины constexpr и вычисления степени IEEE 754 - PullRequest
0 голосов
/ 19 февраля 2019

Рассмотрим следующий код, который вычисляет показатель двойного числа с плавающей запятой как константное выражение (в формате, указанном в стандарте 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 рекурсивными вызовами?

1 Ответ

0 голосов
/ 20 февраля 2019

Вы должны рассмотреть возможность использования флага " - expt-relaxed-constexpr ":

Экспериментальный флаг:

Разрешить коду хоста вызывать __device__constexprфункции и код устройства для вызова __host__constexpr функций.

Обратите внимание, что поведение этого флага может измениться в будущих выпусках компилятора.

Также в Руководство по программированию CUDA C:

По умолчанию функция constexpr не может быть вызвана из функции с несовместимым пространством выполнения.Экспериментальный флаг nvcc --expt-relaxed-constexpr снимает это ограничение.Когда этот флаг указан, код хоста может вызывать функцию __device__ constexpr, а код устройства может вызывать функцию __host__ constexpr.

...