José Manuel García Salmerón
29 Octubre 2015
El único acceso permitido es a través de una conexión segura usando el puerto 22 (SSH, SFTP, etc…).
Para ejecutar sus trabajos deberá hacer uso del sistema gestor de recursos instalado. La ejecución de trabajos sin hacer uso del sistema gestor de recursos no está permitida, asi como la ejecución de tareas con cómputo intensivo en el nodo front end o de gestión.
El gestor de recursos que gestiona el envío de trabajos a los nodos de cómputo es SLURM.
En el directorio personal de cada usuario se encuentra un directorio una carpeta llamada scratch. El contenido de este directorio es compartido con los nodos de cómputo. En este directorio solo se deben copiar ejecutables y ficheros requeridos por estos de manera temporal. No trabajar directamente sobre este directorio, evitar copiar en el código fuente y otro tipo de archivos.
El software Intel® Parallel Studio se encuentra disponible en el nodo front end y en el nodo 17*, instalado en /usr/local/intel/ con las siguientes aplicaciones disponibles:
Intel® Advisor
Intel® Inspector
Intel® VTune™ Amplifier
* Contactar con el administrador para el uso de Intel® Parallel Studio en el Nodo 17.
Para conocer los recursos disponibles:
sinfo
Y para conocer el estado de los recursos:
squeue
Los recursos disponibles en bullxual son:
ibgpu y ibgpuk, para el uso de los nodos de cómputo con GPUs. (ver Sección Reserva de recursos GPU)
ibmulticore y ibmulticore2, para el uso de los nodos de cómputo sin GPU.
ibcl, para el uso de cómputo empleado OpenCL. (ver Sección OpenCL)
ibbullion, para el uso de la máquina Bullion S8. (ver Sección Bullion)
Código secuencial y multihebrado Para compilar un programa secuencial o multihebrado:
gcc
Código para GPU Para compilar un código para GPU usar el compilador:
nvcc
Código paralelo (librerías MPI) Hay dos opciones disponibles: OpenMPI y MVAPICH2. Para compilar para OpenMPI:
mpicc
Para compilar para MVAPICH2:
mpicc_mvp
Se recomienda el uso de un script para enviar el trabajo a la cola de ejecución. De esta manera, la salida del ejecutable se vuelca en un archivo. Para ello, hay que copiar el ejecutable y el script en la carpeta scratch (ver sección Información).
El script se ejecuta utilizando el comando sbatch de la siguiente forma:
sbatch -N [] -p [] execute.sh
donde
-N especifica el número de nodos de cómputo a usar.
-p especifica el recurso (ver sección Recursos disponibles).
Dentro del script de ejecución, ha de utilizarse el comando srun. Para la ejecución de programas código secuencial, código multihebrado o código CUDA, se debe usar el lanzador de SLURM de la siguiente manera:
srun -n 1 ejecutable
Para la ejecución de programas con OpenMPI:
mpirun --mca btl ^openib -np [] ejecutable
Y para la ejecución de programas con MVAPICH2:
srun -n [] ejecutable
donde -n [] especifica el número de procesos.
Importante: Añadir el flag --exclusive si se desea que el trabajo se ejecute en un nodo de forma exclusiva.
execute.sh
#!/bin/bash
# Run the program
srun -n 1 ejecutable
exit 0
Se puede realizar ejecuciones sin utilizar el script de ejecución. Para ello, se puede hacer uso del comando srun de la siguiente forma:
srun -N [] -n [] -p [] ejecutable
Para un programa compilado usando OpenMPI, hay que reservar primero el número de nodos a través del comando salloc de la siguiente forma:
salloc -N [] -p [] mpirun --mca btl ^openib -np [] ejecutable
donde
-N especifica el número de nodos de cómputo a usar.
-p especifica el recurso (ver sección Recursos disponibles).
La configuración de SLURM permite la reserva de los recursos GPU disponibles. Esto se hace mediante el flag --gres=gpu:X donde X indica el número de recursos GPU que se quieren reservar para la ejecución.
Cada uno de los nodos de ibgpu contiene 2 recursos CUDA y hasta 8 usando rCUDA. Añadir las siguientes rutas a las variables de entorno:
PATH: /usr/local/cuda-6.5/bin
LD_LIBRARY_PATH: /usr/local/cuda-6.5/lib64
El nodo de ibgpuk contiene 4 recursos CUDA. Añadir las siguientes rutas a las variables de entorno:
PATH: /usr/local/cuda-7.5/bin
LD_LIBRARY_PATH: /usr/local/cuda-7.5/lib64
Ejemplo:
srun -N 1 -n 1 -p ibgpu --gres=gpu:1 programacuda
Nos permite ejecutar nuestro programa CUDA, reservando una GPU del nodo de la partición ibgpu asignado por SLURM.
El uso de rCUDA está disponible en el clúster con la cola ibgpu. Además la versión de SLURM actual ha sido modificada para poder especificar la reserva tanto de recursos GPU físicos, cómo remotos. Esto se hace mediante el flag
--gres=rgpu:X
donde X indica el número de recursos GPU remotos que se quieren reservar para la ejecución.
Ejemplo:
srun -N 1 -n 1 -p ibgpu --gres=rgpu:4 programacuda
Nos permite ejecutar nuestro programa CUDA, reservando cuatro GPUs disponibles en el clúster.
El uso de AMD® OpenCL está disponible en el clúster con la cola ibcl.
Para compilar el programa en la máquina destino con las librerías de OpenCL es posible usar un fichero makefile (teniendo el código fuente en el directorio scratch) de la siguiente forma:
srun -p ibcl make
La ejecución en la cola ibbullion es igual a la descrita anteriormente, pero si el programa necesita compilarse en la máquina destino es posible usar un fichero makefile (teniendo el código fuente en el directorio scratch) de la siguiente forma:
srun -p ibbullion make
MATLAB® se encuentra instalado en la cola ibbullion en la ruta /usr/local/MATLAB/R2015b/, incluyendo Parallel Computing Toolbox.
Debido a que existen diferentes versiones de Matlab instaladas en el cluster, la siguiente tabla resume cada una de ellas con su ubicacion en el nodo.
Librerías para gestión de memoria
Las siguientes librerías para gestión de memoria se encuentran instaladas en los nodos multicore y en bullion.
Thread-Caching Memory Allocator (TCMAlloc) de Google® Performance Tools
Lockless Memory Allocator (LLalloc) de Lockless Inc.
Intel® Threading Builing Blocks Memory Allocator (TBBMAlloc) de Intel®
TBB
Intel® Threading Builing Blocks se encuentra disponible en el cluster.
GSL
GSL son las siglas de GNU Scientific Library.
Para compilar:
gcc -Wall -I/opt/gsl/include -c test.c
gcc -static -L/opt/gsl/lib test.o -lgsl -lgslcblas -lm
test.c
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
int main (void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0(x);
printf("J0(%g) = %.18e\n", x, y);
return 0;
}
PAPI
PAPI son las siglas de Performance Application Programming Interface. La versión instalada es la 5.3.2.
Para compilar:
gcc -L/opt/papi-5.3.2/lib -Wall matrixmult_papi.c -lpapi
matrixmult_papi.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "/opt/papi-5.3.2/include/papi.h"
#define N 300
#define M 4000
int main( int argc, char *argv[] ) {
int i, j, k;
double *A, *B, *C;
long long counters[3];
int PAPI_events[] = {
PAPI_TOT_CYC,
PAPI_L2_DCM,
PAPI_L2_DCA };
PAPI_library_init(PAPI_VER_CURRENT);
A = (double *)malloc(N*M*sizeof(double));
B = (double *)malloc(N*M*sizeof(double));
C = (double *)malloc(N*N*sizeof(double));
if ( A == NULL || B == NULL || C == NULL ) {
fprintf(stderr,"Error allocating memory!\n");
exit(1);
}
/* initialize A & B */
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
A[M*i+j] = 3.0;
B[N*j+i] = 2.0;
}
}
for ( i = 0; i < N*N; i++ ) {
C[i] = 0.0;
}
i = PAPI_start_counters( PAPI_events, 3 );
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < N; j++ ) {
for ( k = 0; k < M; k++ ) {
C[N*i+j] += A[M*i+k]*B[N*k+j];
}
}
}
PAPI_read_counters( counters, 3 );
printf("%lld L2 cache misses (%.3lf%% misses) in %lld cycles\n",
counters[1],
(double)counters[1] / (double)counters[2],
counters[0] );
free(A);
free(B);
free(C);
return 0;
}
TAU
TAU son las siglas de Tuning and Analysis Utilities.
Para utilizar esta herramienta de profiling, hay que definir la siguiente variable de entorno:
export TAU_MAKEFILE=/opt/tau/x86_64/lib/Makefile.tau-mpi-pdt