Spec-Zone.ru › GNU Fortran 14

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

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

Большинство из них имеют как положительную, так и отрицательную формы; отрицательная форма -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 — функции по умолчанию 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’

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

‘single’

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

‘lib’

Параллелизация coarray на основе библиотек; требуется подключение подходящей библиотеки coarray 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, опуская скрытые аргументы длины символов, как описано в см. Конвенции передачи аргументов. Это может привести к сбоям, потому что передача аргументов для вызовов с хвостом может переполнить стек.

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

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

Spec-Zone.ru

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