# OpenMPI

Open MPI és un projecte de biblioteca de la interfície de pas de missatges (MPI) que combina tecnologies i recursos de diversos altres projectes (FT-MPI, LA-MPI, LAM/MPI i PACX-MPI). L'utilitzen molts superordinadors TOP500, inclòs Roadrunner, que va ser el superordinador més ràpid del món des de juny de 2008 fins a novembre de 2009, i l'ordinador K, el superordinador més ràpid des de juny de 2011 fins a juny de 2012.

## Història

L'OpenMPI és programari de codi lliure, que es basa en el pas de missatges de MPI. El projecte es va originar el 2003, quan un grup de desenvolupadors de programari de grups com FT-MPI, LA-MPI, LAM/MPI van decidir iniciar una implementació de programari lliure sobre MPI, com que fins al moment hi havia molta diversitat i confusió sobre les versions existents. El codi i el disseny va començar el 2004, i no va ser fins al 17 de novembre del 2005 que va sortir la seva primera versió 1.0.
A mesura que es van anar desenvolupant noves versions, diversos grups de recerca es van unir al projecte, i avui en dia hi ha 14 membres i 6 contribuïdors, sent les universitats i grups per supercomputadors els qui més van apostar per aquesta implementació. Els membres originals són: High Performance Computing Center, Stuttgart, Indiana University, Los Alamos National Laboratory i The University of Tennessee.

## Objectius i característiques

El programari OpenMPI te com a objectius prioritaris ser de codi obert i lliure, i obtenir un rendiment òptim i eficient per tal d'aprofitar la potència dels grans computadors. Com a característiques té:
* Suport de comunitats de tercers en el desenvolupament
* Soluciona problemes de "forking" existents en altres implementacions.
* Dissenyat per a diferents entorns i plataformes.
* Suport complet de l'estàndard MPI-2.
* Detecció automàtica d'errors.
* Versió portable i adaptable a diferents sistemes de maquinari.

## Arquitectura

Està composta per tres capes abstractes:
* Open, Portable Access Layer (OPAL) : Es la capa abstracta més baixa, que conté processos individuals.Serveix com enllaç al sistema operatiu, i te funcionalitats com compartir memòria entre processos en el mateix servidor, descobrir interfícies IP, o el control de depuració.
* Open MPI Run-Time Environment (ORTE) : Proporciona un sistema per iniciar i controlar les diferents tasques paral·leles a executar. Gestiona tots els processos que hi arriben, i s'encarrega de decidir la manera de repartir els recursos segons els processos que ho requereixen.
* Open MPI (OMPI) : Capa abstracta més alta i la que interactua directament amb les aplicacions MPI. Per tant, tot el conjunt de la API de MPI s'implementa aqui, ja que s'utilitzen les funcions per al pas de missatges que requereixen les aplicacions. Admet una gran quantitat de protocols i tipus de xarxes, ja que la seva principal virtut és la portabilitat i ser compatible amb un gran nombre d'aplicacions.

## Funcionament
### Compilació i instal·lació

Actualment, OpenMPI te suport total amb els compiladors de Intel 18.0.3 i Gnu 4.8.5, que són els estàndards actuals per programar, per tant sent així compatible amb la majoria d'aplicacions.
Per poder utilitzar les seves funciones, primer hem de carregar els mòduls al ordinador, si volem utilitzar l'entorn de compilació GCC:
On indiquem quina versió volem instal·lar, segons sigui la 2.0.0, 3.0.0 respectivament.
Una vegada instal·lats els mòduls, haurem d'executar la nostra aplicació:
S'ha d'indicar per quin llenguatge de programació es vol executar l'aplicació:
* cc : Programes en C.
* c++: Programes en C++.
* f77: Programes en Fortran 77.
* f90: Programes en Fortran 90.
* fort: Programes amb Fortran per versions d'OpenMPI v1.7 o més.

### Exemples d'ús

