Contenido

  1. Acceso
  2. Información
  3. Recursos disponibles
  4. Compilar
  5. Ejecutar
    1. Ejemplo de script de ejecución
    2. Ejecutar sin utilizar script
  6. Reserva de recursos GPU
    1. Reserva de recursos GPU remotos (rCUDA)
  7. OpenCL
  8. Bullion
  9. Matlab
  10. Librerías disponibles

Acceso

El único acceso permitido es a través de una conexión segura usando el puerto 22 (SSH, SFTP, etc…).

Información

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.

Recursos disponibles

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)

Compilar

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

Ejecutar

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.

Ejemplo de script de ejecución

execute.sh

#!/bin/bash
# Run the program
srun -n 1 ejecutable
exit 0

Ejecutar sin utilizar script

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).

Reserva de recursos GPU

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.

Reserva de recursos GPU remotos (rCUDA)

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.

OpenCL

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

Bullion

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

Matlab

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.

Matlab en el cluster
Nodo Versión Ruta
Front 2012b /usr/local/MATLAB/R2012b
01-17 2012a /usr/local/MATLAB/R2012a
nvidia 2014b /usr/local/MATLAB/R2014b
bullion 2015b* /usr/local/MATLAB/R2015b
* Incluye Parallel Computing Toolbox.

Librerías disponibles

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