3.6. Jobs paralelos

Una de las ventajas de un cluster es que permite correr programas paralelos. Actualmente, los programas paralelos se desarrollan principalmente con las dos librerías siguientes (para los CPU):

  1. Message Passing Interface (MPI)

  2. OpenMP (Dentro de un mismo nodo)

Debido a la especificidad en el uso de cada de las librerías, se define 2 ambientes paralelos dentro de SGE, para agilizar su uso.

3.6.1. MPI

MPI es un estándar, y se basa en la noción de canales de mensajes entre los diferentes cpus involucrados. Los canales de comunicación son prioritariamente la red IB, luego la red Ethernet, y también canales internos al los CPUs modernos (intra-node). Cada cpu ejecuta el mismo código, y es la lógica del código que lo permite diferenciarse de los demás con su numero de threads. Existe librerías para el lenguaje C, C++, Fortran entre otros.

Existen diferentes implementaciones de MPI. En el cluster esta instalado por defaut la implementación OpenMPI [1]. Los programas instalados en el cluster que utilizan MPI son compilados para esta implementación, al menos que los documentos en el cluster indican lo contrario.

Para poder utilizar los programas en MPI, se debe de usar un ambiente paralelo especifico en SGE. Este ambiente se encargara de iniciar los procesos y los canales para su comodidad. En este caso de MPI, se usara el ambiente mpi, gracias al uso de la opción -pe, escogiendo una de las dos maneras siguientes:

Se proporciona al job una variable de ambiante, llamada NSLOTS que contiene el numero de cpus reservados. Esta variable deberá utilizarse para indicar a los programas del script cuantos cpus disponen.

Aquí se presenta un script básico para correr este tipo de programas. Nota por favor la utilización de la variable NSLOTS:

	  
#!/bin/bash

#$ -N MpiJob

# 4 cores.
#$ -pe mpi 4

source /share/apps/Profiles/share-profile.sh

# Se usa mpirun para correr un programa MPI:
mpirun -np $NSLOTS program-mpi
	     
	     

3.6.2. OpenMP

OpenMP es una especificación que permite, dentro de programas en C (o otros lenguajes), definir partes de código que querremos que sea ejecutada en paralelo cuando se presenta la opción. Esta especificación se permite únicamente dentro de la misma maquina (nodo), y no es capaz de usar cualquier red.

Como con el caso de MPI, se define un ambiente paralelo especifico para poder correr programas con OpenMP. Lo que realiza en particular el ambiente paralelo thread, es revisar que los cores pedidos por el job sean TODOS en el mismo nodo.

Warning

Con las características actuales del cluster, no se podrá pedir correr programas con OpenMP con mas de 64 cores. El scheduler les rechazara la petición, indicándole que lo que pide no existe.

Se proporciona al job una variable de ambiante, llamada NSLOTS que contiene el numero de cpus reservados. Esta variable deberá utilizarse para indicar a los programas del script cuantos cpus disponen.

Blast instalado en el cluster permite el uso de mas de un threads. El script siguiente muestra como correr un blast con 2 threads. Notan la utilización de la variable NSLOTS :

	  
#!/bin/bash

# Nombre del job
#$ -N  Blastn-NT

# En 2 threads.
#$ -pe thread 2	     

# Para obtener el PATH adecuado
source $HOME/.bashrc

module load programs/blast-2.9.0

# Ubicación de las bases de datos formateadas.
export BLASTDB=/scratch/BlastDB/

OutFile="results.txt"

blastn -db nt -query nuc.fasta -num_threads $NSLOTS -out $OutFile 
	     
	

Notes

[1]

http://www.openmpi.org