Spec-Zone.ru › GNU Fortran 8

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

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

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

-fno-automatic

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

-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’

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

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

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

Поддержка этой опции, вероятно, будет удалена в будущих версиях 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-* отключит предупреждения, которые могли быть выпущены параметром -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. Оптимизации, включённые этим параметром, включают встраивание вызовов MATMUL, исключение идентичных вызовов функций внутри выражений, удаление ненужных вызовов TRIM в сравнениях и присваиваниях и замену TRIM(a) на a(1:LEN_TRIM(a)). Его можно отключить, указав -fno-frontend-optimize.

-ffrontend-loop-interchange

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

См. Параметры для генерации кода в Руководстве по использованию GNU компилятора (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-8.4.0/gfortran/Code-Gen-Options.html

Spec-Zone.ru

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