Spec-Zone.ru › Eigen3

Директивы препроцессора

Вы можете контролировать некоторые аспекты Eigen, определяя токены препроцессора с помощью #define. Эти макросы должны быть определены до включения любых заголовков Eigen. Чаще всего их лучше всего задавать в опциях проекта.

На этой странице перечислены токены препроцессора, распознаваемые Eigen.

Макросы с основным эффектом

Эти макросы оказывают существенное влияние и, как правило, нарушают API (интерфейс прикладного программирования) и/или ABI (интерфейс двоичного кода приложения). Это может быть довольно опасно: если части вашей программы скомпилированы с одним вариантом, а другие части (или библиотеки, которые вы используете) скомпилированы с другим вариантом, ваша программа может не связаться или продемонстрировать скрытые ошибки. Тем не менее, эти параметры могут быть полезны для людей, которые знают, что делают.

  • EIGEN2_SUPPORT и EIGEN2_SUPPORT_STAGEnn_xxx отключены начиная с версии 3.3. Определение одного из них вызовет ошибку компиляции. Если вам нужно скомпилировать код Eigen2, посмотрите этот сайт.
  • EIGEN_DEFAULT_DENSE_INDEX_TYPE - тип для столбцов и строк индексов в матрицах, векторах и массивах (DenseBase::Index). По умолчанию устанавливается в std::ptrdiff_t.
  • EIGEN_DEFAULT_IO_FORMAT - IOFormat для использования при выводе матрицы, если не указан IOFormat. По умолчанию используется IOFormat, созданный конструктором по умолчанию IOFormat::IOFormat().
  • EIGEN_INITIALIZE_MATRICES_BY_ZERO - если определено, все элементы вновь созданных матриц и массивов инициализируются нулём, как и новые элементы в матрицах и массивах после изменения размера. По умолчанию не определено.
    Предупреждение
    Унарный (соответственно бинарный) конструктор 1x1 (соответственно 2x1 или 1x2) матриц фиксированного размера всегда интерпретируется как конструктор инициализации, где аргумент(ы) являются значениями коэффициентов, а не размерами. Например,
    Vector2d v(2,1); 
    
    создаст вектор с коэффициентами [2,1], а не вектор 2x1 , инициализированный нулями (т.е., [0,0]). Если такие случаи могут возникнуть, рекомендуется использовать конструктор по умолчанию с явным вызовом resize:
    Matrix<?,SizeAtCompileTime,1> v;
    v.resize(size);
    Matrix<?,RowsAtCompileTime,ColsAtCompileTime> m;
    m.resize(rows,cols);
    
  • EIGEN_INITIALIZE_MATRICES_BY_NAN - если определено, все элементы вновь созданных матриц и массивов инициализируются значением NaN, как и новые элементы в матрицах и массивах после изменения размера. Этот параметр особенно полезен для отладки, хотя инструмент для работы с памятью, например valgrind, предпочтительнее. По умолчанию не определено.
    Предупреждение
    См. документацию EIGEN_INITIALIZE_MATRICES_BY_ZERO для обсуждения ограничений этих макросов при применении к 1x1, 1x2, и 2x1 матрицам фиксированного размера.
  • EIGEN_NO_AUTOMATIC_RESIZING - если определено, матрицы (или массивы) по обе стороны от присваивания a = b должны иметь одинаковый размер; в противном случае Eigen автоматически изменяет размер a, чтобы он соответствовал нужному размеру. По умолчанию не определено.

Функциональные возможности C++

По умолчанию Eigen стремится автоматически обнаруживать и включать языковые функции во время компиляции на основе информации, предоставляемой компилятором.

  • EIGEN_MAX_CPP_VER - отключает использование функций C++, требующих версии, большей чем EIGEN_MAX_CPP_VER. Возможные значения: 03, 11, 14, 17 и т. д. Если не определено (по умолчанию), Eigen включает все функции, поддерживаемые компилятором.

