Spec-Zone.ru › GNU Fortran 9

2.9 Параметры для соглашений о генерации кода

Эти независимые от машины параметры контролируют соглашения об интерфейсе, используемые при генерации кода.

Большинство из них имеют как положительную, так и отрицательную форму; отрицательная форма -ffoo будет -fno-foo. В таблице ниже указана только одна из форм — та, которая не является по умолчанию. Вы можете определить другую форму, либо удалив no-, либо добавив её.

-fno-automatic

Обращайтесь с каждой программой (кроме отмеченных как RECURSIVE) так, как если бы для каждой локальной переменной и массива, на которые в ней ссылаются, было указано оператор SAVE. Не влияет на общие блоки. (Некоторые компиляторы Fortran предоставляют этот вариант под именем -static или -save.) По умолчанию, которое является -fautomatic, для локальных переменных меньше заданного значения -fmax-stack-var-size используется стек. Используйте опцию -frecursive, чтобы не использовать статическую память.

Локальные переменные или массивы, имеющие явное атрибут SAVE , молча игнорируются, если не добавлена опция -pedantic.

-ff2c

Генерировать код, предназначенный для совместимости с кодом, сгенерированным g77 и f2c.

Вызовы, используемые g77 (первоначально реализованные в f2c), требуют, чтобы функции, возвращающие тип по умолчанию REAL, фактически возвращали тип C double, а функции, возвращающие тип COMPLEX, возвращали значения через дополнительный аргумент в последовательности вызовов, указывающий, куда сохранить возвращаемое значение. При использовании стандартных соглашений о вызовах GNU такие функции просто возвращают свои результаты так же, как и в GNU C — функции по умолчанию REAL возвращают тип C float, а функции COMPLEX возвращают тип GNU C complex. Кроме того, эта опция подразумевает опцию -fsecond-underscore, если явно не запрошена опция -fno-second-underscore.

Это не влияет на генерацию кода, взаимодействующего с библиотекой libgfortran.

Предупреждение: Не рекомендуется смешивать код Fortran, скомпилированный с -ff2c, с кодом, скомпилированным со стандартными соглашениями о вызовах -fno-f2c, так как вызов COMPLEX или стандартных функций REAL между частями программы, скомпилированными с различными соглашениями о вызовах, приведет к ошибке во время выполнения.

Предупреждение: Это нарушит код, передающий встроенные функции типа по умолчанию REAL или COMPLEX в качестве фактических аргументов, так как реализации библиотек используют соглашения о вызовах -fno-f2c.

-fno-underscoring

Не преобразовывать имена сущностей, указанные в исходном файле Fortran, добавляя к ним нижние подчёркивания.

При использовании -funderscoring, GNU Fortran добавляет одно нижнее подчёркивание к внешним именам без нижних подчёркиваний. Это делается для обеспечения совместимости с кодом, созданным многими компиляторами Fortran для UNIX.

Предупреждение: По умолчанию поведение GNU Fortran несовместимо с f2c и g77, пожалуйста, используйте опцию -ff2c, если вы хотите, чтобы объектные файлы, скомпилированные с помощью GNU Fortran, были совместимы с объектным кодом, созданным этими инструментами.

Использование -fno-underscoring не рекомендуется, если вы не экспериментируете с проблемами интеграции GNU Fortran в существующие системные среды (взаимодействия с существующими библиотеками, инструментами и т. д.).

Например, при использовании -funderscoring, и предположим, что j() и max_count() являются внешними функциями, а my_var и lvar являются локальными переменными, оператор

I = J() + MAX_COUNT (MY_VAR, LVAR)

реализуется как что-то похожее на:

i = j_() + max_count__(&my_var__, &lvar);

При использовании -fno-underscoring, тот же оператор реализуется как:

i = j() + max_count(&my_var, &lvar);

Использование -fno-underscoring позволяет напрямую указывать пользовательские имена при отладке и при взаимодействии кода GNU Fortran с другими языками.

Обратите внимание, что совпадение имён не означает, что интерфейс, реализованный GNU Fortran для внешнего имени, соответствует интерфейсу, реализованному другим языком для этого же имени. То есть, добиться связывания кода, сгенерированного GNU Fortran, с кодом, сгенерированным другим компилятором, с помощью этого или любого другого метода, может быть лишь небольшой частью общего решения — добиться согласия сгенерированного кода обоих компиляторов по вопросам, помимо именования, может потребовать значительных усилий, и, в отличие от разногласий по именованию, линковщики обычно не могут обнаружить разногласия в этих других областях.