A continuació es donaran un conjunt d'exemples de funcionament de la llibreria OpenMPI en els diferents llenguatges de programació on hi ha una implementació de la llibreria. En el moment d'escriptura, està disponible als llenguatges C, C++ i Fortran. Alguns d'aquests exemples han estat extrets del repositori oficial. En el cas C++ no farem servir cap exemple, ja que són quasi idèntics a C.
OpenMPI disposa d'un conjunt de funcions bàsiques que son necessàries per habilitar la comunicació i compartició de dades entre ordinadors o processadors. Per tal d'iniciar i finalitzar les comunicacions farem ús de MPI_Init i MPI_Finalize respectivament.

### C

Un exemple de programa escrit en C, que anomenarem t1.c que fa ús d'OpenMPI en la versió 3 seria el següent:
Per compilar aquest programa haurem d'executar la següent comanda:
Si volguéssim compilar en C++, només hem de canviar el compilador, quedant de la següent forma:
On mpicc o mpic++ indica que estem fent ús del compilador d'OpenMPI, test1 és el nom de l'executable que generarem, t1.c és el codi font a compilar en aquest cas i amb -lmpi enllacem amb la llibreria de MPI.
Per executar el programa haurem de fer ús d'una comanda de MPI:
Tot indicant el nombre de processos que volem fer servir en el programa després de -np, en aquest cas quatre processos. Amb la comanda anterior la sortida del programa sería:
Per tal de facilitar la comunicació i coordinació en la execució de programes que facin ús de la llibreria OpenMPI, es pot indicar que la llibreria assigni un rang a cada procés, numerats de 0 a N, on N és el nombre de processos o nodes dels que es faci ús. Es farà la assignació mitjançant la funció MPI_Comm_rank i es podrà saber el nombre de processos en ús amb la funció MPI_Comm_size. A sota es pot veure un exemple senzill en el qual es mostra el funcionament d'un programa amb assignació de rangs als processos:
La sortida per pantalla derivada de l'execució del programa anterior és la següent:

### Fortran

Un exemple d'escrit en Fortran, que anomenarem test_fortran.f sería el següent:
Això ho compilarem de forma molt similar a les anteriors, canviant el compilador:
Un cop compilat, podrem executar-ho fent ús de la següent comanda, un altre cop, igual a l'anterior:
Que ens donarà aquesta sortida per pantalla:

## Referències

* ↑ Jeff Squyres. «Open MPI: 10^15 Flops Can't Be Wrong». Open MPI Project. [Consulta: 27 setembre 2011].
* ↑ «Programming on K computer». Fujitsu. [Consulta: 17 gener 2012].
* ↑ «Open MPI powers 8 petaflops». Cisco Systems. Arxivat de l'original el 2011-06-28. [Consulta: 27 setembre 2011].
* ↑ «Open MPI: Version Timeline». [Consulta: 16 abril 2020].
* ↑ «Historia» (en anglès), 16-04-2020. [Consulta: 16 abril 2020].
* ↑ «FAQ: General information about the Open MPI Project». [Consulta: 16 abril 2020].
* ↑ «The Architecture of Open Source Applications (Volume 2): Open MPI». [Consulta: 16 abril 2020].
* ↑ «FAQ: Compiling MPI applications». [Consulta: 16 abril 2020].
* ↑ «Exemples OpenMPI en diferents llenguatges de programació.» (en anglès). GitHub, 16-04-2020. [Consulta: 16 abril 2020].
* ↑ «MPI_Init(3) man page (version 3.1.6)». [Consulta: 15 abril 2020].
* ↑ «MPI_Finalize(3) man page (version 3.0.6)». [Consulta: 15 abril 2020].
* ↑ «MPI_Comm_rank(3) man page (version 3.1.6)». [Consulta: 15 abril 2020].
* ↑ «MPI_Comm_size(3) man page (version 3.1.6)». [Consulta: 15 abril 2020].

## Enllaços externs

* Open MPI Project Homepage
* Interactive European Grid
* FAQS
* Arquitectura