<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nordri&#039;s Blog &#187; openmpi</title>
	<atom:link href="http://www.muspells.net/blog/tag/openmpi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muspells.net/blog</link>
	<description>Estamos trabajando en ello...</description>
	<lastBuildDate>Wed, 04 Jan 2012 16:01:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Compilación Paralela</title>
		<link>http://www.muspells.net/blog/2010/03/compilacion-paralela/</link>
		<comments>http://www.muspells.net/blog/2010/03/compilacion-paralela/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 20:25:15 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[compilacion]]></category>
		<category><![CDATA[mpi]]></category>
		<category><![CDATA[openmpi]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=435</guid>
		<description><![CDATA[He empezado a aprender como hacer compilación paralela para obtener más rendimiento en el clúster. Para ello me he metido con OpenMPI que es un proyecto abierto derivado de la estructura LAM/MPI mantenido por la comunidad. El primer paso es obtener el software de esta dirección y compilarlo: $ tar jxvf openmpi-1.4.1.tar.bz2 $ ./configure --prefix=/usr/local/openmpi [...]]]></description>
			<content:encoded><![CDATA[<p>He empezado a aprender como hacer compilación paralela para obtener más rendimiento en el clúster. Para ello me he metido con <a href="http://www.open-mpi.org">OpenMPI</a> que es un proyecto abierto derivado de la estructura <a href="http://www.lam-mpi.org/">LAM/MPI</a> mantenido por la comunidad.</p>
<p>El primer paso es obtener el software de esta <a href="http://www.open-mpi.org/software/ompi/v1.4/downloads/openmpi-1.4.1.tar.bz2">dirección</a> y compilarlo:</p>
<pre>$ tar jxvf openmpi-1.4.1.tar.bz2
$ ./configure --prefix=/usr/local/openmpi
# make all install</pre>
<p>Una vez compilado, debemos actualizar el enlazador dinámico para que nuestro software enlace correctamente con las librerías dinámicas de OpenMPI</p>
<pre># ldconfig /usr/local/openmpi/lib</pre>
<p>Con esto, le decimos al programa <em>ld</em> que busque en<em> /usr/local/openmpi/lib</em> las librerias que haces falta en tiempo de ejecución de nuestro programa.</p>
<p>A continuación, es obligatorio que todos los nodos del clúster tengan acceso a los ejecutables tanto de nuestro programa como de OpenMPI, por lo que vamos ha crear un par de comparticiones por NFS.</p>
<pre>/usr/local/openmpi   192.168.0.0/24(ro,root_squash)
/home/openmpi   192.168.0.0/24(rw,root_squash)</pre>
<p>Donde <em>/home/openmpi</em> es nuestro usuario de cluster, en su directorio <em>$HOME</em> estará el programa a ejecutar. Y la otra compartición contiene los ejecutables del compilador.</p>
<p>Vamos a lanzar el programa clásico <strong>HelloWorld</strong> en paralelo, para ello utilizamos el siguiente código.</p>
<pre>/* helloworld.c */
/* http://www.semicomplete.com/presentations/mpi/#slide_2 */
#include &lt;stdio.h&gt;
/* Esto es para añadir las funciones de OpenMPI */
#include "mpi.h"

int main(int argc, char **argv) {
int rank;
char host[150];
int namelen;

/* Inicializar MPI. Maneja la línea de comando especifica de mpich */
MPI_Init(&amp;argc, &amp;argv);

/* Devuelve el rango. Mi número de rango (de la instancia del programa) queda almacenado en la variable rank */
MPI_Comm_rank(MPI_COMM_WORLD, &amp;rank);

/* Vemos en qué maquina me ejecutando y lo guardamos en host */
MPI_Get_processor_name(host,&amp;namelen);

printf("Hello world (Rank: %d / Host: %s)\n", rank, host);
fflush(stdout);

/* Fin: Cerramos las conexiones con los demás nodos y liberamos la memora que el programa ha reservado,... */
MPI_Finalize();
return 0;</pre>
<p>Lo compilamos</p>
<pre>$ PATH=$PATH:/usr/local/openmpi/bin
$ mpicc helloworld.c -o helloworld</pre>
<p>El <em>PATH</em> podemos añadirlo a nuestro <em>~/.bashrc</em> para que esté siempre disponible. Ejecutamos.</p>
<pre>$ mpirun -np 5 --hostfile=hosts helloworld</pre>
<p>Donde</p>
<ol>
<li><strong>-np</strong> Es el número de procesos que vamos a lanzar.</li>
<li><strong>&#8211;hostfile</strong> Es el fichero que almacena los nombres de los hosts, cada nodo del cluster.</li>
</ol>
<p>La salida debe ser algo como esto</p>
<pre>Hello world (Rank: 0 / Host: master)
Hello world (Rank: 2 / Host: master)
Hello world (Rank: 4 / Host: master)
Hello world (Rank: 1 / Host: cluster01)
Hello world (Rank: 3 / Host: cluster01)</pre>
<p>Vemos que ha lanzado tres procesos en master y dos en cluster01.</p>
<p>De momento esto es lo poco que sé, pero sigo avanzando, el asunto de tener que resolver matrices de gran tamaño voy a necesitar escribir código para lanzar paralelizado.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F03%2Fcompilacion-paralela%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Compilación Paralela. via @nordri" data-url="http://www.muspells.net/blog/2010/03/compilacion-paralela/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/03/compilacion-paralela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

