2010-10-30 20 views
8

Estoy trabajando en un cálculo basado en series de tiempo. Cada iteración del cálculo es independiente. ¿Alguien podría compartir algunos consejos/imprimaciones en línea sobre el uso utilizando el procesamiento paralelo en Matlab? ¿Cómo se puede especificar esto dentro del código real?Cómo utilizar el procesamiento paralelo en Matlab

Respuesta

12

Como tiene acceso a la caja de herramientas Paralelo, le sugiero que compruebe primero si puede hacerlo de la manera más fácil.

Básicamente, en lugar de escribir

for i=1:lots 
    out(:,i)=do(something); 
end 

Usted escribe

parfor i=1:lots 
    out(:,i)=do(something); 
end 

A continuación, utiliza matlabpool para crear un número de trabajadores (se puede tener un máximo de 8 en su máquina local con el caja de herramientas, y toneladas en un clúster remoto si también tiene una licencia de Servidor de Computación Distribuida), y ejecuta el código, y ve bonitas ganancias de velocidad cuando sus iteraciones son ejecutadas por 8 núcleos en lugar de uno.

Aunque la ruta parfor es la más fácil, es posible que no funcione de inmediato, ya que puede hacer su indexación incorrecta, o puede estar haciendo referencia a una matriz de una manera problemática, etc. Consulte las advertencias de mlint en el editor, lea la documentación y confíe en el buen método de prueba y error, y debe resolverlo razonablemente rápido. Si tiene bucles anidados, a menudo es mejor alternar solo el más interno y asegurarse de que tenga toneladas de iteraciones: este no solo es un buen diseño, sino que también reduce la cantidad de código que podría ocasionarle problemas.

Tenga en cuenta que especialmente si ejecuta el código en una máquina local, puede encontrarse con problemas de memoria (que pueden manifestarse en una ejecución realmente lenta en modo paralelo porque está paginando): cada trabajador obtiene una copia del espacio de trabajo, así que si su cálculo implica la creación de una matriz de 500 MB, 8 trabajadores necesitarán un total de 4 GB de RAM, ¡y entonces ni siquiera ha comenzado a contar la RAM del proceso principal! Además, puede ser bueno utilizar únicamente núcleos N-1 en su máquina, de modo que aún quede un núcleo para otros procesos que puedan ejecutarse en la computadora (como un antivirus obligatorio ...).

+0

¿Por qué es mejor paralelizar solo el bucle más interno? He leído lo contrario de toda la literatura que he buscado .NET. En general, la paralelización del gran bucle externo implica la sobrecarga de la creación de hilos con menos frecuencia que la paralelización del bucle interno. –

+1

@Joel B: desea paralelizar un ciclo que realiza muchas iteraciones, ya que ejecutar un ciclo que tiene, por ejemplo, 500 iteraciones en un clúster de 1024 núcleos es un desperdicio. Por supuesto, el núcleo del bucle paralelizado debería tomar más tiempo que la sobrecarga de creación del hilo. Sin embargo, esto es casi siempre cierto en Matlab, ya que requiere muchos menos bucles, y por lo tanto, el cálculo dentro del bucle más interno es bastante pesado. – Jonas

+1

Pero, ¿qué pasa con solo una PC de cuatro núcleos? Probablemente hacer el ciclo externo tiene más sentido allí? ¿Sería justo decir que paralelizar el ciclo interno es mejor si tengo un gran grupo de computadoras a mi disposición, pero el bucle externo es mejor para paralelizar si solo tengo una sola PC de varios núcleos? –

5

Mathworks ofrece su propio parallel computing toolbox. Si no desea comprar eso, existen algunas opciones

  • Puede escribir su propio archivo mex y usar pthreads u OpenMP.
  • Sin embargo asegurarse de que no se llama a cualquier API Mex en la parte paralela del código, ya que enviaban seguro para subprocesos
  • Si desea más grueso paralelismo de grano a través de MPI se puede tratar pmatlab
  • mismo con parmatlab

Editar: Adición de enlace Parallel MATLAB with openmp mex files

solo he probado la primera.

+1

puede que también le interese saber que Parallel Computing Toolbox recientemente (R2010b) introdujo la computación GPU basada en CUDA (requiere una tarjeta nvidia que admita la capacidad informática 1.3): http://www.mathworks.com/discovery/matlab-gpu .html – Amro

2

No olvide que muchas funciones de Matlab ya están multiproceso. Con una programación cuidadosa, puede aprovecharlos: consulte la documentación de su versión ya que Mathworks parece estar aumentando el rango y el número de funciones multiproceso con cada versión nueva. Por ejemplo, parece que 2010a tiene varios hilos fft s que pueden ser útiles para el procesamiento de series de tiempo.

Si el multihilo intrínseco no es lo que necesita, entonces, como sugiere @srean, está disponible Parallel Computing Toolbox. Por mi dinero (o más bien, el dinero de mis empleadores) es el camino a seguir, lo que le permite programar en paralelo en Matlab, en lugar de tener que meterse en cosas. Debo admitir, también, que estoy bastante impresionado con la caja de herramientas y las instalaciones que ofrece.

+0

Tengo acceso a la Caja de herramientas de computación en paralelo de Matlab. ¿Puedes compartir buenos cebadores/ejemplos sobre su uso? – Eduardas

+2

@Edward: Asistí al curso de capacitación de 2 días de Mathworks en el PCT, leí la documentación y la resolví por mí mismo. Pero tengo experiencia en programación paralela con Fortran y MPI y OpenMP. Matlab Central tiene cantidades cada vez mayores de informática paralela con Matlab, que podría ser un buen lugar para comenzar. –

Cuestiones relacionadas