Локализуйте параметры компиляции 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

Другие вопросы по тегам