2011-07-20 17 views
6

Estoy trabajando en un proyecto en Matlab donde tenemos que optimizar el rendimiento, y estaba pensando en paralelizar un par de llamadas a funciones que se hicieron desde un archivo .m.Multithreading con Matlab

La idea era simple, desde un archivo de Matlab (.m) llamar a un archivo compilado en C como MEX, ya partir de ese archivo C, cree un par de hilos y vuelva a llamar las funciones Matlab de cada hilo.

funciona La teoría, puedo crear los hilos, y también puedo llamar a la función de Matlab, el problema es que no puedo llamar a la función Matlab de la rosca:

//Global variables 
mxArray **g_plhs; 
mxArray **g_prhs; 
int g_nlhs; 
int g_nrhs; 

//Thread function 
DWORD WINAPI my_function(LPVOID lpParam) 
{ 
    mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,"matlab_function"); 
    return 0; 
} 


//Main function 
void mexFunction(int nlhs, mxArray *plhs[], 
    int nrhs, const mxArray *prhs[]) { 

    DWORD dwThreadIdArray[MAX_THREADS]; 
    HANDLE hThreadArray[MAX_THREADS]; 
    g_plhs = plhs; 
    g_prhs = prhs; 
    g_nlhs = nlhs; 
    g_nrhs = nrhs; 

    hThreadArray[0] = CreateThread( 
     NULL,     
     0,      
     my_function,    
     NULL,     
     0,      
     &dwThreadIdArray[0]); 

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); 

    for(i=0; i<MAX_THREADS; i++) 
    { 
     CloseHandle(hThreadArray[i]); 
    } 
} 

No tenemos ninguna restricción en esa opción cuando se trabaja con matlab? ¿Alguien ha intentado algo como esto?

Editar: ¿Hay alguna opción que no requiera Parallel Toolbox?

+0

¿Qué código de MATLAB está tratando de paralelizar? – You

+2

@rlbisbe: La API MEX no es segura para subprocesos: http://www.mathworks.com/support/solutions/en/data/1-V3B5T/index.html?solution = 1-V3B5T – Amro

Respuesta

6

Sólo se puede llamar a la mx * y funciones mex * desde el hilo principal de MATLAB. Puede escribir archivos MEX multiproceso siempre que estos hagan su trabajo en un nivel por debajo de la interfaz mx. Si quiere varios intérpretes de MATLAB, necesita múltiples procesos de MATLAB. Una forma es a través de Parallel Computing Toolbox como lo señala @You. Esto le da PARFOR bucles y SPMD bloques para ejecutar cosas simultáneamente.

+0

¿Y sin Parallel Computing Toolbox habría alguna opción? –

+1

@rlbisbe: aquí hay un ejemplo de código paralelizado que usa OpenMP (siempre que no llame a las funciones de la API de MEX desde subprocesos engendrados): http://www.walkingrandomly.com/?p=1795 (también revise los comentarios) para alternativas sugeridas al PCT) – Amro

3

Probablemente sea mejor que utilice las características incorporadas de multiprocesamiento de MATLAB, como parfor. De hecho, muchas funciones de MATLAB ya están multiproceso (incluidas las operaciones de matriz), por lo que no debe haber necesidad de paralelizar las cosas usted mismo aparte de reemplazar for con parfor. (En general, while bucles no pueden ser paralellized.)

+2

Parfor requiere la caja de herramientas paralela de Matlab, y no la tengo en mi licencia de Matlab –

1

Su mejor opción es parfor. si eres un estudiante, puedes obtener herramientas paralelas por poco dinero. incluso el precio total no es mucho si se toma en serio el rendimiento. Su código anterior será propenso a errores y difícil de probar. usar parfor es intuitivo y limpio.

+2

¿En qué se diferencia su respuesta de la respuesta de usted 5 horas antes? Por favor haz que tus respuestas sean sustanciales. Si todo lo que dice es que la caja de herramientas paralela es barata, lo mejor es escribirla como un comentario en la respuesta de Usted. – abcd

+0

jajaja, de hecho, no es muy diferente a la respuesta de usted o Edric. Gracias por señalar eso. –

1

Me sorprende que todos estén presionando por parfor. Lo aliento a que al menos piense si puede diseñar su algoritmo para ser llamado desde Matlab y ejecutar las secciones críticas de bajo nivel desde C/C++ multiproceso sin tener que volver a llamar a mex. Esto generalmente debería ser posible. Especialmente si usa Matlab profiler o una herramienta similar para descubrir qué pasos de su análisis son el cuello de botella, entonces puede escribir solo 1 o 2 pasos en multiproceso C.

Otra forma de hacerlo sería escribir su paralelismo en Java, que es más fácil de trabajar desde Matlab.

Otras opciones que le conviene ver incluyen multicore submission on Matlab Central o MatlabMPI library. Ambas son un poco complicadas y están diseñadas para el paralelismo entre procesos (hay que ejecutar varias instancias de Matlab), por lo que no son buenas para el paralelismo complicado y de grano fino. Pero para simplemente dividir un trabajo en 4 u 8 o 16 partes, deben hacer el trabajo, y al menos multicore tiene un apoyo razonable de la comunidad. Todavía no he probado MatlabMPI, pero parece prometedor. Como beneficio adicional, deberían funcionar en varias máquinas, aunque probablemente requerirán un sistema de archivos de red compartido.