Tengo una función Mex (una función en C++ que puede llamar desde Matlab) que he escrito, y quiero perfilarla usando valgrind/kcachegrind. Sé cómo usar valgrind/kcachegrind si está ejecutando un programa de C++ directamente, pero ¿hay alguna forma de hacer este perfil si estoy llamando al programa de C++ de Matlab?Cómo perfilo una función MEX en Matlab
Respuesta
Perfilar archivos MEX es complicado ya que los archivos MEX son bibliotecas compartidas. No se puede hacer en Linux utilizando el enfoque estándar 'gprof' - gprof simplemente no hace eso. Intenté usar sprof, pero obtengo “PLTREL not found error” - sprof no se puede usar tampoco. Hay una publicación anterior here, pero nadie dio una respuesta final.
Afortunadamente, hay una manera en que uno puede hacerlo con valgrind en Linux. Primero, tenemos que escribir el código 'en ejecución' que carga el archivo mex, proporciona el símbolo de función mex para que llamemos y establece los parámetros del archivo MEX. He elegido usar la forma recomendada de hacerlo con MATLAB, usando MATLAB engine. El siguiente código (guardar como prueba.c) carga un archivo MEX y encuentra el símbolo de función mex, carga los datos de entrada de un archivo previamente guardado como 'input.mat' (se puede hacer en MATLAB usando el comando guardar) y llama a la función mexFunction.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dlfcn.h>
#include "engine.h"
typedef void (*mexFunction_t)(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[]);
int main(int argc, const char *argv[])
{
Engine *ep;
char buff[1024];
int i;
/* matlab must be in the PATH! */
if (!(ep = engOpen("matlab -nodisplay"))) {
fprintf(stderr, "Can't start MATLAB engine\n");
return -1;
}
engOutputBuffer(ep, buff, 1023);
/* load the mex file */
if(argc<2){
fprintf(stderr, "Error. Give full path to the MEX file as input parameter.\n");
return -1;
}
void *handle = dlopen(argv[1], RTLD_NOW);
if(!handle){
fprintf(stderr, "Error loading MEX file: %s\n", strerror(errno));
return -1;
}
/* grab mexFunction handle */
mexFunction_t mexfunction = (mexFunction_t)dlsym(handle, "mexFunction");
if(!mexfunction){
fprintf(stderr, "MEX file does not contain mexFunction\n");
return -1;
}
/* load input data - for convenience do that using MATLAB engine */
/* NOTE: parameters are MEX-file specific, so one has to modify this*/
/* to fit particular needs */
engEvalString(ep, "load input.mat");
mxArray *arg1 = engGetVariable(ep, "Ain");
mxArray *arg2 = engGetVariable(ep, "opts");
mxArray *pargout[1] = {0};
const mxArray *pargin[2] = {arg1, arg2};
/* execute the mex function */
mexfunction(1, pargout, 2, pargin);
/* print the results using MATLAB engine */
engPutVariable(ep, "result", pargout[0]);
engEvalString(ep, "result");
printf("%s\n", buff);
/* cleanup */
mxDestroyArray(pargout[0]);
engEvalString(ep, "clear all;");
dlclose(handle);
engClose(ep);
return 0;
}
El archivo MEX sí también debe compilado con el interruptor mex -g
. El código anterior debe compilarse con mex -g
y usar engopts.sh como parámetros de compilación. Desde MATLAB tipo de línea de comandos
mex('-v', '-f', fullfile(matlabroot,...
'bin','engopts.sh'),...
'test.c');
o en una norma de ejecución terminal de Linux
/path/to/matlab/bin/mex -g -f /path/to/matlab/bin/engopts.sh test.c
perfilar el archivo MEX con valgrind requiere la ejecución del programa de 'prueba' de la línea de comandos. En el directorio en ambas pruebas y el archivo MEX residen escriba el comando:
PATH=$PATH:/path/to/matlab/bin/ LD_LIBRARY_PATH=/path/to/matlab/bin/glnxa64/:/path/to/matlab/sys/os/glnxa64/ valgrind --tool=callgrind ./test ./mex_file.mexa64
Recuerde que la ruta a MATLAB y corregir las rutas de bibliotecas dependientes de la arquitectura deben fijarse! el ejecutable de matlab debe estar presente en la RUTA, de lo contrario, la 'prueba' fallará.
Hay una captura más. El motor de MATLAB requiere que se instale csh en el sistema (puede usar cualquier shell, csh solo necesita estar presente en/bin). Entonces, si no lo tiene, debe instalarlo para que funcione.
Se podría empezar MATLAB con la opción -D, tal como se describe en este MatlabCentral thread:
matlab -nojvm -nodesktop -nosplash -D"valgrind --error-limit=no --leak-check=yes --tool=memcheck -v --log-file=valgrind.log"
Yo añadiría a asegurarse de que usted tiene la última versión de valgrind. Cuando intenté depurar mi archivo MEX con valgrind versión 3.6, valgrind se bloqueó en lugar de informar errores de memoria.
- 1. Perfilando una función mex
- 2. Estructuras definidas por el usuario con una función MATLAB mex
- 3. C++/MATLAB Mex binding
- 4. ¿Cómo acceder a una matriz en el campo de una estructura matlab desde una función mex?
- 5. cómo leer una matriz entera en la función MEX
- 6. Cómo vincular durante MEX compilación de Matlab
- 7. ¿Cómo agregar texto de "ayuda" a una función mex?
- 8. Incrustar una función desde un archivo MEX de Matlab directamente en Python
- 9. ejecutando un viejo archivo mex en nuevas versiones de matlab
- 10. Vinculación de FFTW en el archivo Matlab Mex
- 11. ¿Cómo perfilo una aplicación web de Perl?
- 12. ubicaciones de bibliotecas compartidas para archivos mex de matlab:
- 13. pasar una función a una función en Matlab
- 14. ¿Cómo perfilo mis programas Perl?
- 15. ¿Cómo crear una GUI dentro de una función en MATLAB?
- 16. ¿Cómo perfilo el uso de la memoria en Python?
- 17. ¿Cómo devolver un valor flotante de una función mex y cómo recuperarlo de m-file?
- 18. ¿Cómo puedo hacer una función anónima "vacía" en MATLAB?
- 19. ¿Cómo paso una cadena como argumento de función en MATLAB?
- 20. ¿Cómo devuelvo una función como valor de salida en MATLAB?
- 21. ¿Cómo perfilo y optimizo un XSLT?
- 22. Sobrecargar correctamente un stringbuf para reemplazar cout en un archivo MATLAB mex
- 23. ¿Cómo perfilo el código cuando uso knitr?
- 24. Función de mapa en MATLAB?
- 25. matlab función "memoria" en mac?
- 26. Interfaz MATLAB MEX para un objeto de clase con funciones múltiples
- 27. ¿Cómo convierto una función anónima a una función simbólica en MATLAB?
- 28. Llamar a una función MATLAB desde C#
- 29. MATLAB: la función Separar
- 30. ¿Cómo acceder a una función de matlab desde código java?
Gran pregunta, a menudo me he preguntado sobre esto. Lamentablemente, no sé la respuesta, pero sé que es posible perfilar el código Mex con Visual Studio ... –
@BillCheatham Puede usar valgrind en Linux utilizando el código de envoltura para cargar el archivo MEX, que es esencialmente una biblioteca dinámica. Eche un vistazo a mi respuesta. – angainor
Alex, ¿encontraste alguna otra forma de perfilar archivos mex? Tengo curiosidad – angainor