MATLAB Distrib Computing

De NLHPC
La versión para imprimir ya no se admite y puede contener errores de representación. Actualiza los marcadores del navegador y utiliza en su lugar la función de impresión predeterminada del navegador.

Beneficios

Al usar este Toolbox permite ejecutar una tarea en múltiples CPU en un mismo nodo, con un máximo de 20 o 44 (dependiendo del nodo), la ventaja es que se mejora el rendimiento de una aplicación cuando se lanza en modo paralelo.

Comparación de parfor v/s for

Usaremos el siguiente código de ejemplo que utiliza la función for v/s parfor, lanzaremos distintas tareas con diferentes parámetros para luego hacer una tabla comparativa de los resultados de los tiempos.

for

Código MATLAB para for:

N = str2num(getenv('MATLAB_N'));
M = 1000;

a = zeros(N,1);
tic;
for i = 1:N
    a(i) = max(abs(eig(rand(M)))); 
end

fprintf('\n\n for (N=%d): %f secs\n\n', N, toc);

Script para lanzar la tarea:

#!/bin/bash
#SBATCH --job-name=for_test
#SBATCH --mail-user=usuario@correo.cl
#SBATCH --mail-type=ALL
#SBATCH --output=%j_%x.out
#SBATCH --error=%j_%x.err
#SBATCH --partition=slims
#SBATCH -n 20 
#SBATCH -L matlab # indico licencias a usar
#SBATCH --mem-per-cpu=2300

module load MATLAB/2017a

export MATLAB_N=$1
 
matlab -nodisplay -nosplash -nodesktop < for.m

parfor

Código MATLAB para parfor:

pc = parcluster();
pc.JobStorageLocation = strcat('/tmp/', getenv('SLURM_JOB_ID'), '/lcj/');
parpool(pc, str2num(getenv('SLURM_CPUS_ON_NODE')));

N = str2num(getenv('MATLAB_N'));
M = 1000;

a = zeros(N,1);
tic;
parfor i = 1:N
    a(i) = max(abs(eig(rand(M)))); 
end

fprintf('\n\n parfor (N=%d): %f secs\n\n', N, toc);

Script para lanzar la tarea:

#!/bin/bash
#SBATCH --job-name=parfor_test
#SBATCH --mail-user=usuario@correo.cl
#SBATCH --mail-type=ALL
#SBATCH --output=%j_%x.out
#SBATCH --error=%j_%x.err
#SBATCH --partition=slims 
#SBATCH -n 20
#SBATCH -L matlab,matlab-distrib_computing # indico licencias a usar
#SBATCH --mem-per-cpu=2300

module load MATLAB/2017a

mkdir -p /tmp/${SLURM_JOB_ID}/{lcj,mcr}
export MCR_CACHE_ROOT=/tmp/${SLURM_JOB_ID}/mcr

export MATLAB_N=$1

matlab -nodisplay -nosplash -nodesktop < parfor.m

para encolar las diferentes tareas

for i in 400 600 800 1000 1200
     do sbatch script.sh $i
done

Tabla Comparativa

 

<thead> </thead> <tbody> </tbody>
N parfor for
400 37 374
600 42 557
800 54 711
1000  66 900
1200 88  1479

    

 

 


Los valores del tiempo de ejecución están expresados en segundos, para medir se ocupo la función tic/toc. En el caso de un vector de 400 elementos, con el uso de parfor presenta una mejora del 90% en tiempo respecto al uso de for.

Referencias