Также обратите внимание, что при использовании -fno-underscoring, отсутствие добавленных нижних подчёркиваний создаёт очень реальную возможность конфликта пользовательского внешнего имени с именем в системной библиотеке, что в некоторых случаях может затруднить поиск ошибок неопределенных ссылок — они могут возникнуть во время выполнения программы и проявляться только как некорректное поведение во время выполнения.

В будущих версиях GNU Fortran мы надеемся улучшить проблемы именования и связывания, чтобы отладка всегда включала использование имён, как они появляются в исходном коде, даже если имена, как их видит линковщик, искажаются для предотвращения случайного связывания процедур с несовместимыми интерфейсами.

-fsecond-underscore

По умолчанию GNU Fortran добавляет нижнее подчёркивание к внешним именам. Если используется эта опция, GNU Fortran добавляет два нижних подчёркивания к именам с нижними подчёркиваниями и одно нижнее подчёркивание к внешним именам без нижних подчёркиваний. GNU Fortran также добавляет два нижних подчёркивания к внутренним именам с нижними подчёркиваниями, чтобы избежать столкновений имён с внешними именами.

Эта опция не имеет эффекта, если включена опция -fno-underscoring. Она подразумевается опцией -ff2c.

В противном случае, с этой опцией, внешнее имя, например MAX_COUNT , реализуется как ссылка на внешнюю ссылку времени компоновки max_count__, а не max_count_. Это необходимо для совместимости с g77 и f2c, и подразумевается использованием опции -ff2c.

-fcoarray=<keyword>
‘none’

Отключить поддержку комассивов; использование деклараций комассивов и инструкций управления изображениями приведет к ошибке компиляции. (По умолчанию)

‘single’

Режим одного изображения, т. е. num_images() всегда равно одному.

‘lib’

Параллелизация комассивов на основе библиотек; необходимо связать подходящую библиотеку комассивов GNU Fortran.

-fcheck=<keyword>

Включить генерацию проверок во время выполнения; аргумент должен быть список ключевых слов, разделённых запятыми. Предварительный префикс no- отключает его, если он был активирован предыдущим указанием.

‘all’

Включить все тесты во время выполнения -fcheck.

‘array-temps’

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

Примечание: Предупреждение выводится только один раз на расположение.

‘bounds’

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

Некоторые проверки требуют, чтобы -fcheck=bounds был задан для компиляции основной программы.

Примечание: В будущем это может также включать другие формы проверки, например, проверку ссылок на подстроки.

‘do’

Включить генерацию проверок во время выполнения для недопустимого изменения переменных итерации цикла.

‘mem’

Включить генерацию проверок во время выполнения для выделения памяти. Примечание: Эта опция не влияет на явные выделения с помощью оператора ALLOCATE, которые всегда будут проверены.

‘pointer’

Включить генерацию проверок во время выполнения для указателей и изменяемых массивов.

‘recursion’

Включить генерацию проверок во время выполнения для рекурсивно вызываемых подпрограмм и функций, которые не помечены как рекурсивные. См. также -frecursive. Примечание: Эта проверка не работает для программ OpenMP и отключена, если используется вместе с -frecursive и -fopenmp.

Пример: Предположим, у вас есть файл foo.f90, команда

gfortran -fcheck=all,no-array-temps foo.f90

скомпилирует файл со всеми включенными проверками, указанными выше, за исключением предупреждений о сгенерированных временных массивах.

-fbounds-check

Устаревший псевдоним для -fcheck=bounds.

-ftail-call-workaround
-ftail-call-workaround=n

Некоторые C-интерфейсы к коду Fortran нарушают gfortran ABI, опуская скрытые аргументы длины символов, как описано в См. Соглашения о передаче аргументов. Это может привести к сбоям, потому что загрузка аргументов для хвостовых вызовов может переполнить стек.

Для обеспечения обходного пути для существующих бинарных пакетов эта опция отключает оптимизацию хвостовых вызовов для процедур gfortran с аргументами символьного типа. С -ftail-call-workaround=2 оптимизация хвостовых вызовов отключена для всех процедур gfortran с аргументами символьного типа, с -ftail-call-workaround=1 или эквивалентной -ftail-call-workaround только для процедур gfortran с аргументами символьного типа, которые вызывают неявно прописанные процедуры.

