Умный поиск

Использование математических библиотек BLAS, LAPACK в среде программирования Delphi

Пожалуй, любое современное научное или инженерное программное обеспечение основано на алгебре матриц. Матричный анализ уже не один десяток лет является эффективным средством обработки числовых данных, даже когда размеры массивов измеряются десятками тысяч. Каким же образом компьютерным программам удается решать столь сложные задачи, быстро и эффективно? Ответ достаточно прост – многие из них используют высокопроизводительные вычислительные алгоритмы для работы с числами, векторами и матрицами.

Некоторые такие алгоритмы общедоступны и бесплатны, хотя их используют такие серьезные программные комплексы, как Matlab. Речь идет о библиотеках векторного и матричного анализа BLAS, LAPACK. В данной статье будет показано, как использовать эти библиотеки при разработке приложений для Windows в среде программирования Delphi.

Библиотеки BLAS, LAPACK

В мире насчитывается более сотни различных языков программирования и еще около тысячи их диалектов, версий и реализаций. Многие из них имеют свои адаптированные математические библиотеки и обёртки, однако ведущую роль в области линейной компьютерной алгебры уже много лет подряд удерживает язык Фортран (Fortran).

Популярность языка Фортран обусловлена в первую очередь тем, что на нём написаны математические библиотеки BLAS и LAPACK:

  • BLAS (Basic Linear Algebra Subprograms) – программная библиотека, предоставляющая стандартные процедуры для основных математических операций над векторами и матрицами;
  • LAPACK (Linear Algebra PACKage) – программная библиотека, предоставляющая процедуры и функции для решения систем линейных алгебраических уравнений (СЛАУ), разложения матриц на множители, вычисления собственных значений и пр.

Некоторые функции библиотеки LAPACK для своей работы используют функции библиотеки BLAS.

Разработка обеих библиотек ведется на языке программирования Fortran77, поэтому напрямую использовать их в приложениях Windows достаточно сложно. Основными разработчиками библиотек выступают сотрудники университетов Теннесси, Калифорнийского и Денверского университетов (США). Библиотеки бесплатны, хорошо документированы и доступны для скачивания с официального сайта.

Программное обеспечение

Очевидно, что «ручная» трансляция исходного кода LAPACK, BLAS на другие языки программирования (например, C, Visual Basic, Delphi) вызовет существенные затруднения, а также повысит вероятность возникновения ошибок. Поэтому рекомендуется компилировать библиотеки напрямую, используя их исходный код без каких-либо модификаций.

Существуют различные компиляторы языка Фортран, в том числе платные. Мы остановимся на бесплатных, но достаточно эффективных системах. В целом, работа проводилась на следующем программном обеспечении:

  • операционная система Microsoft Windows 7 Ultimate, 64 bit (www.microsoft.com);
  • среда программирования Embarcadero Delphi 2010 (www.embarcadero.com);
  • исходные файлы математических библиотек BLAS, LAPACK версии 3.4.2 на Фортране (www.netlib.org/lapack);
  • CMake 2.8.11.2 – система для сборки проекта, составленного из различных файлов (www.cmake.org);
  • MinGW (Minimalist GNU for Windows) 4.0 – пакет различных компиляторов (в том числе языка Фортран), которые позволяют получить «нативный» код, свойственный приложениям Windows (www.mingw.org).

Установка BLAS, LAPACK

После скачивания архива «lapack-3.4.2.tgz» разархивируем его в папку «C:\LAPACK342».

Установка MinGW

После скачивания пакета компиляторов MinGW устанавливаем его в папку «C:\MinGW». Запускаем приложение MinGW Installation Manager, нажимаем Installation>Update Catalogue. Далее следует убедиться в том, что установлена новейшая версия компилятора Фортран (mingw32-gcc-fortran). Если текущая версия компилятора не самая новая – обновляем ее и нажимаем Installation > Apply Changes.

Использование математических библиотек BLAS, LAPACK в среде программирования Delphi | Dystlab Library

Если компилятор «The GNU FORTRAN Compiler» не установлен в систему, его необходимо установить: кликаем на соответствующей строке правой кнопкой мыши и выбираем Mark for Installation, а затем — Installation > Apply Changes. Программа загрузит его прямо с сайта и добавит в пакет.

Настройка переменной среды PATH

