mex команда использует -largeArrayDims по умолчанию. В этом разделе описывается обновление файлов MEX для использования 64-разрядного API.
Вы можете продолжать использовать 32-разрядный API, позвонив mex с помощью команды -compatibleArrayDims вариант. Однако дополнительные сведения об использовании этого параметра см. в разделе Что делать, если я не выполняю обновление?.
Для просмотра и обновления исходного кода файла MEX используйте следующий контрольный список.
Подготовьте код перед редактированием - см. раздел Резервное копирование файлов и создание тестов.
Итеративно изменить и протестировать код.
Прежде чем создавать MEX-файлы с помощью 64-разрядного API, выполните рефакторинг существующего кода с помощью функции «Обновить переменные», а для Fortran - функцию «Обновить MEX-файлы Fortran» для использования 64-разрядного API.
После каждого изменения создайте и протестируйте код:
Сборка с помощью 32-разрядного API. Например, для построения myMexFile.c, введите:
mex -compatibleArrayDims myMexFile.c
Тестирование после каждого рефакторинга - см. Тестирование, отладка и устранение различий после каждой итерации рефакторинга.
Компиляция с помощью 64-разрядного API. Построить myMexFile.c, введите:
mex myMexFile.c
Устранение ошибок и предупреждений - см. раздел Устранение ошибок и предупреждений сборки -lArrayDims.
Сравните Результаты - видят, Выполняют 64-битный Файл MEX и Сравнивают Результаты с 32-битной Версией.
Проверьте память - см. Эксперимент с большими массивами.
В следующих процедурах используется терминология C/C + + и код примера. Файлы Fortran MEX имеют общие проблемы, и дополнительные задачи описаны в разделе Обновление файлов Fortran MEX для использования 64-разрядного API.
Перед изменением кода убедитесь, что файл MEX работает с 32-разрядным API. Как минимум, создайте список ожидаемых входных и выходных данных или создайте полный набор тестов. Эти тесты используются для сравнения результатов с обновленным исходным кодом. Результаты должны быть идентичными.
Резервное копирование всех исходных, двоичных и тестовых файлов.
Для обработки больших массивов преобразуйте переменные, содержащие индексы или размеры массива, чтобы использовать mwSize и mwIndex типы вместо 32-разрядного int тип. Просмотрите код, чтобы узнать, содержит ли он следующие типы переменных:
Переменные, используемые непосредственно функциями Matrix API - см. Обновление аргументов, используемых для вызова функций в 64-Bit API.
Промежуточные переменные - см. раздел Обновление переменных, используемых для индексов и размеров массивов.
Переменные, используемые как значения размера/индекса, так и как 32-разрядные целые числа - см. раздел Анализ других переменных.
Определите 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)? выявить общие проблемы сборки для конкретных компиляторов и возможные решения.
Сравните результаты выполнения файла MEX, скомпилированного с помощью 64-разрядного API, с результатами исходного двоичного файла. При наличии каких-либо различий или сбоев используйте отладчик для выяснения причины. Сведения о возможностях отладчика см. в документации по компилятору.
Чтобы определить проблемы и возможные решения, которые могут возникнуть при запуске файлов MEX, см. шаг 6 в разделе Как обновить файлы MEX для использования API обработки большого массива (-largeArrayDims)?.
После устранения проблем и обновления файла MEX он реплицирует функциональность исходного кода, используя API обработки большого массива.
При наличии доступа к компьютеру с большим объемом памяти можно экспериментировать с большими массивами. Массив чисел с плавающей запятой двойной точности (по умолчанию в MATLAB) с 232 элементами занимает приблизительно 32 ГБ памяти.
Пример использования больших массивов см. в разделе arraySize.c Файл MEX в разделе Обработка больших массивов mxArrays в файлах C MEX.