Локализуйте параметры компиляции g++ в коде
Я ищу простой способ локализовать определенные опции компиляции g++ (g++-4.9) для определенных строк кода или, по крайней мере, целевых функций. Я в целом заинтересован, но и конкретно -fast-math
, -ffinite-math-only
а также -fno-signed-zeros
опции.
Я предполагаю, что локализация на уровне файла *.cpp возможна с make
утилита, но я надеюсь, что есть способ включить его в самом коде, через #pragma или __attribute__ или что-то еще. Я хочу сделать это не только для минимизации зависимостей от внешних файлов (то есть риск неправильного makefile
) но также, мы надеемся, гиперлокализовать определенное поведение ФП для конкретных уравнений внутри функции.
В качестве альтернативы, если локализация поведения FP с помощью встроенных директив НЕ возможна, что я могу сделать, чтобы хотя бы вызвать ошибку времени компиляции, если нужная директива компилятора НЕ включена в сборке проекта (например, makefile
утерян или ненадлежащим образом изменен).
Я бы предположил, что такая встроенная оптимизация может зависеть от компилятора, в данном случае g ++, но я готов пойти на компромисс.
3 ответа
В gcc
Вы можете использовать атрибут функции optimize
:
void f () __attribute__ ((optimize("fast-math"), optimize("finite-math-only"), optimize("no-signed-zeros")));
Я не уверен, что вы используете слово "локализовать" правильно. Локализация связана с адаптацией программного обеспечения для пользователей разных человеческих языков (французский, русский, китайский...)
Возможно, вы захотите попросить компилятор оптимизироватьнекоторые функции с помощью других флагов оптимизации.
Это возможно с помощью#pragma GCC optimize
и т. д.... или используя некоторые атрибуты функции
Вы могли бы включить некоторые биты этого с помощью fpmath
вариант в атрибуте функции, но это не было ясно из документов. В свете этого я сосредоточусь на обнаружении:
-fast-math
уже включается -ffinite-math-only
так что вам не нужно беспокоиться об этом. Документы для -fast-math
сказать:
Эта опция заставляет макрос препроцессора FAST_MATH быть определенным.
Что означает, что это может быть обнаружено с помощью
#ifndef __FAST_MATH__
#error "The -fast-math compiler option is required"
#endif
Я еще не нашел способ компиляции, чтобы обнаружить присутствие -fno-signed-zeros