Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Actualice los archivos MEX para usar la API de 64 bits

El comando utiliza la opción de forma predeterminada.mex-largeArrayDims En este tema se describe cómo actualizar los archivos MEX para usar la API de 64 bits.

Puede seguir utilizando la API de 32 bits llamando al comando con la opción.mex-compatibleArrayDims Sin embargo, para obtener más información sobre el uso de esta opción, consulte.¿Qué pasa si no actualizo?

Para revisar y actualizar el código fuente del archivo MEX, utilice la siguiente lista de comprobación.

  1. Prepare el código antes de editarlo: consulte.Copia de respaldo de archivos y crear pruebas

  2. Cambiar y probar el código de forma iterativa.

    Antes de compilar los archivos MEX con la API de 64 bits, refactoriza el código existente comprobando las siguientes condiciones:

    Después de cada cambio, compile y pruebe el código:

  3. Compile con la API de 64 bits. Para compilar, escriba:myMexFile.c

    mex myMexFile.c

  4. Resolver errores y advertencias: consulte.Resolver errores y advertencias de compilación-largeArrayDims

  5. Comparar resultados — ver.Ejecute el archivo MEX de 64 bits y compare los resultados con la versión de 32 bits

  6. Comprobar la memoria — ver.Experimente con matrices grandes

Los procedimientos siguientes utilizan la terminología de C/C++ y el código de ejemplo. Fortran archivos MEX comparten problemas, con más tareas descritas en.Pasos adicionales para actualizar el código fuente de Fortran

Copia de respaldo de archivos y crear pruebas

Antes de modificar el código, compruebe que el archivo MEX funciona con la API de 32 bits. Como mínimo, compile una lista de entradas y salidas esperadas, o cree un conjunto de pruebas completo. Utilice estas pruebas para comparar los resultados con el código fuente actualizado. Los resultados deben ser idénticos.

Copia de respaldo de todos los archivos de origen, binarios y de prueba.

Actualizar variables

Para manejar matrices grandes, convierta variables que contengan índices de matriz o tamaños para usar los tipos y en lugar del tipo de 32 bits.mwSizemwIndexint Revise el código para ver si contiene los siguientes tipos de variables:

Actualizar argumentos usados para llamar a funciones en la API de 64 bits

Identifique las funciones de API de 64 bits en el código que usan los tipos/.mwSizemwIndex Para ver la lista de funciones, consulte.Con la API de 64 bits Busque las variables que utiliza para llamar a las funciones. Compruebe la firma de la función, mostrada debajo del encabezado en la documentación de referencia de función.Syntax La firma identifica las variables que toman/valora como valores de entrada o salida.mwSizemwIndex Cambie las variables para usar el tipo correcto.

Por ejemplo, supongamos que el código usa la función, como se muestra en las siguientes instrucciones:mxCreateDoubleMatrix

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

Para ver la firma de la función, escriba:

doc mxCreateDoubleMatrix

La firma es:

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

El tipo de argumentos de entrada y es.mnmwSize Cambie el código como se muestra en la tabla.

Reemplazar:Con:
int nrows,ncolumns; 
mwSize nrows,ncolumns; 

Actualizar variables utilizadas para los índices y tamaños de matrices

Si el código utiliza variables intermedias para calcular el tamaño y los valores de índice, utilice/para estas variables.mwSizemwIndex Por ejemplo, el código siguiente declara las entradas como tipo:mxCreateDoubleMatrixmwSize

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

En este ejemplo se utiliza la variable intermedia (de tipo) para calcular el valor de.numDataPointsintncolumns Si copia un valor de 64 bits de la variable de 32 bits, el valor resultante trunca.nrowsnumDataPoints Su archivo MEX podría bloquearse o producir resultados incorrectos. Utilice el tipo para, como se muestra en la tabla siguiente.mwSizenumDataPoints

Reemplazar:Con:
int numDataPoints;
mwSize numDataPoints;

Analizar otras variables

