2009-08-14 23 views
10

Acabo de reescribir un programa Matlab en C++ como una función mex para acelerar las cosas, con resultados fantásticos. Esta decisión de optimización fue una muy buena idea, con hasta un factor de aceleración de 20 sin enhebrar. Todavía me dejó curiosidad sobre en qué estaba gastando el tiempo la función mex y quería identificar posibles cuellos de botella.Perfilando una función mex

Estoy buscando una manera de perfilar mex-functions. El profiler de matlab no es de mucha utilidad, y los otros profilers que he descargado (tanto de forma gratuita como de prueba) todos quieren que se ejecute un ejecutable. No soy un gurú mexicano, pero por lo que he entendido, la única forma de ejecutar un mex es desde dentro de Matlab. La función mex se compila en un dll, pero se llama .mex64. Entonces, este problema debería ser similar a perfilar un dll. Para escribir la función mex de C++ utilicé un VS2005 de un solo usuario (es decir, no la versión de equipo) y estoy ejecutando en una plataforma x64.

¿Alguien sabe de una buena manera de perfilar una función mex? ¿Qué herramienta debo usar y cómo la uso cuando comienzo desde Matlab? ¿O hay alguna otra forma de perfilar el código C++?

Respuesta

8

la única forma en que he podido hacer esto es separar la función que hace el trabajo y escribir un contenedor separado (en lugar de mexFunction) que carga archivos .mat con datos de prueba y se ejecuta como un ejecutable independiente. esto se puede perfilar usando, p. ej. gprof

+0

Gracias por el consejo. Es un buen enfoque. Mi único problema es que la entrada al mexFunction es un gran grupo de grandes estructuras de matlab. Necesito escribir código para crear todo esto en el contenedor para poder ejecutarlo, lo que me impide ir al mismo tiempo y sin pensarlo. – AnnaR

+1

no seguir. ¿no puedes crear todas tus estructuras dentro de matlab y guardarlas en un archivo .mat? (es decir, todo lo que antes era un argumento de entrada para su función mex ahora se guarda en un archivo .mat y se lee desde el nuevo contenedor desde el disco. – second

+0

Es posible perfilar sus archivos mex directamente usando valgrind. Compruebe [this] (http : //stackoverflow.com/questions/11220250/how-do-i-profile-a-mex-function-in-matlab/12405131#12405131) answer. – angainor

3

Hay una manera de ejecutar todo bajo un VC IDE. Al igual que podría decir "depurar DLL Foo.dll, utilizando Matlab como la aplicación de inicio".

Luego, si la barra de funciones que está utilizando en Foo.dll se ejecuta en < 1 segundo, asegúrese de que Matlab lo llame muchas veces, o agregue una función de contenedor en la DLL para llamarlo muchas veces.

Si puede llegar a ese punto, puede usar el manual call stack sampling technique, que realmente funciona a pesar de no ser popular o de requerir la instalación de una herramienta.

1

Dos posibles soluciones, además de las buenas ya sugeridas.

  1. Es posible escribir un script que carga los datos, se ejecuta la función mex, y luego se cierra. Luego puede permitir que el generador de perfiles llame al ejecutable de Matlab con ese script. Esto funcionó para mí con el generador de perfiles visual de nVidia cuando estaba perfilando mis funciones mex de CUDA.

  2. Si creó la función mex en Visual Studio, debería poder hacer una conexión al proceso de Matlab y luego ejecutar la función para la depuración o el perfilado.

Cuestiones relacionadas