Diferencia entre revisiones de «MATLAB Distrib Computing»

De NLHPC
(Página creada con «asd»)
 
 
(No se muestran 8 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
asd
== 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>&nbsp;</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">&nbsp;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">&nbsp;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.

Referencias