exponenta event banner

Обновление файлов MEX для использования 64-Bit API

mex команда использует -largeArrayDims по умолчанию. В этом разделе описывается обновление файлов MEX для использования 64-разрядного API.

Вы можете продолжать использовать 32-разрядный API, позвонив mex с помощью команды -compatibleArrayDims вариант. Однако дополнительные сведения об использовании этого параметра см. в разделе Что делать, если я не выполняю обновление?.

Для просмотра и обновления исходного кода файла MEX используйте следующий контрольный список.

  1. Подготовьте код перед редактированием - см. раздел Резервное копирование файлов и создание тестов.

  2. Итеративно изменить и протестировать код.

    Прежде чем создавать MEX-файлы с помощью 64-разрядного API, выполните рефакторинг существующего кода с помощью функции «Обновить переменные», а для Fortran - функцию «Обновить MEX-файлы Fortran» для использования 64-разрядного API.

    После каждого изменения создайте и протестируйте код:

  3. Компиляция с помощью 64-разрядного API. Построить myMexFile.c, введите:

    mex myMexFile.c

  4. Устранение ошибок и предупреждений - см. раздел Устранение ошибок и предупреждений сборки -lArrayDims.

  5. Сравните Результаты - видят, Выполняют 64-битный Файл MEX и Сравнивают Результаты с 32-битной Версией.

  6. Проверьте память - см. Эксперимент с большими массивами.

В следующих процедурах используется терминология C/C + + и код примера. Файлы Fortran MEX имеют общие проблемы, и дополнительные задачи описаны в разделе Обновление файлов Fortran MEX для использования 64-разрядного API.

Резервное копирование файлов и создание тестов

Перед изменением кода убедитесь, что файл MEX работает с 32-разрядным API. Как минимум, создайте список ожидаемых входных и выходных данных или создайте полный набор тестов. Эти тесты используются для сравнения результатов с обновленным исходным кодом. Результаты должны быть идентичными.

Резервное копирование всех исходных, двоичных и тестовых файлов.

Обновить переменные

Для обработки больших массивов преобразуйте переменные, содержащие индексы или размеры массива, чтобы использовать mwSize и mwIndex типы вместо 32-разрядного int тип. Просмотрите код, чтобы узнать, содержит ли он следующие типы переменных:

Обновить аргументы, используемые для вызова функций в API 64-Bit

Определите 64-разрядные функции API в коде, которые используют mwSize / mwIndex типы. Список функций см. в разделе Использование API 64-Bit. Выполните поиск переменных, используемых для вызова функций. Проверьте подпись функции, показанную под заголовком Синтаксис в справочной документации по функции. Сигнатура определяет переменные, которые принимают mwSize / mwIndex значения в качестве входных или выходных значений. Измените переменные, чтобы использовать правильный тип.

Например, предположим, что код использует mxCreateDoubleMatrix , как показано в следующих инструкциях:

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

Для просмотра сигнатуры функции введите:

doc mxCreateDoubleMatrix

Подпись:

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

Тип входных аргументов m и n является 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. При копировании 64-разрядного значения из строк в 32-разрядную переменную numDataPoints результирующее значение усекается. Возможно, в файле MEX произошел сбой или получены неверные результаты. Тип использования mwSize для numDataPoints, как показано в следующей таблице.

Заменить:С:
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);

Сигнатуры функций для mxCreateDoubleMatrix и mxCreateStructMatrix являются:

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

Для mxCreateDoubleMatrix функция, код использует numSensors для переменной m. Тип m: mwSize. Для mxCreateStructMatrix функция, код использует 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);

Тестирование, отладка и устранение различий после каждой итерации рефакторинга

Построить myMexFile.c с 32-разрядным API введите:

mex -compatibleArrayDims myMexFile.c

Используйте тесты, созданные в начале этого процесса, чтобы сравнить результаты обновленного файла MEX с исходным двоичным файлом. Оба файла MEX должны возвращать одинаковые результаты. В противном случае выполните отладку и устраните любые различия. Различия легче устранить сейчас, чем при построении с использованием 64-разрядного API.

Твердость -largeArrayDims Ошибки и предупреждения построения

После просмотра и обновления кода скомпилируйте файл MEX с помощью API обработки большого массива. Построить myMexFile.c с 64-разрядным API введите:

mex myMexFile.c

С момента mwSize / mwIndex типы MATLAB ®, компилятор иногда ссылается на них какsize_t, unsigned_int64, или другими аналогичными именами.

Большинство проблем сборки связано с несоответствиями типов между 32-разрядными и 64-разрядными типами. См. шаг 5 в разделе Как обновить MEX-файлы для использования API обработки больших массивов (-largeArrayDims)? выявить общие проблемы сборки для конкретных компиляторов и возможные решения.

Выполните 64-битный файл MEX и сравните результаты с 32-битной версией

Сравните результаты выполнения файла MEX, скомпилированного с помощью 64-разрядного API, с результатами исходного двоичного файла. При наличии каких-либо различий или сбоев используйте отладчик для выяснения причины. Сведения о возможностях отладчика см. в документации по компилятору.

Чтобы определить проблемы и возможные решения, которые могут возникнуть при запуске файлов MEX, см. шаг 6 в разделе Как обновить файлы MEX для использования API обработки большого массива (-largeArrayDims)?.

После устранения проблем и обновления файла MEX он реплицирует функциональность исходного кода, используя API обработки большого массива.

Эксперимент с большими массивами

При наличии доступа к компьютеру с большим объемом памяти можно экспериментировать с большими массивами. Массив чисел с плавающей запятой двойной точности (по умолчанию в MATLAB) с 232 элементами занимает приблизительно 32 ГБ памяти.

Пример использования больших массивов см. в разделе arraySize.c Файл MEX в разделе Обработка больших массивов mxArrays в файлах C MEX.

Связанные примеры

Подробнее

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