Main Content

64비트 API를 사용하도록 MEX 파일 업그레이드하기

mex 명령은 기본적으로 -largeArrayDims 옵션을 사용합니다. 여기에서는 64비트 API를 사용하도록 MEX 파일을 업그레이드하는 방법을 설명합니다.

mex 명령을 -compatibleArrayDims 옵션과 함께 호출하면 32비트 API를 계속 사용할 수 있습니다. 이 옵션의 사용 방법에 대한 자세한 내용은 What If I Do Not Upgrade? 항목을 따로 참조하십시오.

MEX 파일 소스 코드를 검토하고 업데이트하려면 다음 검사 목록을 사용하십시오.

  1. 코드를 편집하기 전에 준비합니다. 파일을 백업하고 테스트 모음 만들기 항목을 참조하십시오.

  2. 코드 변경 및 테스트를 반복합니다.

    64비트 API를 사용하여 MEX 파일을 빌드하기 전에, 변수 업데이트하기 항목(Fortran의 경우 Upgrade Fortran MEX Files to use 64-bit API 항목)을 사용하여 기존 코드를 리팩터링하십시오.

    매 변경 후 코드를 빌드하고 테스트하십시오.

  3. 64비트 API를 사용하여 컴파일합니다. myMexFile.c를 빌드하려면 다음을 입력하십시오.

    mex myMexFile.c

  4. 실패와 경고를 해결합니다. -largeArrayDims 빌드 실패와 경고 해결하기 항목을 참조하십시오.

  5. 결과값을 비교합니다. 64비트 MEX 파일을 실행한 후 결과값을 32비트 버전과 비교하기 항목을 참조하십시오.

  6. 메모리를 확인합니다. 대규모 배열 사용해 보기 항목을 참조하십시오.

다음 절차에서는 C/C++ 용어와 예제 코드를 사용합니다. Fortran MEX 파일도 동일한 문제를 가집니다. 자세한 작업은 Upgrade Fortran MEX Files to use 64-bit API에 설명되어 있습니다.

파일을 백업하고 테스트 모음 만들기

코드를 수정하기 전에 MEX 파일이 32비트 API에서 제대로 작동하는지 확인하십시오. 최소한, 예상 입력값과 출력값의 목록을 작성하거나 전체 테스트 스위트를 만드십시오. 이러한 테스트 모음을 사용하여, 업데이트한 소스 코드와 결과값을 비교하십시오. 결과값이 동일해야 합니다.

소스 파일, 이진 파일, 테스트 파일을 모두 백업하십시오.

변수 업데이트하기

대규모 배열을 처리하려면 배열 인덱스나 배열 크기가 들어 있는 변수를 32비트 int 유형 대신 mwSize 유형과 mwIndex 유형을 사용하도록 변환하십시오. 코드를 검토하여 다음 유형의 변수가 포함되어 있는지 확인하십시오.

64비트 API의 함수를 호출하는 데 사용되는 인수 업데이트하기

코드에서 mwSize / mwIndex 유형을 사용하는 64비트 API 함수를 식별하십시오. 함수 목록을 보려면 Using the 64-Bit API 항목을 참조하십시오. 이러한 함수를 호출하는 데 사용하는 변수를 검색하십시오. 함수 도움말 문서에서 구문이라는 소제목 아래에 표시되는 함수 시그니처를 확인하십시오. 이 시그니처를 통해 입력값이나 출력값으로 mwSize / mwIndex 값을 받는 변수를 식별할 수 있습니다. 올바른 유형을 사용하도록 변수를 변경하십시오.

예를 들어, 코드에서 다음 명령문에 표시된 것과 같은 mxCreateDoubleMatrix 함수를 사용한다고 가정하겠습니다.

int nrows,ncolumns;
...
y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);

함수 시그니처를 보려면 다음을 입력하십시오.

doc mxCreateDoubleMatrix

시그니처는 다음과 같습니다.

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, 
    mxComplexity ComplexFlag)

입력 인수 mn의 유형은 mwSize입니다. 다음 표에 나와 있는 것처럼 코드를 변경하십시오.

변경 전변경 후
int nrows,ncolumns;
mwSize nrows,ncolumns;

배열 인덱스와 배열 크기에 사용되는 변수 업데이트하기

코드에서 중간 변수를 사용하여 크기 값과 인덱스 값을 계산하는 경우, 이러한 변수에 mwSize / mwIndex를 사용하십시오. 예를 들어, 다음 코드는 mxCreateDoubleMatrix에 대한 입력값을 mwSize 유형으로 선언합니다.

mwSize nrows,ncolumns;	/* inputs to mxCreateDoubleMatrix */
int numDataPoints;
nrows = 3;
numDataPoints = nrows * 2;
ncolumns = numDataPoints + 1;
...
y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);

이 예제에서는 중간 변수 numDataPoints(int 유형)를 사용하여 ncolumns의 값을 계산합니다. nrows의 64비트 값을 32비트 변수 numDataPoints로 복사하면 결과값이 잘립니다. MEX 파일이 예기치 않게 종료되거나 잘못된 결과값을 생성할 수 있습니다. 다음 표에 나와 있는 것처럼, numDataPoints에 mwSize 유형을 사용하십시오.

변경 전변경 후
int numDataPoints;
mwSize numDataPoints;

