Spec-Zone.ru › GNU Fortran 10

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

-fcoarray=<keyword>
‘none’

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

‘single’

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

‘lib’

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

-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 нарушают ABI gfortran, опуская скрытые аргументы длины символов, как описано в См. Методы передачи аргументов. Это может привести к сбоям, потому что push аргументов для хвостовых вызовов может переполнить стек.

Для обеспечения обходного решения для существующих бинарных пакетов этот параметр отключает оптимизацию хвостовых вызовов для процедур 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 Compiler Collection (GCC), для получения информации о дополнительных параметрах, предлагаемых общим ресурсом GBE, используемым gfortran, gcc, и другими компиляторами GNU.

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

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

Spec-Zone.ru

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