Компилятор MinGW работает из командной строки, поэтому для удобства взаимодействия с ним следует настроить переменные среды:

  • последовательно открываем: Панель управления > Система > Дополнительные параметры системы;
  • переходим на закладку Дополнительно, нажимаем «Переменные среды»;
  • в разделе «Системные переменные» нажимаем «Создать» и добавляем переменную с именем «PATH» и значением «C:\MinGW\bin»:

Использование математических библиотек BLAS, LAPACK в среде программирования Delphi | Dystlab Library

Установка CMake

После загрузки установочного файла CMake запускаем его и устанавливаем приложение на компьютер. Исходные файлы LAPACK упакованы в архиве таким образом, что после разархивирования их сразу же можно собирать компоновщиком CMake, о чем свидетельствует наличие файлов «CMakeLists.txt». С этой целью запускаем CMake и указываем корневую папку библиотеки LAPACK «C:/LAPACK342», а также папку, в которую будут помещены скомпилированные библиотеки «C:/LAPACK342/OUT». Далее нажимаем кнопку Configure и ждем появления красных строк текста:

Использование математических библиотек BLAS, LAPACK в среде программирования Delphi | Dystlab Library

 

На экране появятся опции, которые настроены по умолчанию. Эти же опции мы можем увидеть в файле «CMakeLists.txt» из корневой папки «C:\LAPACK342». Для получения интересующих нас динамически подключаемых библиотек (DLL), следует включить опцию BUILD_SHARED_LIBS (она по умолчанию отключена). Повторно нажимаем Configure, чтобы система приняла изменения, а затем – Generate. Из списка предлагаемых компиляторов выбираем «MinGW Makefiles»:

Использование математических библиотек BLAS, LAPACK в среде программирования Delphi | Dystlab Library

 

Нажимаем кнопку Finish в нижней части окна. Если в процессе построения проекта были обнаружены ошибки, CMake уведомит нас об этом красным текстом в нижнем поле. Если процесс построения проекта прошел успешно, можно закрыть CMake.

Компиляция библиотек BLAS, LAPACK

Компилятор языка Фортран, входящий в состав пакета MinGW, запускается из командной строки: Пуск > Выполнить… > cmd. В командной строке переходим в папку, предназначенную для скомпилированных библиотек – в командной строке набираем команду «cd C:\LAPACK342\OUT», нажимаем Enter.

Запускаем компилятор командой «mingw32-make.exe»:

Использование математических библиотек BLAS, LAPACK в среде программирования Delphi | Dystlab Library

 

Процесс компиляции библиотек не очень быстрый, но следует дождаться его завершения до конца (100%).

После завершения работы компилятора находим интересующие нас библиотеки LIBBLAS.DLL, LIBLAPACK.DLL в папке «C:\LAPACK342\OUT\bin». Это готовые к использованию динамически подключаемые библиотеки Windows.

Использование BLAS, LAPACK как DLL в среде Delphi

В качестве примера использования в проекте Delphi, рассмотрим схему вызова двух функций:

  • функции DGEMM из библиотеки LIBBLAS.DLL, выполняющей умножение матриц;
  • функции DGESV из библиотеки LIBLAPACK.DLL, выполняющей решение системы линейных алгебраических уравнений.

В связи с тем, что компилятор «The GNU FORTRAN Compiler» из пакета MinGW готовит DLL для использования в проектах, написанных на языке программирования C++, следует учитывать следующие важные обстоятельства:

  • декларация импортируемых из DLL функций должна сопровождаться директивой CDECL;
  • к именам исходных функций добавляется знак «_» (т. е. dgemm_, dgesv_);
  • DLL и использующие их приложения будут работать корректно, если обеспечен доступ к GNU-библиотекам LIBGFORTRAN-3.DLL, LIBGCC_S_DW2-1.DLL (находятся в папке «C:\MinGW\bin»). Эти библиотеки должны быть либо расположены в папке приложения, либо находиться в системной папке «C:\Windows\System32», либо записаны в переменной PATH (см. выше).

В секции определения типов одного из модулей проекта Delphi задекларируем типы данных, соответствующие функциям, импортируемым из DLL:

uses
  SysUtils, Windows, Dialogs;
type
  { указатель на функцию DGEMM из библиотеки BLAS }
  TBlasDGEMM = function(TRANSA, TRANSB: PChar; M, N, K: PInteger; ALPHA, A: PDouble; LDA: PInteger; B: PDouble; LDB: PInteger; BETA, C: PDouble; LDC: PInteger): Integer; cdecl;
  { указатель на функцию DGESV из библиотеки LAPACK }
  TLapackDGESV = function(n, nrhs: PInteger; a: PDouble; lda, ipiv: PInteger; b: PDouble; ldb, info: PInteger): Integer; cdecl;