기타 변수 분석하기

코드에 있는 정수형 변수를 모두 변경할 필요는 없습니다. 예를 들어, 구조체의 필드 번호와 상태 코드는 모두 int 유형입니다. 그러나 여러 용도로 사용되는 변수는 식별해야 하며, 필요한 경우 이러한 변수를 여러 개의 변수로 바꿔야 합니다.

다음 예제에서는 센서 개수를 기반으로 하여 행렬 myNumeric과 구조체 myStruct를 생성합니다. 이 코드에서는 배열의 크기와 구조체의 필드 개수 둘 다에 하나의 변수 numSensors를 사용하고 있습니다.

mxArray *myNumeric, *myStruct;
int numSensors;
mwSize m, n;
char **fieldnames;
...
myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL);
myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames);

mxCreateDoubleMatrixmxCreateStructMatrix의 함수 시그니처는 다음과 같습니다.

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n,
    mxComplexity ComplexFlag)
mxArray *mxCreateStructMatrix(mwSize m, mwSize n,
    int nfields, const char **fieldnames);

mxCreateDoubleMatrix 함수의 경우, 이 코드에서는 변수 m에 대해 numSensors를 사용하고 있습니다. m의 유형은 mwSize입니다. mxCreateStructMatrix 함수의 경우, 이 코드에서는 변수 nfields에 대해 numSensors를 사용하고 있습니다. nfields의 유형은 int입니다. 두 함수를 모두 처리하려면 다음 표에 나와 있는 것처럼 numSensors를 두 개의 새 변수로 바꾸십시오.

변경 전변경 후
int numSensors;
/* create 2 variables   */
/* of different types */
mwSize numSensorSize;
int numSensorFields;
myNumeric = 
    mxCreateDoubleMatrix(
    numSensors,
    n, mxREAL);
/* use mwSize variable */
/* numSensorSize       */
myNumeric = 
    mxCreateDoubleMatrix(
    numSensorSize,
    n, mxREAL);
myStruct = 
    mxCreateStructMatrix(
    m, n,
    numSensors,
    fieldnames);
/* use int variable */
/* numSensorFields  */
myStruct = 
    mxCreateStructMatrix(
    m, n,
    numSensorFields,
    fieldnames);

리팩터링을 반복할 때마다 테스트하고, 디버그하고, 결과값의 차이 해결하기

32비트 API를 사용하여 myMexFile.c를 빌드하려면 다음을 입력하십시오.

mex -compatibleArrayDims myMexFile.c

이 과정의 초반에 만든 테스트 모음을 사용해서, 업데이트한 MEX 파일의 결과값을 원래 이진 파일과 비교해 보십시오. 두 MEX 파일이 모두 동일한 결과값을 반환해야 합니다. 그렇지 않다면, 디버그를 통해 결과값의 차이를 해결하십시오. 64비트 API를 사용하여 빌드하기 전에 지금 그 차이를 해결하는 것이 더 낫습니다.

-largeArrayDims 빌드 실패와 경고 해결하기

코드를 검토하고 업데이트한 후에, 대규모 배열을 처리하는 API를 사용하여 MEX 파일을 컴파일하십시오. 64비트 API를 사용하여 myMexFile.c를 빌드하려면 다음을 입력하십시오.

mex myMexFile.c

mwSize / mwIndex 유형은 MATLAB® 유형이므로, 컴파일러는 때때로 이러한 유형을 size_t, unsigned_int64 또는 다른 유사한 이름으로 간주합니다.

대부분의 빌드 문제는 32비트 데이터형과 64비트 데이터형 간의 불일치와 관련이 있습니다. 특정 컴파일러의 일반적인 빌드 문제와 가능한 해결 방법을 확인하려면 How do I update MEX-files to use the large array handling API (-largeArrayDims)?의 5단계를 참조하십시오.

64비트 MEX 파일을 실행한 후 결과값을 32비트 버전과 비교하기

64비트 API를 사용하여 컴파일한 MEX 파일의 실행 결과값을 원래 이진 파일의 결과값과 비교하십시오. 결과값에 차이가 있거나 실패가 있다면 디버거를 사용하여 원인을 조사하십시오. 디버거의 기능에 대한 자세한 내용은 사용 중인 컴파일러 문서를 참조하십시오.

MEX 파일을 실행할 때 발생할 수 있는 문제와 가능한 해결 방법을 확인하려면 How do I update MEX-files to use the large array handling API (-largeArrayDims)?의 6단계를 참조하십시오.

문제를 해결하고 MEX 파일을 업그레이드하고 나면, 원래 코드의 기능은 그대로 유지하면서 이 파일은 대규모 배열을 처리하는 API를 사용할 수 있게 됩니다.

대규모 배열 사용해 보기

대용량 메모리가 있는 컴퓨터에 액세스할 수 있는 경우 대규모 배열을 사용해 볼 수 있습니다. 232개의 요소를 가지며 배정밀도 부동소수점 숫자(MATLAB의 디폴트 데이터형)로 구성된 배열은 약 32GB의 메모리를 사용합니다.

대규모 배열의 사용 방법을 보여 주는 예제는 Handling Large mxArrays in C MEX Files에서 MEX 파일 arraySize.c를 참조하십시오.

관련 예제

세부 정보

외부 웹사이트