Matlab con Multi cores – Matlab y varios procesadores a la vez

Matlab es como una navaja multiusos, como tu universidad o trabajo tenga licencia de Matlab, lo vas a usar para todo, todo y todo.  El problema es que fuera de los calculos con matrices donde Matlab es extremadamente eficiente, es una pura patata. Un for en Matlab es un suicidio. (Algo así como desmontar un televisor  con el destornillador de la navaja 😉

Por ejemplo, estos días he portado un código de C a Matlab  ya que con los cambios que iba a introducir me resultaba más cómodo trabajar con Matlab para mi proyecto,  pues bien, la primera vez que lanzo el programa que hace poco más que recorrer un archivo muy grande (400 megas)  y algunas operaciones buscando comandos RFID, TARDABA 10 HORAS!! En C llevaba varios segundos.

Finalmente con un poco de optimización ha pasado a 640 segundos!.

Además de usar el profiler del matlab para ver que partes del código son más lentas he descubierto por fin la forma de usar más del 50% de CPU en Matlab, o dicho de otra forma usar todos los microprocesadores de mi ordenador para correr Matlab:

  • Matlab multicore

Por defecto matlab sólo usa uno de tus procesadores, así por ejemplo si tienes un core 2 duo y Windows verás que por muy pesado que sea tu programa Matlab sólo marca 50%. En mac verás que pone 100%  pero debería poner 200% si estuviera usando todos los cores.

Buscar por Google  como usar varios procesadores en Matlab no es tarea sencilla (al menos para mi) finalmente la respuesta la encontre en una respuesta del staff de Mathworks: matlabpool. Así pues  con matlabpool(2)  estamos diciendole a Matlab usa 2 cores. En mi caso le dije matlabpool(4) por ser un quadcore

Ejemplo:

>> tic, parfor(i = 1 : 30000), filter(rand(1,10),rand(1,10),rand(1,500)); end; toc;
Elapsed time is 1.948884 seconds.

tic y toc son para medir tiempo transcurrido y el resto es simplemente una manera de entretener a Matlab. Bueno pues con la configuración por defecto: 1.95 segundos.

Vamos a sacarle partido a los cuatro cores con matlabpool(4)

>> matlabpool(4)
Starting matlabpool using the ‘local’ configuration … connected to 4 labs.

>> tic, parfor(i = 1 : 30000), filter(rand(1,10),rand(1,10),rand(1,500)); end; toc;
Elapsed time is 0.464624 seconds.

Usando los cuatro cores en Matlab 0.46 segundos 🙂

Ten en cuenta que dos cores no significa duplicar la velocidad, dependerá de como está hecho el código.  Es decir,  si por ejemplo tenemos 4 cores, no veremos un 400%  de cpu, ya que el uso de varios cores de forma simultánea requiere que nuestro código pueda ejecutarse en paralelo y no siempre es posible.

Tiempo de mi aplicación -> 7 horas ( 30% más rápido)

Aunque la mayor optimización la logré haciendo uso de Matlab profiler para mejorar el código.

Via: Perdí el link donde se explicaba un poco este tema, pero era en mathworks en un comentario.