Директивы препроцессора
Вы можете контролировать некоторые аспекты 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