Spec-Zone.ru › GNU Fortran 4

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 или 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, и при предположении других значений по умолчанию, таких как -fcase-lower, и что 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>
Включить генерацию проверок во время выполнения; аргументом должно быть список ключевых слов, разделённых запятыми.
‘all’
Включить все проверки во время выполнения -fcheck.
‘array-temps’
Выводит предупреждения во время выполнения, когда для передачи фактического аргумента необходимо было сгенерировать временный массив. Информация, генерируемая этим предупреждением, иногда полезна для оптимизации, чтобы избежать таких временных массивов.

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

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

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

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

‘do’
Включить генерацию проверок во время выполнения для недействительного изменения переменных цикла.
‘mem’
Включить генерацию проверок во время выполнения для выделения памяти. Примечание: Этот параметр не влияет на явные выделения с помощью инструкции ALLOCATE, которые всегда проверяются.
‘pointer’
Включить генерацию проверок во время выполнения для указателей и выделенных переменных.
‘recursion’
Включить генерацию проверок во время выполнения для рекурсивных вызовов подпрограмм и функций, которые не отмечены как рекурсивные. См. также -frecursive. Примечание: Эта проверка не работает для программ OpenMP и отключена, если используется вместе с -frecursive и -fopenmp.
-fbounds-check
Устаревшее псевдоним для -fcheck=bounds.
-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.
-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.

-frecursive
Разрешить косвенную рекурсию, заставив все локальные массивы выделять на стеке. Этот флаг не может использоваться вместе с -fmax-stack-var-size= или -fno-automatic.
-finit-local-zero
-finit-integer=n
-finit-real=<zero|inf|-inf|nan|snan>
-finit-logical=<true|false>
-finit-character=n
Вариант -finit-local-zero указывает компилятору инициализировать локальные INTEGER, REAL, и COMPLEX переменные нулями, LOGICAL переменные значением false, и CHARACTER переменные строкой из нулевых байтов. Более тонкую инициализацию обеспечивают варианты -finit-integer=n, -finit-real=<zero|inf|-inf|nan|snan> (который также инициализирует вещественную и мнимую части локальных COMPLEX переменных), -finit-logical=<true|false>, и -finit-character=n (где n — значение ASCII-символа). Эти варианты не инициализируют
  • распределяемые массивы
  • компоненты переменных производных типов
  • переменные, присутствующие в операторе 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. Оптимизации, включенные этим вариантом, включают удаление идентичных вызовов функций внутри выражений, удаление ненужных вызовов TRIM в сравнениях и присваиваниях и замену TRIM(a) на a(1:LEN_TRIM(a)). Его можно отключить, указав -fno-frontend-optimize.

См. Параметры для соглашений о генерации кода, для получения информации о других параметрах, предлагаемых общим компонентом GBE, используемым gfortran, gcc, и другими компиляторами GNU.

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

Spec-Zone.ru

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