MATLAB Distrib Computing
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
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.