Main Content

LAPACK과 BLAS 함수 호출하기

MEX 파일을 사용하여 LAPACK 또는 BLAS 함수를 호출할 수 있습니다. MEX 파일을 만들려면 C/C++ 또는 Fortran 프로그래밍 경험과 실행 파일을 빌드하기 위한 소프트웨어 리소스(컴파일러와 링커)가 필요합니다. Fortran 서브루틴 사용 방법을 이해하는 것도 도움이 됩니다. MATLAB®matlabroot/extern/libmwlapackmwblas 라이브러리를 제공합니다. 시작하는 데 도움이 되도록 matlabroot/extern/examples/refbook에 소스 코드 예제가 들어 있습니다.

LAPACK 또는 BLAS 함수를 호출하려면 다음을 수행하십시오.

  1. mexFunction 게이트웨이 루틴이 포함된 소스 MEX 파일을 만듭니다.

  2. 사용 중인 플랫폼에 대해 지원되는 컴파일러가 있는지 확인합니다. 지원되는 컴파일러의 최신 목록을 보려면 지원 및 호환되는 컴파일러를 참조하십시오.

  3. mex 명령과 실수부/허수부 분리형의 복소수 빌드 플래그 -R2017b를 사용하여 이진 MEX 파일을 빌드합니다.

    • 라이브러리 mwlapackmwblas 중 하나 또는 둘 모두에 소스 파일을 링크합니다.

    • mwlapackmwblas 라이브러리는 행렬 차원에 대해 64비트 정수만 지원합니다. -compatibleArrayDims 옵션은 사용하지 마십시오.

    • 복소수를 사용하는 함수를 갖는 MEX 파일을 빌드하려면 Pass Separate Complex Numbers to Fortran Functions 항목을 참조하십시오.

  4. BLAS 또는 LAPACK 함수에 대한 자세한 내용은 https://netlib.org/blas/ 또는 https://netlib.org/lapack/ 항목을 참조하십시오.

BLAS 함수를 사용하는 matrixMultiply MEX 함수 빌드하기

이 예제에서는 BLAS 라이브러리의 함수를 사용하는 예제 MEX 파일 matrixMultiply.c를 빌드하는 방법을 보여줍니다. 이 파일로 작업하려면 파일을 로컬 폴더로 복사하십시오. 예를 들어, 다음과 같이 입력합니다.

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에 대한 인수를 처리하는 방법에 대한 자세한 내용은 Managing Input and Output Parameters 항목을 참조하십시오.

matrixDivide 예제

이 예제에서는 입력 인수를 수정하는 LAPACK 함수 dgesv를 호출합니다. 이 예제의 코드는 입력 인수의 내용을 유지하기 위해 prhs[0]prhs[1]의 복사본을 만든 다음 이들 복사본을 dgesv에 전달합니다.

예제를 보려면 MATLAB 편집기에서 matrixDivide.c를 여십시오. 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++ 프로그램에서 Fortran 함수에 인수 전달하기

LAPACK 함수와 BLAS 함수는 Fortran으로 작성되었습니다. C/C++와 Fortran은 인수를 함수에 전달하거나 함수에서 인수를 전달받는 데 서로 다른 규칙을 사용합니다. Fortran 함수는 참조 방식으로 인수를 전달하는 반면, C/C++ 함수는 값 방식으로 인수를 전달합니다. 값 방식으로 전달할 때는 값의 복사본을 전달합니다. 참조 방식으로 전달할 때는 값에 대한 포인터를 전달합니다. 참조는 값의 주소이기도 합니다.

LAPACK 또는 BLAS의 함수 같은 Fortran 서브루틴을 호출할 때는 C/C++ 프로그램에서 인수를 참조 방식으로 전달해야 합니다. 참조 방식으로 전달하려면 인수가 이미 참조가 아닌 한 인수 앞에 앰퍼샌드(&)를 붙이십시오. 예를 들어, mxGetDoubles 함수를 사용하여 행렬을 만들 경우 행렬에 대한 참조를 생성하므로 인수 앞에 앰퍼샌드를 붙일 필요가 없습니다.

다음 코드 조각에서 변수 m, n, p, onezero를 참조로 만들려면 & 문자가 필요합니다. 변수 A, B, Cchn은 포인터이며 즉, 참조입니다.

/* 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을 호출하고, 모든 인수를 참조 방식으로 전달합니다. 소스 코드를 보려면 MATLAB 편집기에서 matrixMultiply.c를 여십시오. 이 예제를 빌드하고 실행하려면 BLAS 함수를 사용하는 matrixMultiply MEX 함수 빌드하기 항목을 참조하십시오.

Fortran 프로그램에서 Fortran 함수에 인수 전달하기

Fortran MEX 파일에서 LAPACK 함수와 BLAS 함수를 호출할 수 있습니다. 다음 예제에서는 두 개의 행렬을 가져온 후 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

dgemm 함수가 들어 있는 BLAS 라이브러리에 링크합니다.

mex -v -R2017b calldgemm.F -lmwblas

UNIX 시스템에서 함수 이름 수정하기

UNIX® 시스템에서 LAPACK 또는 BLAS 함수를 호출할 경우 함수 이름 다음에 밑줄 문자를 추가하십시오. 예를 들어, dgemm을 호출하려면 다음을 사용하십시오.

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

또는 소스 코드에 다음 라인을 추가합니다.

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

외부 웹사이트