Использование этой опции может привести к проблемам, включая сбои из-за недостаточного места в стеке.

Сильно рекомендуется исправить проблемный код. Опция -fc-prototypes-external может использоваться для генерации прототипов, соответствующих ABI gfortran, для включения в исходный код.

Поддержка этой опции, вероятно, будет удалена в будущей версии gfortran.

Отрицательная форма -fno-tail-call-workaround или эквивалентная -ftail-call-workaround=0 может использоваться для отключения этой опции.

По умолчанию в настоящее время установлено -ftail-call-workaround, это изменится в будущих выпусках.

-fcheck-array-temporaries

Устаревший псевдоним для -fcheck=array-temps.

-fmax-array-constructor=n

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

program test
implicit none
integer j
integer, parameter :: n = 100000
integer, parameter :: i(n) = (/ (2*j, j = 1, n) /)
print '(10(I0,1X))', i
end program test

Предупреждение: Эта опция может привести к длительному времени компиляции и чрезмерно большим объектным файлам.

Значение по умолчанию для n составляет 65535.

-fmax-stack-var-size=n

Этот параметр задаёт размер в байтах самого большого массива, который будет помещён в стек; если размер превышен, используется статическая память (за исключением процедур, помеченных как RECURSIVE). Используйте параметр -frecursive, чтобы разрешить рекурсивные процедуры, не имеющие атрибута RECURSIVE, или для параллельных программ. Используйте -fno-automatic, чтобы никогда не использовать стек.

В настоящее время этот параметр влияет только на локальные массивы, объявленные с постоянными границами, и может не применяться ко всем символьным переменным. Будущие версии GNU Fortran могут улучшить это поведение.

Значение по умолчанию для n равно 32768.

-fstack-arrays

Добавление этого параметра заставит компилятор Fortran помещать все массивы неизвестного размера и временные массивы в память стека. Если ваша программа использует очень большие локальные массивы, возможно, вам придётся увеличить лимиты времени выполнения для памяти стека на некоторых операционных системах. Этот флаг включён по умолчанию на уровне оптимизации -Ofast, если не указан -fmax-stack-var-size.

-fpack-derived

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

-frepack-arrays

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

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

-fshort-enums

Этот параметр предоставлен для взаимодействия с кодом C, скомпилированным с параметром -fshort-enums. Он заставит GNU Fortran выбрать наименьший INTEGER вид, в который поместится заданный набор перечислителей, и присвоит всем его перечислителям этот вид.

-fexternal-blas

Этот параметр заставит gfortran генерировать вызовы функций BLAS для некоторых матричных операций, таких как MATMUL, вместо использования собственных алгоритмов, если размер вовлечённых матриц больше заданного предела (см. -fblas-matmul-limit). Это может быть выгодно, если доступна оптимизированная библиотека BLAS от поставщика. Библиотека BLAS должна быть указана во время компоновки.

-fblas-matmul-limit=n

Значимо только при использовании -fexternal-blas. Умножение матриц размером больше или равным n будет выполняться функциями BLAS, а остальные — внутренними алгоритмами gfortran. Если матрицы не квадратные, сравнение размеров выполняется, используя геометрическое среднее измерений матрицы-аргумента и матрицы-результата.

Значение по умолчанию для n равно 30.

-finline-matmul-limit=n

При активной оптимизации на стадии передней части компиляции некоторые вызовы встроенной функции MATMUL будут встроены. Это может привести к увеличению размера кода, если размер матрицы не может быть определён во время компиляции, так как генерируется код для обоих случаев. Установка -finline-matmul-limit=0 отключит встраивание во всех случаях. Установка этого параметра со значением n создаст встроенный код для матриц размером до n. Если матрицы не квадратные, сравнение размеров выполняется, используя геометрическое среднее измерений матрицы-аргумента и матрицы-результата.

Значение по умолчанию для n равно 30. -fblas-matmul-limit может быть использовано для изменения этого значения.

-frecursive

Разрешить косвенную рекурсию, принуждая все локальные массивы к выделению в стеке. Этот флаг нельзя использовать вместе с -fmax-stack-var-size= или -fno-automatic.

-finit-local-zero
-finit-derived
-finit-integer=n
-finit-real=<zero|inf|-inf|nan|snan>
-finit-logical=<true|false>
-finit-character=n

