# MPICH

MPICH és una implementació altament eficaç i portable de l'estàndard MPI (MPI-1, MPI-2, MPI-3). L'objectiu principal de MPICH és proveir una implementació MPI que doni suport eficaçment a les diferents plataformes de comunicació i computació incloent diferents clúster (arquitectures multicore, sistemes de memòria compartida, etc.), xarxes d'alta velocitat (10 Gib Ethernet, InfiniBand, Myrinet, Quadrics), i sistemes informàtics patentats d'alta gama (Blue Gene, Cray) [1]. Un altre objectiu de MPICH es permetre la investigació de vanguardia en MPI a través d'un marc modular fàcil d'estendre per altres implementacions derivades. És una implementació de codi obert i llicencia gratuïta, i ha estat probada en moltes plataformes com Linux (en IA32 i x86-64), MAC OS/X (PowerPC i Intel), Solaris (32 i 64 bits) i Windows.

## Història

Les primeres versions de MPICH, conegudes com a MPICH-1, van ser desenvolupades conjuntament pel Laboratori Nacional d'Argonne i la Universitat Estatal de Mississippi com un software de domini públic. La part CH del nom ve donada per “Chamaleon”, una biblioteca portàtil de programació paral·lela produïda per William Gropp, un dels fundadors de MPICH.
MPICH va ser originalment creat al 1992 per donar resposta (a través del fòrum) als problemes d'implementació i utilitat que els sorgeixen als usuaris del nou estàndard de MPI. Aquesta implementació es basava en la portabilitat del sistema “Chamaleon” que proporcionava una capa d'implementació més lleugera. Al voltant del 2001, es va començar a produir una nova implementació anomenada MPICH2. MPICH2 va introduir noves característiques de l'estàndard MPI-2 que es va implementar en el MPICH original. La versió final de MPICH original és 1.2.7 pl. Els números de la versió de MPICH2 es van reiniciar en 0.9 i continuen en 1.5, començant amb la sortida al mercat en el novembre de 2012, el projecte canvia de nom a MPICH amb un numero de versió 3.0.
MPICH és una de les implementacions més populars de MPI. S'utilitza com a base per a la gran majoria de les implementacions MPI, incloent IBM MPI (per a Blue Gene), Intel MPI, Cray MPI, Microsoft MPI, Myricom MPI, OSU MVAPICH / MVAPICH2 i moltes altres.

## Canals

Hi ha diversos canals basats en la infraestructura ch3 [1]:
* Nemesis - Universal, té mòduls entre nodes: elan, GM, IB (infiniband), MX (myrinet express), NewMadeleine, tcp; i diverses variants intra-node de memòria compartida per a missatges grans (interfície LMT).
* ssm - Sockets i memòria compartida
* shm - Memòria compartida
* sock - sockets tcp / ip
* sctp: canal experimental sobre sockets SCTP

## Derivats de MPICH

* IBM (MPI per a la sèrie Blue Gene i, com a opció, per a clústers de sèries x i p)
* Cray (MPI per a totes les plataformes Cray)
* SiCortex (MPI SiCortex)
* Microsoft (MS-MPI)
* Intel (Intel MPI)
* Qlogic (MPICH2-PSM)
* Myricom (MPICH2-MX)
* Universitat Estatal d'Ohio (MVAPICH i MVAPICH2)
* Universitat de Colúmbia Britànica (MPICH2 / SCTP, i MPI de grau fi (FG-MPI) que afegeix suport per a les coroutines)

## Funcionament
### Com utilitzar MPICH?

En computació d'altes prestacions (HPC) es poden definir les variables d'entorn i el path necessaris carregant el mòdul corresponent al processador i la versió de MPICH que s'utilitzi [4]:
HPC2015 system :
| Versió MPI | Versió MPI | Compilador | Compilador | Comanda del mòdul |
| MPICH | 3.1.3 | Compilador PGI | 15.7 | module load mpich/pgi/3.1.3 |
| MPICH | 3.1.4 | Compilador Intel | Compilador Intel | module load intel mpich/intel/3.1.4 |
| MPICH | 3.1.4 | Compilador GNU (GCC) | Compilador GNU (GCC) | module load mpich/gcc/3.1.4 |
| MPICH | 3.2.0 | Compilador PGI | 17.7 | module load mpich/pgi/3.2.0 |
| MPICH | 3.2.1 | Compilador PGI | 18.5 | module load mpich/pgi/3.2.1 |
Per saber quin compilador s'està fent servir, es pot utilitzar la següent comanda en la consola:
mpicc -v o mpicc -V

### Com executar un programa amb MPICH ?

A) Execució interactiva (recomanada per fer tests sobre treballs curts):
mpirun -np 20 ./exemple.exec
B) Executar un programa MPICH amb un script PSB. És un petit fitxer de text que conté informació sobre quins recursos requereix un treball, incloent-hi temps, nombre de nodes i memòria. L'script PBS també conté les ordres necessàries per començar a executar la computació desitjada.
Exemple de la execució d'un batch amb un PBS script [3]:
#!/bin/sh
#PBS –N test_mpi
#PBS -q parallel
#PBS -l walltime=00:10:00
#PBS -l nodes=1:ppn=8
#PBS -j oe
cd $PBS_O_WORKDIR
NPROCS=`wc -l < $PBS_NODEFILE`
NNODES=`uniq $PBS_NODEFILE | wc -l`
NCORES=$((NPROCS / NNODES))
MACHFILE=/tmp/node.job.${PBS_JOBID}
cat $PBS_NODEFILE | uniq |awk -v nc=$NCORES '{print $1":"nc}' > $MACHFILE
mpirun -machinefile ${MACHFILE} -np ${NPROCS} ./program.exe
rm -f ${MACHFILE}

## Referències

* [1] Wikipedia MPICH (Anglès)
* [2] Frequently Asked Questions: Wiki-mpich (Anglès)

## Enllaços externs

* MPICH (Anglès)
* High Performance Computing in MIPCH Arxivat 2018-11-06 a Wayback Machine. (Anglès)