Обновление файлов MEX, чтобы использовать 64-битный API

Команда mex использует опцию -largeArrayDims по умолчанию. Эта тема описывает, как обновить ваши файлы MEX, чтобы использовать 64-битный API.

Можно продолжить использовать 32-битный API путем вызова команды mex с опцией -compatibleArrayDims. Однако для получения дополнительной информации об использовании этой опции, смотрите Что, Если я Не Обновляю?.

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

  1. Подготовьтесь ваш код прежде, чем отредактировать — видят, поддерживают Файлы и Создают Тесты.

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

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

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

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

    mex myMexFile.c

  4. Разрешите отказы, и предупреждения — видят Твердость Отказы Сборки-largeArrayDims и Предупреждения.

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

  6. Проверяйте, что память — видит Эксперимент с Большими массивами.

Следующие процедуры используют терминологию C/C++ и пример кода. Выпуски акций файлов MEX Фортрана, с большим количеством задач, описанных на Дополнительных Шагах, чтобы Обновить Исходный код Фортрана.

Поддержка файлов и создание тестов

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

Поддержите весь источник, двоичный файл и тестовые файлы.

Обновление переменных

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

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

Идентифицируйте 64-битные API-функции в своем коде, которые используют mwSize / типы mwIndex. Для списка функций смотрите Используя 64-битный API. Ищите переменные, которые вы используете, чтобы вызвать функции. Проверяйте функциональную подпись, показанную под Синтаксисом, направляющимся на документации ссылки на функцию. Подпись идентифицирует переменные, которые берут 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-битное значение с nrows в 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. Типом для 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);

Замена неподдерживаемых функций

При обновлении более старых файлов MEX вы могли найти вызовы неподдерживаемых функций, таких как mxCreateFull, mxGetName или mxIsString. MATLAB® удалил поддержку этих функций в Версии 7.1 (R14SP3). Вы не можете использовать неподдерживаемые функции с 64-битными измерениями массива. Для списка неподдерживаемых функций и рекомендуемых замен, смотрите Устаревшие Функции, Более не не Зарегистрированные.

Обновите свой код, чтобы использовать эквивалентную функцию при наличии. Например, используйте mxCreateDoubleMatrix вместо mxCreateFull.

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

Чтобы создать 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 Гбайт памяти.

Для примера, который демонстрирует использование больших массивов, смотрите файл MEX arraySize.c в Обработке Большого mxArrays.

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

Больше о

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

Для просмотра документации необходимо авторизоваться на сайте