Индивидуальные функции можно явно включить или отключить, определив соответствующий токен в 0 или 1 соответственно. Например, можно ограничить версию C++ C++03, определив EIGEN_MAX_CPP_VER=03, но при этом включить функции математики C99, определив EIGEN_HAS_C99_MATH=1.

  • EIGEN_HAS_C99_MATH - управляет использованием функций математики C99, таких как erf, erfc, lgamma и т. д. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_HAS_CXX11_MATH - управляет реализацией некоторых функций, таких как round, logp1, isinf, isnan и т. д. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_HAS_RVALUE_REFERENCES - определяет, поддерживаются ли ссылки на rvalue. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_HAS_STD_RESULT_OF - определяет, поддерживается ли std::result_of. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_HAS_VARIADIC_TEMPLATES - определяет, поддерживаются ли шаблоны с переменным числом аргументов. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_HAS_CONSTEXPR - определяет, поддерживаются ли ослабленные константные выражения. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<14.
  • EIGEN_HAS_CXX11_CONTAINERS - определяет, соответствуют ли контейнеры STL спецификациям C++11. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_HAS_CXX11_NOEXCEPT - определяет, поддерживается ли noexcept. Автоматическое обнаружение отключено, если EIGEN_MAX_CPP_VER<11.
  • EIGEN_NO_IO - Отключает любое использование и поддержку <iostreams>.

Утверждения

Библиотека Eigen содержит множество утверждений, чтобы предотвратить ошибки программирования, как во время компиляции, так и во время выполнения. Однако эти утверждения занимают время, и поэтому их можно отключить.

  • EIGEN_NO_DEBUG - отключает утверждения Eigen, если определено. По умолчанию не определено, если определён макрос NDEBUG (это стандартный макрос C++, отключающий все assert).
  • EIGEN_NO_STATIC_ASSERT - если определено, статические утверждения времени компиляции заменяются утверждениями времени выполнения; это экономит время компиляции. По умолчанию не определено.
  • eigen_assert - макрос с одним аргументом, используемый внутри Eigen для утверждений. По умолчанию он в основном определяется как assert, который завершает программу, если утверждение нарушено. Переопределите этот макрос, если хотите выполнить что-то другое, например, выбросить исключение.
  • EIGEN_MPL2_ONLY - отключает несовместимые с MPL2 функции или, другими словами, отключает функции, которые всё ещё находятся под лицензией LGPL.

