Arquivo mensal: outubro 2014

Compilar MPICH2/MPI.NET Ubuntu

O MPI.NET é uma biblioteca que permite escrever aplicações MPI usando C#. É muito parecida com o MPI para C, mas tem algumas facilidades interessantes, principalmente se você deseja enviar objetivos através de primitivas de comunicação MPI. Nesse tutorial, vamos usar pacotes e código fonte que não fazem parte da instalação oficial do Ubuntu. Na verdade, sugiro que retire qualquer pacote mono ou mpich que tenha instalado no Ubuntu antes de começar. Eu testei na 12.04 LTS e na 14.04 LTS, os passos sãos os mesmos. Vamos instalar tudo no /opt.

1) Instalar o MONO

Seguir as instruções no site abaixo:
http://software.opensuse.org/download/package?project=home:tpokorra:mono&package=monodevelop-opt
Depois executar:
# ln -s /opt/mono/bin/ilasm /opt/mono/bin/ilasm2
# source /opt/mono/env.sh
# ln -s /opt/mono/env.sh /etc/profile.d/mono.sh

2) Instalar o MPICH

Na pasta do código fonte do MPI (usei o mpich2-1.3)
# mkdir /opt/mpich2-1.3
# ./configure –prefix=/opt/mpich2-1.3 –enable-shared –enable-lib-depend
# make
# make install
Colocar o seguinte em /etc/profile.d/mpich.sh:
export PATH=/opt/mpich2-1.3/bin:$PATH
export LD_LIBRARY_PATH=/opt/mpich2-1.3/lib:$LD_LIBRARY_PATH
export LD_RUN_PATH=/opt/mpich2-1.3/bin:$LD_RUN_PATH
export MANPATH=/opt/mpich2-1.3/share/man:$MANPATH
Depois:
# source /etc/profile.d/mpich.sh

3) Instalar o MPI.NET

Na pasta do código do fonte do MPI.NET
# mkdir /opt/mpi.net
# git clone https://github.com/jmp75/MPI.NET.git mpi.net
# cd mpi.net
# LOCAL_DIR=/opt/mpi.net
# sh autogen.sh
# ./configure –prefix=/opt/mpi.net
# make
# make install
# gacutil -i /opt/mpi.net/lib/MPI.dll
# gacutil -i /opt/mpi.net/lib/MPIUtils.dll

4) Compilar código de exemplo

Salve o conteúdo abaixo em um arquivo chamado Hello.cs.

using System;
using System.Collections.Generic;
using MPI;

class Hello{
    static void Main(string[] args){
		IDictionary<int, MPI.Intracommunicator> colors = new Dictionary<int, MPI.Intracommunicator>();

		MPI.Environment mpi = new MPI.Environment(ref args);
		MPI.Intracommunicator worldComm = Communicator.world;
		int min = 8; int max=min; int rank = min;

		rank = worldComm.Rank;
		min = worldComm.Allreduce<int>(rank+1, MPI.Operation<int>.Min);
		max = worldComm.Reduce<int>(rank+1, MPI.Operation<int>.Max, 1);

		colors[rank] = (MPI.Intracommunicator)worldComm.Split(rank+100, rank);

		int rec = 8;
		if (rank == 0) {
			MPI.Request req = worldComm.ImmediateSend<int> (50, rank, 0);
			rec = worldComm.Receive<int> (rank, 0);
			req.Wait();
		}
		Console.WriteLine("Node {0} of {1} - min={2} - max={3} - rec={4}\n", rank, worldComm.Size, min,  max, rec);
		mpi.Dispose();
   }
}

$ export LD_LIBRARY_PATH=/opt/mpi.net/lib
$ gmcs -r:/opt/mpi.net/lib/MPI.dll Hello.cs
$ mpirun -np 2 mono ./Hello.exe

Se executar sem mensagens de erro, então sua configuração está OK!!!

Anúncios