Diferencia entre revisiones de «MATLAB Distrib Computing»
(Página creada con «asd») |
|||
(No se muestran 8 ediciones intermedias del mismo usuario) | |||
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 == | |||
<p> </p> | |||
<table align="center" border="1" cellpadding="1" cellspacing="1" style="height:200px; width:400px"> | |||
<tr> | |||
<th scope="col">N</th> | |||
<th scope="col">parfor</th> | |||
<th scope="col">for</th> | |||
</tr> | |||
<tr> | |||
<td style="text-align:center">400</td> | |||
<td style="text-align:center">37</td> | |||
<td style="text-align:center">374</td> | |||
</tr> | |||
<tr> | |||
<td style="text-align:center">600</td> | |||
<td style="text-align:center">42</td> | |||
<td style="text-align:center">557</td> | |||
</tr> | |||
<tr> | |||
<td style="text-align:center">800</td> | |||
<td style="text-align:center">54</td> | |||
<td style="text-align:center">711</td> | |||
</tr> | |||
<tr> | |||
<td style="text-align:center">1000</td> | |||
<td style="text-align:center"> 66</td> | |||
<td style="text-align:center">900</td> | |||
</tr> | |||
<tr> | |||
<td style="text-align:center">1200</td> | |||
<td style="text-align:center">88</td> | |||
<td style="text-align:center"> 1479</td> | |||
</tr> | |||
</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. | |||
== Referencias == | |||
* [https://mathworks.com/products/parallel-computing.html Parallel Computing Toolbox] | |||
* [https://mathworks.com/help/distcomp/decide-when-to-use-parfor.html Decide When to Use parfor] |
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.