Выравнивание, векторизация и настройка производительности

  • EIGEN_MALLOC_ALREADY_ALIGNED - Можно установить в 0 или 1, чтобы указать, возвращает ли стандартная система malloc уже выровненные буферы. Если не определено, эта информация автоматически выводится из маркеров компилятора и препроцессора системы.
  • EIGEN_MAX_ALIGN_BYTES - Должно быть степенью двойки или 0. Определяет верхнюю границу границ памяти в байтах, по которым данные, выделенные динамически и статически, могут быть выровнены Eigen. Если не определено, значение по умолчанию автоматически вычисляется на основе архитектуры, компилятора и ОС. Этот параметр обычно используется для обеспечения бинарной совместимости между кодом/библиотеками, скомпилированными с различными параметрами SIMD. Например, можно скомпилировать код AVX и обеспечить совместимость ABI с существующим кодом SSE, определив EIGEN_MAX_ALIGN_BYTES=16. В обратном случае, так как по умолчанию AVX подразумевает выравнивание 32 байт для наилучшей производительности, можно скомпилировать код SSE для обеспечения ABI-совместимости с кодом AVX, определив EIGEN_MAX_ALIGN_BYTES=32.
  • EIGEN_MAX_STATIC_ALIGN_BYTES - То же, что и EIGEN_MAX_ALIGN_BYTES, но только для статически выделенных данных. По умолчанию, если определен только EIGEN_MAX_ALIGN_BYTES, то EIGEN_MAX_STATIC_ALIGN_BYTES == EIGEN_MAX_ALIGN_BYTES, в противном случае значение по умолчанию автоматически вычисляется на основе архитектуры, компилятора и ОС (может быть меньше значения по умолчанию EIGEN_MAX_ALIGN_BYTES на архитектурах, которые не поддерживают выравнивание стека). Подчеркнём, что EIGEN_MAX_*_ALIGN_BYTES определяют только желаемую верхнюю границу. На практике данные выравниваются до наибольшего общего делителя степени двойки EIGEN_MAX_STATIC_ALIGN_BYTES и размера данных, таким образом, память не тратится впустую.
  • EIGEN_DONT_PARALLELIZE - При определении отключает многопоточность. Это актуально только если вы включили OpenMP. Подробности см. в разделе Eigen и многопоточность.
  • EIGEN_DONT_VECTORIZE - отключает явную векторизацию при определении. По умолчанию не определено, если только выравнивание не отключено тестом платформы Eigen или пользователем, определившим EIGEN_DONT_ALIGN.
  • EIGEN_UNALIGNED_VECTORIZE - отключает/включает векторизацию с невыровненными записями. Значение по умолчанию - 1 (включено). Если установить в 0 (выключено), выражения, для которых место назначения не может быть выровнено, не векторизуются (например, невыровненные небольшие векторы или матрицы фиксированного размера).
  • EIGEN_FAST_MATH - Включает некоторые оптимизации, которые могут повлиять на точность результата. В настоящее время это включает векторизацию SSE для sin() и cos(), а также ускорение sqrt() для одинарной точности. По умолчанию определено как 1. Определите его как 0, чтобы отключить.
  • EIGEN_UNROLLING_LIMIT - определяет размер цикла для включения мета-разворачивания. Установите его в ноль, чтобы отключить разворачивание. Размер цикла здесь выражается в собственном понятии Eigen "количество операций с плавающей точкой", он не соответствует количеству итераций или числу инструкций. Значение по умолчанию - 110.
  • EIGEN_STACK_ALLOCATION_LIMIT - Определяет максимальное количество байтов для буфера, который будет выделен в стеке. Для внутренних временных буферов используется динамическое выделение памяти в качестве резервного варианта. Для матриц или массивов фиксированного размера превышение этого порога приводит к проверке в момент компиляции. Используйте 0, чтобы установить ограничение. Значение по умолчанию - 128 КБ.
  • EIGEN_NO_CUDA - Отключает поддержку CUDA при определении. Может быть полезно в файлах .cu, в которых Eigen используется только на хосте и никогда не вызывается из кода устройства.
  • EIGEN_STRONG_INLINE - Этот макрос используется для квалификации критических функций и методов, которые мы ожидаем, что компилятор будет встраивать. По умолчанию он определен как __forceinline для MSVC и ICC и как inline для других компиляторов. Типичное использование состоит в том, чтобы определить его как inline для пользователей MSVC, желающих ускорить компиляцию, рискуя снижением производительности в некоторых редких случаях, когда MSVC-инлайнер не справляется со своей задачей.
  • EIGEN_DEFAULT_L1_CACHE_SIZE - Устанавливает размер кэша L1 по умолчанию, который используется в ядре GEBP Eigen, когда размер кэша не может быть определен во время выполнения.
  • EIGEN_DEFAULT_L2_CACHE_SIZE - Устанавливает размер кэша L2 по умолчанию, который используется в ядре GEBP Eigen, когда размер кэша не может быть определен во время выполнения.
  • EIGEN_DEFAULT_L3_CACHE_SIZE - Устанавливает размер кэша L3 по умолчанию, который используется в ядре GEBP Eigen, когда размер кэша не может быть определен во время выполнения.
  • EIGEN_DONT_ALIGN - Устаревшее, это синоним для EIGEN_MAX_ALIGN_BYTES=0. Полностью отключает выравнивание. Eigen не будет пытаться выравнивать свои объекты и не ожидает, что какие-либо объекты, передаваемые ему, будут выровнены. Это выключит векторизацию, если EIGEN_UNALIGNED_VECTORIZE=1. По умолчанию не определено.
  • EIGEN_DONT_ALIGN_STATICALLY - Устаревшее, это синоним для EIGEN_MAX_STATIC_ALIGN_BYTES=0. Отключает выравнивание массивов в стеке. По умолчанию не определено, если только EIGEN_DONT_ALIGN не определено.

