Diferencia entre revisiones de «MATLAB Distrib Computing»
(No se muestran 3 ediciones intermedias del mismo usuario) | |||
Línea 95: | Línea 95: | ||
<p> </p> | <p> </p> | ||
<table align="center" border="1" cellpadding="1" cellspacing="1" style="height: | <table align="center" border="1" cellpadding="1" cellspacing="1" style="height:200px; width:400px"> | ||
<tr> | <tr> | ||
<th scope="col">N</th> | <th scope="col">N</th> | ||
Línea 127: | Línea 127: | ||
</tr> | </tr> | ||
</table> | </table> | ||
Los valores del tiempo de ejecución están expresados en segundos, para medir se ocupo la función [https://mathworks.com/help/matlab/ref/tic.html tic]/[https://mathworks.com/help/matlab/ref/toc.html 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. | Los valores del tiempo de ejecución están expresados en segundos, para medir se ocupo la función [https://mathworks.com/help/matlab/ref/tic.html tic]/[https://mathworks.com/help/matlab/ref/toc.html 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. |
Revisión actual - 21:22 7 sep 2022
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.