Параметр -finit-local-zero указывает компилятору инициализировать локальные INTEGER, REAL, и COMPLEX переменные нулём, LOGICAL переменные ложью, и CHARACTER переменные строкой нулевых байтов. Более точные параметры инициализации предоставляются параметрами -finit-integer=n, -finit-real=<zero|inf|-inf|nan|snan> (также инициализирует вещественную и мнимую части локальных COMPLEX переменных), -finit-logical=<true|false> и -finit-character=n (где n — значение ASCII символа).

С -finit-derived компоненты переменных производного типа будут инициализированы в соответствии с этими флагами. Компоненты, тип которых не покрыт явным флагом -finit-*, будут обрабатываться так же, как описано выше с -finit-local-zero.

Эти параметры не инициализируют

  • объекты с атрибутом POINTER
  • распределяемые массивы
  • переменные, которые появляются в инструкции EQUIVALENCE

(Эти ограничения могут быть сняты в будущих выпусках).

Обратите внимание, что параметр -finit-real=nan инициализирует REAL и COMPLEX переменные тихим NaN. Для сигнализирующего NaN используйте -finit-real=snan; однако имейте в виду, что оптимизации на этапе компиляции могут преобразовать их в тихие NaN, и необходимо включить обработку исключений (например, через -ffpe-trap).

Параметр -finit-integer проанализирует значение в целое число типа INTEGER(kind=C_LONG) на хост-машине. Это значение затем присваивается целочисленным переменным в коде Fortran, что может привести к переполнению, если значение слишком велико для заданного вида.

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

-falign-commons

По умолчанию gfortran обеспечивает правильное выравнивание всех переменных в блоке COMMON путем добавления необходимых дополнений. На некоторых платформах это обязательно, на других это повышает производительность. Если блок COMMON не объявлен с согласованными типами данных повсюду, эта настройка может вызвать проблемы, и -fno-align-commons может быть использован для отключения автоматического выравнивания. Такой же параметр должен быть использован для всех файлов, которые используют блок COMMON. Для избежания потенциальных проблем с выравниванием в блоках COMMON, рекомендуется упорядочить объекты по убыванию размера.

-fno-protect-parens

По умолчанию скобки в выражениях учитываются для всех уровней оптимизации, так что компилятор не выполняет никакой перегруппировки. Использование -fno-protect-parens позволяет компилятору переупорядочивать REAL и COMPLEX выражения, чтобы получить более быстрый код. Обратите внимание, что для оптимизации перегруппировки должны быть активны параметры -fno-signed-zeros и -fno-trapping-math. Защита скобок включена по умолчанию, если не указан -Ofast.

-frealloc-lhs

Распределяемая левая часть в присваивании автоматически (пере)выделяется, если она не инициализирована или имеет другой размер. Параметр включён по умолчанию, за исключением случаев, когда указан -std=f95. См. также -Wrealloc-lhs.

-faggressive-function-elimination

Функции с идентичными списками аргументов устраняются внутри операторов, независимо от того, помечены ли эти функции PURE или нет. Например, в

a = f(b,c) + f(b,c)

будет только один вызов f. Этот параметр работает только при включенном -ffrontend-optimize.

-ffrontend-optimize

Этот параметр выполняет оптимизацию на стадии передней части компиляции, основанную на манипулировании частями дерева разбора Fortran. Включается по умолчанию любым параметром -O, кроме -O0 и -Og. Оптимизации, включённые этим параметром:

  • встраивание вызовов MATMUL,
  • устранение идентичных вызовов функций внутри выражений,
  • удаление ненужных вызовов TRIM в сравнениях и присваиваниях,
  • замена TRIM(a) на a(1:LEN_TRIM(a)) и
  • краткое замыкание логических операторов (.AND. и .OR.).

Его можно отключить, указав -fno-frontend-optimize.

-ffrontend-loop-interchange

Попытка перестановки циклов в передней части компилятора Fortran, где это выгодно. Включается по умолчанию любым параметром -O. В настоящее время этот параметр влияет только на операторы FORALL и DO CONCURRENT с несколькими тройками forall.

См. Параметры для генерации кода в Руководстве по GNU компилятору C (GCC), для получения информации о дополнительных параметрах, предлагаемых общим кодом, используемым gfortran, gcc, и другими GNU компиляторами.

Далее: Параметры взаимодействия, Предыдущий: Параметры выполнения, Наверх: Использование GNU Fortran [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gfortran/Code-Gen-Options.html

Spec-Zone.ru

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