2017-01-07 8 views
1

Если я хочу, чтобы подпрограмма была встроена в вызывающую процедуру, где я могу ее сохранить? Нужно ли быть в том же модуле или файле? Можно ли выполнить inlining с помощью подпрограмм из разных объектных файлов? Может ли ответ быть зависимым от компилятора?Где поместить подпрограмму/функцию в строку

+1

Для получения более или менее независимого от компилятора результата используйте внутренние процедуры (КОНТЕЙНЕРЫ). ifort с настройкой по умолчанию -Qip inlines (частично?) автоматически из всех исходных файлов, указанных в одной команде компиляции, с учетом встроенных ограничений. – tim18

+0

@ tim18 Поместить его в инструкцию contains неудобно для повторного использования и из-за перекрывающихся пространств имен. Помещение модуля с небольшими подпрограммами в тот же оператор компиляции, что и вызывающий, кажется чистым. Затем модуль может быть повторно использован, и если вызов становится трудоемким для вызывающего, его можно разместить на той же строке, что и вызывающий в файле make. Интересно, работает ли это для gfortran, который я обычно использую для компилятора? –

ответ

2

Это не контролируется стандартом Fortran. Процессор может делать то, что сочтет нужным.

Это определенно зависит от настроек компилятора.

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

Но даже вложения из других исходных файлов/скомпилированных объектных файлов не может быть и речи. Это можно и часто делать при оптимизации времени соединения (https://gcc.gnu.org/wiki/LinkTimeOptimization). Эти оптимизации либо включены в определенные флаги компилятора (например, -fast), либо могут быть включены отдельно (-flto, -ipo).

+0

И по внутренним функциям вы имеете в виду те, что содержатся в инструкции 'contains' вызывающего? Было бы неплохо иметь модуль в отдельном файле с обычно используемыми небольшими подпрограммами, такими как кросс-продукт, точечный продукт, некоторая элементная функция и т. Д., И быть в состоянии предположить, что они будут встроены. Может быть, это помогает, если такой модуль скомпилирован в том же выражении, что и рутина, использующая его, например 'gfortran $ (flags) caller.f90 utils.f90', где utils.f90 содержит модуль с небольшими подпрограммами? –

+0

* Внутренние процедуры * - это точно определенный термин. Они находятся в секции содержания основной программы или другой процедуры (обычно вызывающей). Для ваших флагов используйте '-flto' и посмотрите, что компилятор управляет встроенным. Результат будет зависеть от размера встроенной функции. –

+0

Как вы определяете, была ли вставка успешной? Я нахожусь на Ubuntu с gfortran. Я просто использовал 'gprof' или' perf' для профилирования. –