Diferencia entre revisiones de «MATLAB Distrib Computing»
(Página creada con «asd») |
Sin resumen de edición |
||
Línea 1: | Línea 1: | ||
== 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 [https://mathworks.com/help/matlab/ref/for.html for] v/s [https://mathworks.com/help/distcomp/parfor.html 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: | |||
<pre> | |||
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); | |||
</pre> | |||
Script para lanzar la tarea: | |||
<pre> | |||
#!/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 | |||
</pre> | |||
'''parfor''' | |||
Código MATLAB para parfor: | |||
<pre> | |||
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); | |||
</pre> | |||
Script para lanzar la tarea: | |||
<pre> | |||
#!/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 | |||
</pre> | |||
para encolar las diferentes tareas | |||
<pre> | |||
for i in 400 600 800 1000 1200 | |||
do sbatch script.sh $i | |||
done | |||
</pre> | |||
== 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. | |||
== Referencias == | |||
* Parallel Computing Toolbox | |||
* Decide When to Use parfor |
Revisión del 21:13 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.
Referencias
- Parallel Computing Toolbox
- Decide When to Use parfor