exponenta event banner

Вызов функций LAPACK и BLAS

Функцию LAPACK или BLAS можно вызвать с помощью файла MEX. Для создания MEX-файла необходим опыт программирования C/C + + или Fortran и программные ресурсы (компиляторы и линкеры) для построения исполняемого файла. Также полезно понять, как использовать подпрограммы Fortran. MATLAB ® обеспечивает mwlapack и mwblas библиотеки в matlabroot/extern/lib. Чтобы помочь вам начать работу, есть примеры исходного кода в matlabroot/extern/examples/refbook.

Для вызова функций LAPACK или BLAS:

  1. Создайте исходный файл MEX, содержащий mexFunction подпрограмма шлюза.

  2. Убедитесь, что для вашей платформы поддерживается компилятор. Обновленный список поддерживаемых компиляторов см. в разделе Поддерживаемые и совместимые компиляторы.

  3. Создайте двоичный файл MEX с помощью mex команда и отдельный флаг сборки комплекса -R2017b.

    • Свяжите исходный файл с одной или обеими библиотеками. mwlapack и mwblas.

    • mwlapack и mwblas библиотеки поддерживают только 64-разрядные целые числа для матричных размеров. Не используйте -compatibleArrayDims вариант.

    • Чтобы создать файл MEX с функциями, использующими комплексные номера, см. раздел Передача отдельных комплексных номеров функциям Fortran.

  4. Для получения информации о функциях BLAS или LAPACK см. https://www.netlib.org/blas/ или https://www.netlib.org/lapack/.

Построить matrixMultiply Функция MEX с использованием функций BLAS

В этом примере показано, как построить пример файла MEX matrixMultiply.c, которая использует функции из библиотеки BLAS. Для работы с этим файлом скопируйте его в локальную папку. Например:

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixMultiply.c'),'.')

Файлы примеров доступны только для чтения. Чтобы изменить пример, убедитесь, что файл доступен для записи, введя:

fileattrib('matrixMultiply.c','+w')

Чтобы построить файл MEX, введите:

mex -v -R2017b matrixMultiply.c -lmwblas

Чтобы запустить файл MEX, введите:

A = [1 3 5; 2 4 7];
B = [-5 8 11; 3 9 21; 4 0 8];
X = matrixMultiply(A,B)
X =
    24    35   114
    30    52   162

Сохранение входных значений из изменения

Многие функции LAPACK и BLAS изменяют значения переданных им аргументов. Рекомендуется создавать копии аргументов, которые можно изменить, прежде чем передавать их этим функциям. Для получения информации о том, как MATLAB обрабатывает аргументы в mexFunctionсм. раздел Управление параметрами ввода и вывода.

matrixDivide Пример

В этом примере вызывается функция LAPACK. dgesv изменяет входные аргументы. Код в этом примере создает копии prhs[0] и prhs[1]и передает копии в dgesv для сохранения содержимого входных аргументов.

Чтобы увидеть пример, откройте matrixDivide.c в редакторе MATLAB. Чтобы создать файл MEX, скопируйте исходный файл в папку с возможностью записи.

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivide.c'),'.')

Чтобы построить файл, введите:

mex -v -R2017b matrixDivide.c -lmwlapack

Для тестирования введите:

A = [1 2; 3 4];
B = [5; 6];
X = matrixDivide(A,B)
X =
   -4.0000
    4.5000

Передача аргументов функциям Fortran из программ C/C + +

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

При вызове подпрограммы Fortran, подобно функции из LAPACK или BLAS, из программы C/C + + обязательно передайте аргументы по ссылке. Для передачи по ссылке, предшествуйте аргументу амперсандом (&), если только этот аргумент уже не является ссылкой. Например, при создании матрицы с помощью mxGetDoubles функция создает ссылку на матрицу и не нуждается в амперсанде перед аргументом.

В следующем фрагменте кода переменные m, n, p, one, и zero требуется & символ, чтобы сделать их ссылкой. Переменные A, B, C, и chn - указатели, являющиеся ссылками.

/* pointers to input & output matrices*/
double *A, *B, *C;
/* matrix dimensions */
mwSignedIndex m,n,p;
/* other inputs to dgemm */
char *chn = "N";
double one = 1.0, zero = 0.0;

/* call BLAS function */
dgemm(chn, chn, &m, &n, &p, &one, A, &m, B, &p, &zero, C, &m);

matrixMultiply Пример

matrixMultiply.c примеры вызовов dgemm, передавая все аргументы по ссылке. Чтобы просмотреть исходный код, откройте matrixMultiply.c в редакторе MATLAB. Для создания и выполнения этого примера см. раздел Создание матрицы умножение функции MEX с использованием функций BLAS.

Передача аргументов функциям Fortran из программ Fortran

Функции LAPACK и BLAS можно вызывать из файлов Fortran MEX. Следующий пример берет две матрицы и умножает их на вызов подпрограммы BLAS dgemm. Чтобы запустить пример, скопируйте код в редактор и присвойте файлу имя calldgemm.F.

#include "fintrf.h"

      subroutine mexFunction(nlhs, plhs, nrhs, prhs)
      mwPointer plhs(*), prhs(*)
      integer nlhs, nrhs
      mwPointer mxcreatedoublematrix
      mwPointer mxgetpr
      mwPointer A, B, C
      mwSize mxgetm, mxgetn
      mwSignedIndex m, n, p
      mwSize numel
      double precision one, zero, ar, br
      character ch1, ch2
      
      ch1 = 'N'
      ch2 = 'N'
      one = 1.0
      zero = 0.0
      
      A = mxgetpr(prhs(1))
      B = mxgetpr(prhs(2))
      m = mxgetm(prhs(1))
      p = mxgetn(prhs(1))
      n = mxgetn(prhs(2))
      
      plhs(1) = mxcreatedoublematrix(m, n, 0.0)
      C = mxgetpr(plhs(1))
      numel = 1
      call mxcopyptrtoreal8(A, ar, numel)
      call mxcopyptrtoreal8(B, br, numel)
      
      call dgemm(ch1, ch2, m, n, p, one, %val(A), m,
     +           %val(B), p, zero, %val(C), m)
      
      return
      end

Ссылка на библиотеку BLAS, содержащую dgemm функция.

mex -v -R2017b calldgemm.F -lmwblas

Изменение имени функции в системах UNIX

Добавьте символ подчеркивания после имени функции при вызове функций LAPACK или BLAS в системе UNIX ®. Например, для вызоваdgemm, использовать:

dgemm_(arg1, arg2, ..., argn);

Или добавьте следующие строки в исходный код:

#if !defined(_WIN32)
#define dgemm dgemm_
#endif

Внешние веб-сайты