Плагины

Возможно добавление новых методов к многим базовым классам в Eigen путём написания плагина. Как объясняется в разделе Расширение MatrixBase (и других классов), плагин задаётся определением макроса EIGEN_xxx_PLUGIN. Поддерживаются следующие макросы; ни один из них не определён по умолчанию.

  • EIGEN_ARRAY_PLUGIN - имя файла плагина для расширения класса Array.
  • EIGEN_ARRAYBASE_PLUGIN - имя файла плагина для расширения класса ArrayBase.
  • EIGEN_CWISE_PLUGIN - имя файла плагина для расширения класса Cwise.
  • EIGEN_DENSEBASE_PLUGIN - имя файла плагина для расширения класса DenseBase.
  • EIGEN_DYNAMICSPARSEMATRIX_PLUGIN - имя файла плагина для расширения класса DynamicSparseMatrix.
  • EIGEN_FUNCTORS_PLUGIN - имя файла плагина для добавления новых функций и специализаций functor_traits.
  • EIGEN_MAPBASE_PLUGIN - имя файла плагина для расширения класса MapBase.
  • EIGEN_MATRIX_PLUGIN - имя файла плагина для расширения класса Matrix.
  • EIGEN_MATRIXBASE_PLUGIN - имя файла плагина для расширения класса MatrixBase.
  • EIGEN_PLAINOBJECTBASE_PLUGIN - имя файла плагина для расширения класса PlainObjectBase.
  • EIGEN_QUATERNION_PLUGIN - имя файла плагина для расширения класса Quaternion.
  • EIGEN_QUATERNIONBASE_PLUGIN - имя файла плагина для расширения класса QuaternionBase.
  • EIGEN_SPARSEMATRIX_PLUGIN - имя файла плагина для расширения класса SparseMatrix.
  • EIGEN_SPARSEMATRIXBASE_PLUGIN - имя файла плагина для расширения класса SparseMatrixBase.
  • EIGEN_SPARSEVECTOR_PLUGIN - имя файла плагина для расширения класса SparseVector.
  • EIGEN_TRANSFORM_PLUGIN - имя файла плагина для расширения класса Transform.
  • EIGEN_VECTORWISEOP_PLUGIN - имя файла плагина для расширения класса VectorwiseOp.

Макросы для разработчиков Eigen

Эти макросы в основном предназначены для людей, разрабатывающих Eigen, и для целей тестирования. Несмотря на то, что они могут быть полезны продвинутым пользователям и любопытствующим для отладки и тестирования, они не должны использоваться в реальном коде.

  • EIGEN_DEFAULT_TO_ROW_MAJOR - при определении порядок хранения по умолчанию для матриц становится строчным вместо столбцового. По умолчанию не определено.
  • EIGEN_INTERNAL_DEBUGGING - при определении включает проверки в внутренних процедурах Eigen. Это полезно для отладки самого Eigen. По умолчанию не определено.
  • EIGEN_NO_MALLOC - при определении любой запрос изнутри Eigen на выделение памяти из кучи приводит к ошибке проверки. Это полезно для проверки того, что какая-либо процедура не выделяет память динамически. По умолчанию не определено.
  • EIGEN_RUNTIME_NO_MALLOC - при определении вводится новый переключатель, который можно включать и выключать с помощью вызова set_is_malloc_allowed(bool) Если malloc запрещён, и Eigen пытается выделить память динамически, возникает ошибка проверки. По умолчанию не определено.

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API