OpenMPI
Aquest article podria incomplir els criteris generals d'admissibilitat. |
No s'ha de confondre amb OpenMP. |
Tipus | programari lliure i biblioteca informàtica |
---|---|
Versió inicial | |
Versió estable | |
Llicència | llicència BSD de 3 clàusules |
Característiques tècniques | |
Sistema operatiu | multiplataforma |
Escrit en | C |
Més informació | |
Lloc web | open-mpi.org |
| |
OpenMPI és una Message Passing Interface (interfície de pas de missatges) de codi obert desenvolupada i mantinguda per un consorci de socis acadèmics, d'investigació i de la indústria per construir la millor biblioteca MPI disponible, amb una primera versió publicada el 2005. S'utilitza a molts supercomputadors (TOP500) per a executar programes de manera distribuïda i aconseguir un alt rendiment. Com per exemple el Taiwania 2, que utilitza la versió 3.1.0 d'OpenMPI.[1]
Història
[modifica]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.[2]
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.[3]
Objectius i característiques
[modifica]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é:[4]
- 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
[modifica]Està composta per tres capes abstractes:[5]
- 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
[modifica]Compilació i instal·lació
[modifica]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:
$ module load openmpi-gcc/2.0.0
$ module load openmpi-gcc/3.0.0
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ó:[6]
$ mpi[cc|c++|f77|f90|fort] <ficher_font> -o <nom_executable>
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
[modifica]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.[7] 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()[8] i MPI_Finalize()[9] respectivament.
C
[modifica]Un exemple de programa escrit en C, que anomenarem t1.c que fa ús d'OpenMPI en la versió 3 seria el següent:
#include <stdio.h>
#include <mpi.h>
void main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
printf("Hola món!");
MPI_Finalize();
}
Per compilar aquest programa haurem d'executar la següent comanda:
mpicc -o test1 t1.c -lmpi
Si volguéssim compilar en C++, només hem de canviar el compilador, quedant de la següent forma:
mpic++ -o test1 t1.c -lmpi
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:
mpirun -np 4 test1
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:
Hola món!
Hola món!
Hola món!
Hola món!
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()[10] i es podrà saber el nombre de processos en ús amb la funció MPI_Comm_size().[11] A sota es pot veure un exemple senzill en el qual es mostra el funcionament d'un programa amb assignació de rangs als processos:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char * argv[]) {
int rank, size;
MPI_Init(& argc, & argv); // Inicialització
MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Determina el rang del procés al comunicador
MPI_Comm_size(MPI_COMM_WORLD, &size); // Retorna la mida del grup associat al comunicador (quants processos hi ha?)
printf(“Hello world from process %d of %d\n", rank, size);
MPI_Finalize();
return 0;
}
La sortida per pantalla derivada de l'execució del programa anterior és la següent:
Hello world from process 2 of 4
Hello world from process 1 of 4
Hello world from process 3 of 4
Hello world from process 0 of 4
Fortran
[modifica]Un exemple d'escrit en Fortran, que anomenarem test_fortran.f sería el següent:
program main
implicit none
include 'mpif.h'
integer ierr, rank, size, len
character(len=MPI_MAX_LIBRARY_VERSION_STRING) version
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
call MPI_GET_LIBRARY_VERSION(version, len, ierr)
write(*, '("Hello, world, I am ", i2, " of ", i2)')
& rank, size
call MPI_FINALIZE(ierr)
end
Això ho compilarem de forma molt similar a les anteriors, canviant el compilador:
mpifort -o fort test_fortran.f -lmpi
Un cop compilat, podrem executar-ho fent ús de la següent comanda, un altre cop, igual a l'anterior:
mpirun -np 2 ./fort
Que ens donarà aquesta sortida per pantalla:
Hello, world, I am 0 of 2
Hello, world, I am 1 of 2
Referències
[modifica]- ↑ «Especificacions Taiwania 2» (en anglés). Top500, 01-04-2020. [Consulta: 1r abril 2020].
- ↑ «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].