Spec-Zone.ru › GNU Fortran 12

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), требуют, чтобы функции, возвращающие тип default REAL, фактически возвращали тип C double, а функции, возвращающие тип COMPLEX , возвращали значения через дополнительный аргумент в последовательности вызова, который указывает, куда сохранить возвращаемое значение. В соответствии с соглашениями вызова по умолчанию GNU такие функции просто возвращают свои результаты так, как это было бы в GNU C — функции default REAL возвращают тип C float, а функции COMPLEX возвращают тип GNU C complex. Кроме того, эта опция подразумевает опцию -fsecond-underscore, если явно не запрошена опция -fno-second-underscore.

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

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

Предупреждение: Это нарушит код, который передает внутренние функции типа default 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, реализуется как ссылка на внешнюю ссылку link-time max_count__, а не на max_count_. Это необходимо для совместимости с g77 и f2c, и подразумевается при использовании опции -ff2c.

-fcoarray=<keyword>
‘none’

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

‘single’

Режим single-image, т.е. num_images() всегда равно одному.

‘lib’

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

-fcheck=<keyword>

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

‘all’

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

‘array-temps’

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

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

‘bits’

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

‘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 составляет 65536.

-fstack-arrays

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

-fpack-derived

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

-frepack-arrays

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

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

-fshort-enums

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

-finline-arg-packing

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

subroutine foo(a)
   real, dimension(*) :: a
end subroutine foo
subroutine bar(b)
   real, dimension(:) :: b
   call foo(b)
end subroutine bar

Когда -finline-arg-packing активен, эта упаковка будет выполняться встроенным кодом. Это позволяет улучшить оптимизацию, увеличивая размер кода.

-finline-arg-packing подразумевается любым из параметров -O, за исключением оптимизации размера с помощью -Os. Если код содержит очень большое количество аргументов, которые должны быть упакованы, размер кода и время компиляции могут стать чрезмерными. В таком случае может быть лучше отключить этот параметр. Примеры упаковки можно найти, используя -Warray-temporaries.

-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 компилятора (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-12.1.0/gfortran/Code-Gen-Options.html

Spec-Zone.ru

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