Определим необходимые переменные:

var
  FBlasHandle: THandle = 0;     { дескриптор библиотеки LIBBLAS.DLL }
  FLpckHandle: THandle = 0;     { дескриптор библиотеки LIBLAPACK.DLL }
  FBlasDGEMM: TBlasDGEMM;       { матричное умножение }
  FLpckDGESV: TLapackDGESV;     { вычисление СЛАУ }

Имена и порядок перечисления аргументов в функциях TBlasDGEMM, TLapackDGESV соответствует исходному определению этих функций в библиотеках BLAS, LAPACK. Типы параметров также соответствует исходным типам, но с учетом особенностей языка Delphi.

Следующие две функции обеспечивают загрузку и завершение работы DLL:

{ загрузка DLL }
procedure LoadDLL;
const
  BlasDllName = 'libblas.dll';
  LapackDllName = 'liblapack.dll';
begin
  if not (FileExists(BlasDllName) and FileExists(LapackDllName)) then
    begin
      ShowMessage('Error: BLAS/LAPACK DLLs not loaded.');
      Exit;
    end;
  { загружаем библиотеку blas и ее методы }
  FBlasHandle := LoadLibrary(BlasDllName);
  if FBlasHandle = 0 then
    begin
      ShowMessage(BlasDllName + ' library not loaded.');
      Exit;
    end;
  { загружаем/проверяем функцию 'dgemm' }
  @FBlasDGEMM := GetProcAddress(FBlasHandle, 'dgemm_');
  if @FBlasDGEMM = nil then
    begin
      ShowMessage(Function ''dgemm'' not found in library ' + BlasDllName);
      Exit;
    end;
  { загружаем библиотеку LAPACK и ее методы }
  FLpckHandle := LoadLibrary(LapackDllName);
  if FLpckHandle = 0 then
    begin
      ShowMessage(LapackDllName + ' library not loaded.');
      Exit;
    end;
  { загружаем/проверяем функцию 'dgesv' }
  @FLpckDGESV := GetProcAddress(FLpckHandle, 'dgesv_');
  if @FLpckDGESV = nil then
    begin
      ShowMessage(Function ''dgesv'' not found in library ' + LapackDllName);
      Exit;
    end;
end;
{ завершение работы DLL }
procedure FreeDLL;
begin
  if FBlasHandle <> 0 then
    begin
      FreeLibrary(FBlasHandle);
      FBlasHandle := 0;
    end;
  if FLpckHandle <> 0 then
    begin
      FreeLibrary(FLpckHandle);
      FLpckHandle := 0;
    end;
end;

Заключение

Как видим, процесс компиляции исходных файлов BLAS, LAPACK в динамически подключаемые библиотеки DLL для Windows не должен вызвать затруднений. Полученные таким образом DLL легко подключаются не только к проектам C++, но и Delphi.

Благодарности

Подготовка данной статьи не имела бы смысла без многолетнего энтузиазма, усердной и плодотворной работы ученых и программистов из проекта LAPACK. За их поистине титанический труд, приносящий пользу тысячам пользователей во всем мире, автор данной статьи выражает огромную благодарность. Отдельно хочу поблагодарить также Дмитрия Логинова – разработчика системы Matrix32 для Delphi (http://www.loginovprojects.ru).


Виталий Артемов — фото профиля

Виталий Артемов

Основатель, руководитель лаборатории Dystlab. Кандидат технических наук, разработчик САПР. Ведет онлайн-курсы по расчету конструкций, динамике, спецкурс для аспирантов, руководит стажировкой по расчету ЖБК


Блог | Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. | Community | FB | LinkedIn

Комментарии   

0 # Владимир 07.10.2016 13:40
Ни одна версия CMake не работает ни с одной реализацией Lapack, выдаётся длинный список ошибок и на этом дело заканчивается.
Ответить | Ответить с цитатой | Цитировать
+3 # Виталий 08.10.2016 15:21
Звучит очень категорично ;) Как минимум одно сочетание работает 100% — то, которое приведено в данной статье. За остальные ручаться не могу, но я не занимался перебором, просто взял их последние версии (последние на момент написания статьи).
Ответить | Ответить с цитатой | Цитировать

Под статьей | Случайные статьи по инженерии