#c #fortran #g #gfortran
#c #fortran #g #gfortran
Вопрос:
Я пишу программу на C , которая вызывает некоторые функции, которые я написал на Fortran. Я собирался протестировать очень простой пример, в котором я вызываю функцию с именем toRadians из кода C :
real function toRadian(degree)
implicit none
real, intent(in) :: degree
real :: radians
radians = (degree*PI)/180
return
end function toRadian
И поэтому я задаюсь вопросом, «стоит ли это того»? Когда я закончу все это, эта функция будет вызвана в Fortran, где будет выполнена основная часть вычислений, но выполнение этого базового примера заставило меня задуматься о том, является ли для простого вычисления, подобного этому, вызов функции Fortran более дорогостоящим, чем просто наличие этой функции в C ?
Извините за мое невежество, я не очень уверен в том, как работает связь между этими скомпилированными кодами. (Я тоже новичок в Fortran, поэтому, если вы хотите сделать какие-либо замечания по поводу предыдущей функции, пожалуйста, продолжайте).
Спасибо за ваше время и хорошего дня.
Комментарии:
1. Для такой простой функции, как эта, это не стоит хлопот. Почему бы вам просто не написать свою функцию toRadion на C?
2. Для такой функции, как эта, это может быть серьезным излишеством. Однако для сложных математических задач (умножения матриц и т.д.) Это может окупиться. Но даже там я бы рекомендовал использовать обычные библиотеки C, такие как LAPACK или else. В общем, если вы вызываете что-то с одного языка программирования на другой, вы можете получить сложности в управлении памятью (ну, не здесь, но ладно) и накладные расходы во время выполнения.
3. @ThomasLang LAPACK — это обычный C?
4. Нет, это чистый Fortran, CLAPACK не является стандартным (AFAIK только CBLAS). Вам нужны пользовательские оболочки C поверх библиотеки Fortran.
5. Обычно вызов C или функции Fortran приводит к более или менее одинаковой инструкции вызова в сборке. Я могу представить ситуацию, когда это имеет значение, хотя: если вызываемый объект короткий и выполняется часто, у C есть стандартный способ «встроенных» вызовов (так что больше нет инструкции вызова, что быстрее), в то время как в стандарте Fortran такой вещи нет. Этого можно достичь другими средствами: параметром командной строки, директивой компилятора (см.
!DIR$ INLINE
в IVF) и, в более общем плане, с помощью оптимизации IPO. Компилятору также может быть сложнее оптимизировать межъязыковые вызовы.
Ответ №1:
Вызов функции Fortran так же дешев, как вызов другой функции C . Обычно.
Проблема заключается в совместимости между двумя языками. Лучший способ запустить это в Fortran — использовать iso_c_binding
, чтобы у функции было соглашение о вызове C.
Тогда другая проблема заключается в том, что для обоих языков требуются свои собственные библиотеки времени выполнения, и нет флага компоновщика для использования обоих. Итак, обычной практикой является создание общей библиотеки для кода на Fortran и привязка ее к приложению на C (и наоборот, когда оно вызывает C из Fortran).
Комментарии:
1. Меня смущает «нет флага компоновщика для использования обоих». Что не так с «g -lgfortran» и «gfortran -lstdc «?
2. Иногда есть другие библиотеки, с которыми вам нужно связать. Зависит от компилятора, но нет надлежащего переносимого способа связать обе среды выполнения.
3. @MatthieuBrucher Способ вызова компоновщика (или даже существование компоновщика) не описан стандартом Fortran, поэтому он в любом случае не может быть «переносимым». Смотрите раздел 1 #4 стандарта: «В этом документе не указан механизм, с помощью которого программы преобразуются для использования в вычислительных системах». Я подозреваю, что ситуация аналогична со стандартом C .
4. @Jean-ClaudeArbaut Точно. Вот почему только один «язык» может быть связан переносимым способом.
5. Вы не понимаете сути. Невозможно даже переносимо связать один язык. Это не является частью стандарта. Мы даже не знаем, что существует компоновщик (что касается стандарта, программа на Fortran может быть интерпретирована). И вы, вероятно, знаете, что компоновщики сильно различаются в зависимости от платформы и ОС.