No es necesario cambiar todas las variables de enteros en el código. Por ejemplo, los números de campo de las estructuras y los códigos de estado son de tipo.int Sin embargo, es necesario identificar las variables utilizadas para varios propósitos y, si es necesario, reemplazarlas por varias variables.

En el ejemplo siguiente se crea una matriz, y una estructura, en función del número de sensores.myNumericmyStruct El código utiliza una variable, tanto para el tamaño de la matriz como para el número de campos de la estructura.numSensors

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

Las firmas de función para y son:mxCreateDoubleMatrixmxCreateStructMatrix

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

Para la función, el código utiliza para la variable.mxCreateDoubleMatrixnumSensorsm El tipo de es.mmwSize Para la función, el código utiliza para la variable.mxCreateStructMatrixnumSensorsnfields El tipo de es.nfieldsint Reemplace con dos nuevas variables para controlar ambas funciones, como se muestra en la tabla siguiente.numSensors

Reemplazar:Con:
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); 

Reemplazar funciones no admitidas

Al actualizar archivos MEX más antiguos, puede encontrar llamadas a funciones no admitidas, como, o. se eliminó la compatibilidad con estas funciones en la versión 7,1 (R14SP3).mxCreateFullmxGetNamemxIsStringMATLAB® No se pueden utilizar funciones no admitidas con dimensiones de matriz de 64 bits. Para ver la lista de funciones no admitidas y los reemplazos recomendados, consulte.

Actualice el código para usar una función equivalente, si está disponible. Por ejemplo, use en lugar de.mxCreateDoubleMatrixmxCreateFull

Probar, depurar y resolver diferencias después de cada iteración de refactorización

Para compilar con la API de 32 bits, escriba:myMexFile.c

mex -compatibleArrayDims myMexFile.c

Utilice las pruebas que creó al principio de este proceso para comparar los resultados de su archivo MEX actualizado con su archivo binario original. Ambos archivos MEX deben devolver resultados idénticos. Si no, depure y resuelva las diferencias. Las diferencias son más fáciles de resolver ahora que cuando se compila con la API de 64 bits.

Resolver errores y advertencias de compilación-largeArrayDims

Después de revisar y actualizar el código, compile el archivo MEX con la API de control de matrices grandes. Para compilar con la API de 64 bits, escriba:myMexFile.c

mex myMexFile.c

Dado que los tipos son tipos, el compilador a veces se refiere a ellos como, o por otros nombres similares.mwSizemwIndexMATLABsize_tunsigned_int64

La mayoría de los problemas de compilación están relacionados con las discrepancias de tipo entre los tipos de 32 bits y 64 bits. Consulte el paso 5 para identificar problemas de compilación comunes para compiladores específicos y posibles soluciones.¿Cómo actualizo los archivos MEX para usar la API de manejo de matrices grandes (-largeArrayDims)?

Ejecute el archivo MEX de 64 bits y compare los resultados con la versión de 32 bits

Compare los resultados de la ejecución de su archivo MEX compilado con la API de 64 bits con los resultados de su binario original. Si hay diferencias o errores, utilice un depurador para investigar la causa. Para obtener información sobre las capacidades del depurador, consulte la documentación del compilador.

Para identificar problemas, y posibles soluciones, puede que se encuentre al ejecutar sus archivos MEX, consulte el paso 6 en.¿Cómo actualizo los archivos MEX para usar la API de manejo de matrices grandes (-largeArrayDims)?

Después de resolver los problemas y actualizar el archivo MEX, replica la funcionalidad del código original mientras se usa la API de control de matriz grande.

Experimente con matrices grandes

Si tiene acceso a una máquina con grandes cantidades de memoria, puede experimentar con matrices grandes. Una matriz de números de punto flotante de precisión doble (el valor predeterminado en) con 2MATLAB32 elementos toma aproximadamente 32 GB de memoria.

Para obtener un ejemplo que muestra el uso de matrices grandes, vea el archivo MEX en.arraySize.cManipulación de grandesmxArrays

Ejemplos relacionados

Más acerca de

Sitios web externos