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

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

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

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

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

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

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

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

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

  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

Передайте аргументы в функции ФОРТРАН из программ на C/C + +

Функции LAPACK и BLAS написаны на языке фортран. C/C + + и Фортран используют различные соглашения для передачи аргументов в функции и из них. Функции ФОРТРАН передают аргументы по ссылкам, в то время как функции C/C + + передают аргументы по значению. Когда вы передаете значение, вы передаете копию значения. Когда вы проходите мимо ссылки, вы передаете указатель на значение. Ссылка также является адресом значения.

При вызове стандартной подпрограммы Фортран, как функция из 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 Пример

The matrixMultiply.c пример вызовов dgemm, передача всех аргументов по ссылке. Чтобы увидеть исходный код, откройте matrixMultiply.c в редакторе MATLAB. Чтобы создать и запустить этот пример, смотрите Build matrixMultiply MEX-функция Using BLAS Functions.

Передайте аргументы в функции ФОРТРАН из программ ФОРТРАН

Можно вызвать функции LAPACK и BLAS из файлов 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

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