Andrew10
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Добрый день всем! Результаты экспериментов по прикручиванию библиотеки gotoBLAS, сгенерированной в Gygwin, к CVF и Intel VF. Надеюсь, что кому-нибудь будет полезно. Выяснилось, что мои предыдущие вопросы, как преобразовать dll в статическую библиотеку на самом деле не имеют отношения к тому, что мне было нужно, а именно, как подключить к проекту, создаваемому в CVF или Intel fortran, библиотеку из Cygwin? 1. Самое главное, оказалось, что библиотека в Cygwin с расширением .a, это обычная статическая библиотека, так что ее нужно просто переименовать .a -> .lib ! И ВСЕ !!! Это было для меня совершеннейшей новостью. 2. Есть, однако, небольшое осложнение, связанное с тем, что в CVF и IF имена подпрограмм в объектном файле образуются по другому закону, нежели в gcc и g77. И соглашения о вызове разные. Для решения этой проблемы можно использовать методы многоязыкового программирования, которые начиная с FPS 4.0, стали уже практически стандартом. В gcc и g77 соглашения о вызове соответствуют атрибуту C, а в CFV и IF - STDCALL. В g77 переменные передаются по ссылке, так же, как в CFV и IF Имя модуля в gcc и g77 переводится в строчные буквы, после чего спереди и сзади добавляется символ подчеркивания. Все эти разночтения можно урегулировать, дописав интерфейс для каждой вызываемой функции из библиотеки. Пример: для вызова функции saxpy из BLAS интерфейс должен быть такой: interface subroutine saxpy( n, a, x, incx, y, incy ) !DEC$ ATTRIBUTES C, REFERENCE, ALIAS:"_saxpy_" :: saxpy integer n, incx, incy real a, x(*), y(*) end subroutine saxpy end interface Его нужно добавить в начало той подпрограммы, из которой будет вызываться saxpy Главное здесь - это строка !DEC$, в которой все перечисленные выше правила вызова определяются: соглашения о вызове C, переменные передаются по значению, в объектном модуле подпрограмма будет записана под именем _saxpy_. 3. В этом механизме есть определенное неудобство, связанное с необходимость дописывать подобные интерфейсы во все подпрограммы, в которых вызывается функция. Выход состоит в том, чтобы на каждую функцию из библиотеки (в данном примере из BLAS) написать свою подпрограмму или функцию с именем, точно совпадающим с именем BLAS-овском функции. В ней уже будет вызываться функция для связи с Cygwin-библиотекой, снабженная соответствующим интерфейсом. Примерный вид такого файла: !!!!!!!!!!!!!!!!!!!!! file gotoblas.f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .... начало файла опущено ! подпрограмма - интерфейс для функции saxpy subroutine saxpy( n, a, x, incx, y, incy ) integer n, incx, incy real a, x(*), y(*) interface subroutine saxpy_goto( n, a, x, incx, y, incy ) !DEC$ ATTRIBUTES C, REFERENCE, ALIAS:"_saxpy_" :: saxpy_goto integer n, incx, incy real a, x(*), y(*) end subroutine saxpy_goto end interface call saxpy_goto( n, a, x, incx, y, incy ) return end subroutine saxpy ..... конец файла опущен !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! end file !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Преимущества: a) достаточно просто откомпилировать файл gotoblas.f и линковать его вместе со всем проектом. б) Не нужно вносить никаких изменений в основной код. Накладные расходы из-за повторного переприсваивания переменных и вызова программы мизерны. в) при появлении новой версии библиотеки не нужно заново переделывать make файлы и т.д., достаточно просто подключить заново сгенерированную статическую библиотеку к своему проекту. Проверено, работает на CVF 6.6 и Intel Fortran 9.1 Когда уже разобрался со всем этим, вспомнил, что аналогичный прием применяется в UMFPACK, написанной на C++, для вызова функций библиотеки из Фортрана. Добавлено 15.06.07 в 15-40: Рано радовался! С модулями из BLAS1 все сработало, а с BLAS2 пошли аварийные завершения программы. Есть подозрение, что дело в передаче двумерных массивов. Так что приведенный выше рецепт не окончательный. | Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 11:25 15-06-2007 | Исправлено: Andrew10, 15:41 15-06-2007 |
|