| 1 | = ALTAMIRA = |
| 2 | |
| 3 | [[NoteBox(note, Se recomienda la lectura la [https://grid.ifca.es/wiki/Supercomputing/Userguide guía de usuario] del Supercomputador Altamira antes de la realización de las prácticas.)]] |
| 4 | |
| 5 | == Práctica 1 == |
| 6 | El objetivo de esta práctica es tomar contacto con el uso del Supercomputador Altamira, así como del sistema de colas [https://computing.llnl.gov/linux/slurm/ SLURM] instalado en él: |
| 7 | |
| 8 | * Conéctese al frontend de Altamira (altamira1.ifca.es) mediante el comando `ssh` (!Linux/Mac OS) o el programa [http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe PyTTY] (Windows). Para ello, previamente cada alumno ha recibido un correo con una cuenta y una clave de acceso: |
| 9 | {{{ |
| 10 | [user@localmachine ~]$ ssh user@altamira1.ifca.es |
| 11 | }}} |
| 12 | |
| 13 | * Desde el frontend, utilizando la plantilla que se adjunta enviar un job. Para lo cual, será necesario utilizar el comando '''mnsubmit''', así como los editores '''vi''' o '''nano'''. |
| 14 | |
| 15 | Plantilla: |
| 16 | {{{ |
| 17 | #!/bin/bash |
| 18 | #@ job_name = sleep_%j |
| 19 | #@ initialdir = . |
| 20 | #@ output = sleep_%j.out |
| 21 | #@ error = sleep_%j.err |
| 22 | #@ total_tasks = 1 |
| 23 | #@ wall_clock_limit = 00:02:00 |
| 24 | |
| 25 | echo "Nodo: ${SLURM_NODELIST}" |
| 26 | |
| 27 | echo "Hora de inicio `date`" |
| 28 | sleep 30 |
| 29 | echo "Hora de fin `date`" |
| 30 | }}} |
| 31 | |
| 32 | * Envío del job: |
| 33 | {{{ |
| 34 | [user@login1 ~]$ mnsubmit sleep_template |
| 35 | Submitted batch job 621336 |
| 36 | }}} |
| 37 | * Para monitorizar el job use el comando '''mnq''': |
| 38 | {{{ |
| 39 | [user@login1 ~]$ mnq |
| 40 | JOBID NAME USER STATE TIME TIMELIMIT CPUS NODES NODELIST(REASON) |
| 41 | 621336 0.sleep_ user PENDING 0:00 2:00 1 1 (Priority) |
| 42 | |
| 43 | }}} |
| 44 | * Comprobar el resultado obtenido en los ficheros de '''output'''(sleep_%j.out) y '''error'''(sleep_%j.err). |
| 45 | |
| 46 | == Práctica 2 == |
| 47 | Una vez enviado nuestro primer job, ejecutaremos un job de tipo openMP usando el código del programa [http://moodle.unican.es/moodle27/pluginfile.php/96708/mod_resource/content/0/HelloWorldOpenMP.c HelloWorldOpenMP]. |
| 48 | |
| 49 | * Haciendo uso del programa '''module''' cargar el compilador ''gcc'': |
| 50 | {{{ |
| 51 | [user@login1 ~]$ module load gcc |
| 52 | load gcc/4.6.3 (PATH, MANPATH, LD_LIBRARY_PATH) |
| 53 | }}} |
| 54 | |
| 55 | * Compilar el programa ''HelloWorldOpenMP.c'' y generar un ejecutable con el nombre ''HelloWorldOpenMP'': |
| 56 | {{{ |
| 57 | [user@login1 ~]$ gcc HelloWorldOpenMP.c -fopenmp -o HelloWorldOpenMP |
| 58 | }}} |
| 59 | |
| 60 | * Plantilla a ejecutar en el supercomputador: |
| 61 | {{{ |
| 62 | #!/bin/bash |
| 63 | #@ job_name = openmp_%j |
| 64 | #@ initialdir = . |
| 65 | #@ output = openmp_%j.out |
| 66 | #@ error = openmp_%j.err |
| 67 | #@ total_tasks = 32 |
| 68 | #@ wall_clock_limit = 00:02:00 |
| 69 | |
| 70 | echo "Numero de procesos: ${SLURM_NPROCS}" |
| 71 | echo "Numero de nodos: ${SLURM_JOB_NUM_NODES}" |
| 72 | echo "Numero de procesos por nodo: ${SLURM_JOB_CPUS_PER_NODE}" |
| 73 | echo "Nodos: ${SLURM_JOB_NODELIST}" |
| 74 | |
| 75 | ./HelloWorldOpenMP |
| 76 | }}} |
| 77 | Más información sobre las variables de entorno (${SLRUM_*}) en el [http://slurm.schedmd.com/sbatch.html#SECTION_OUTPUT%20ENVIRONMENT%20VARIABLES link]. |
| 78 | |
| 79 | * Envió del job openMP: |
| 80 | {{{ |
| 81 | $ module load gcc |
| 82 | load gcc/4.6.3 (PATH, MANPATH, LD_LIBRARY_PATH) |
| 83 | $ mnsubmit HelloWorldOpenMP_template |
| 84 | Submitted batch job 621342 |
| 85 | }}} |
| 86 | |
| 87 | * Una vez finalizado el job, compruebe el resultado obtenido en los ficheros '''output''' (openmp_%j.out) y '''error''' (openmp_%j.err). ¿ El resultado obtenido es el esperado? ¿Por qué?. |
| 88 | |
| 89 | == Práctica 3 == |
| 90 | Repita el envío del job de la práctica 3 modificando el número de ''threads'' a ejecutar, pero sin modificar la variable ''total_tasks''. Para ello, utilice la variable de entorno `OMP_NUM_THREADS`. |
| 91 | * La plantilla a utilizar en ese caso será: |
| 92 | {{{ |
| 93 | #!/bin/bash |
| 94 | #@ job_name = openmp_%j |
| 95 | #@ initialdir = . |
| 96 | #@ output = openmp_%j.out |
| 97 | #@ error = openmp_%j.err |
| 98 | #@ total_tasks = 32 |
| 99 | #@ wall_clock_limit = 00:02:00 |
| 100 | |
| 101 | export OMP_NUM_THREADS=XX |
| 102 | |
| 103 | echo "Numero de procesos: ${SLURM_NPROCS}" |
| 104 | echo "Numero de nodos: ${SLURM_JOB_NUM_NODES}" |
| 105 | echo "Numero de procesos por nodo: ${SLURM_JOB_CPUS_PER_NODE}" |
| 106 | echo "Nodos: ${SLURM_JOB_NODELIST}" |
| 107 | |
| 108 | ./HelloWorldOpenMP |
| 109 | }}} |
| 110 | Donde '''XX''' es el número de ''threads'' a ejecutar. |
| 111 | |
| 112 | * Envíe 3 jobs con '''XX''' igual a 8, 16 y 32, y compruebe si los resultados son el esperados. |