...
- hybrid model - izvršavanje korištenjem MPI implementacije u kontejneru
- bind model - izvršavanje korištenjem MPI implementacije izvan kontejnera
Na Supeku je preporučuje se koristiti bind model, zbog knjižnica koje osiguravaju integraciju sa sustavom za upravljanje PBS i mrežom Slingshot. Pri tom aplikacija koja koristi MPI mora biti ABI kompatibilna (kompajlirana sa MPICH verzija => v3.1 nadalje). Način na koji se to inače postiže je dopremanjem knjižnice libmpi.so.12
putem varijable okoliša LD_LIBRARY_PATH
prije poziva aplikacije:
Code Block | ||
---|---|---|
| ||
# postavljanje LD_LIBRARY_PATH
[korisnik@kompjuter] $ export LD_LIBRARY_PATH=/putanja/do/libmpi.so.12:$LD_LIBRARY_PATH
# izvršavanje aplikacijom mpiexec
[korisnik@kompjuter] $ mpiexec -np 10 ./moja_ABI_kompatibilna_MPI_aplikacija |
U slučaju kontejnera, varijable okoliša se uglavnom nasljeđuju od računala s kojeg se pokreće, no u ovom slučaju potrebno je dodatno namjestiti okolinu što se može učiniti na dva načina:
- korištenjem
--env
ili--env-file
opcije pri pokretanju kontejnera - namještanjem
APPTAINERENV_*
varijable okoliša prije pozivanja kontejnera
Na Supeku je potrebno je koristiti bind model, zbog knjižnica koje osiguravaju integraciju sa sustavom za upravljanje PBS i mrežom Slingshot. Moduli koji osiguravaju spajanje definicijom varijabli okoliša CRAY_LD_LIBRARY_PATH
i LD_LIBRARY_PATH
su:
-
cray-pals
- integracija Craya sa sustavom PBS Professional cray-mpich-abi
- dostavljanje ABI kompatibilnih knjižnicacray-pmi
- knjižnica za spajanje s Crayevim sučeljem za pokretanje paralelnih programalibfabric
- mrežni API za spajanje na Slinghot
Dodatno, pri pozivu se moraju spojiti odgovarajući direktoriji u kontejner:
/opt
- putanja za knjižnice Cray/run
- putanja za PBS/usr/lib64
- putanja za sistemske knjižnice
Pri podnošenju posla na Crayu, to se može učiniti na sljedeći način (primjerice, u skripti PBS mpi-test.sh
) :
Code Block | ||
---|---|---|
| ||
#!/bin/bash
#PBS -N mpi-test
#PBS -l select=2:ncpus=1
#PBS -l place=scatter
# dopremanje modula
module load PrgEnv-gnu
module load cray-mpich-abi
module load cray-pals
module load cray-pmi
module load libfabric
# namještanje okolišne varijable LD_LIBRARY_PATH u kontejneru:
#
# 1) CRAY_LD_LIBRARY_PATH - Cray knjižnice iz /opt
# 2) LD_LIBRARY_PATH - sistemske knjižnice iz /usr/lib64
# 3) \$LD_LIBRARY_PATH - očuvanje varijable ako već postoji u kontejneru
# 4) /opt/cray/pe/pals/1.2.3/lib - putanja za PALS servis
#
export APPTAINERENV_LD_LIBRARY_PATH="${CRAY_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}:\$LD_LIBRARY_PATH:/opt/cray/pe/pals/1.2.3/lib"
# izvršavanje kontejnera mpi-test.sif s aplikacijom mpiexec modula cray-pals
mpiexec --no-transfer \
apptainer exec \
--bind /opt \
--bind /run \
--bind /usr/lib64 \
mpi-test.sif \
/myapp/mpi-test |
...
) ili kompajlirana sa openMPI 5.x.x verzijom. Isto tako, potrebno je koristiti RHEL-8.6 kompatibilne linux distribucije.
Warning | ||
---|---|---|
| ||
Zbog bind model spajanja, potrebno je koristiti operativne sustave koji su slični operativnom sustavu Supeka Red Hat Enterprise Linux 8.6. Neki od mogućih su: |
Kako bi korisnicima olakšali izgradnju kontejnera i pokretanje aplikacija sa bind modelom, pripremili smo početne slike kontejnera povrh kojih je moguće instalirati i kompajlirati aplikacije. Pripremljene slike sadrže MPICH i openMPI kompatibilne verzije sa MPI implementacijama dostupnim na Supeku. Osim slika, pripremljeni su i odgovarajući moduli koji će spojiti potrebne knjižnice i direktorije na Supeku sa kontejnerom.
U tablici su prikazane putanje slika za izgranju kontejnera i odgovarajući moduli ovisno o MPI implementaciji:
MPI kontejner | OS kontejner | MPI model | MPI Supek | Polazni kontejner | Bind modul |
---|---|---|---|---|---|
mpich-4.1.1 | Rocky-8 | Bind | cray-mpich-8.1.26 | /apps/utils/apptainer-images/rockylinux-8-mpich-4.1.1.sif | utils/apptainer-bind/cray-mpich |
openMPI-5.0.1 | Rocky-8 | Bind | Openmpi- 5.0.1-gnu-8.5.0 | /apps/utils/apptainer-images/rockylinux-8-openmpi-5.0.1.sif | utils/apptainer-bind/openmpi-5.0.1 |
openMPI-4.1.2 | Ubuntu-22.04 | Hybrid | OpenMPI 4.x.x | /apps/utils/apptainer-images/ubuntu-22.04-openmpi-4.1.2.sif | X |
Primjer izgradnje kontejnera koristeći MPICH(v4.1.1) :
Code Block | |||||||
---|---|---|---|---|---|---|---|
| |||||||
Bootstrap: dockerlocalimage From: rockylinux:8/apps/utils/apptainer-images/rockylinux-8-mpich-4.1.1.sif %files #kopiranje datoteka mpi-test.latency.c /myapp/ %environment export LD_LIBRARY_PATH=/usr/lib64/mpich/lib:$LD_LIBRARY_PATH export PATH=/usr/lib64/mpich/bin:$PATH/testmpi/ %post # osvježi i instaliraj knjižnice za kompilaciju dnf update -y dnf install mpich-devel -y # namjesti okolinu za razvoj MPICHom export LD_LIBRARY_PATH=/usr/lib64/mpich/lib:$LD_LIBRARY_PATH export PATH=/usr/lib64/mpich/bin:$PATH # prevedi aplikaciju u izvršnu datoteku mpicc -o /myapp/mpi-test /myappprevedi aplikaciju u izvršnu datoteku mpicc /testmpi/mpi.latency.c -o /testmpi/mpi.latency |
Code Block | ||||
---|---|---|---|---|
| ||||
#PBS -q cpu #PBS -l select=2:ncpus=1 #PBS -l place=scatter cd $PBS_O_WORKDIR module load utils/apptainer-bind/cray-mpich mpiexec --no-transfer apptainer exec mpich.sif /testmpi/mpi.latency/mpi-test.c |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// Author: Wes Kendall
// Copyright 2011 www.mpitutorial.com
// This code is provided freely with the tutorials on mpitutorial.com. Feel
// free to modify it for your own use. Any distribution of the code must
// either provide a link to www.mpitutorial.com or keep this header intact.
//
// An intro MPI hello world program that uses MPI_Init, MPI_Comm_size,
// MPI_Comm_rank, MPI_Finalize, and MPI_Get_processor_name.
//
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
// Initialize the MPI environment. The two arguments to MPI Init are not
// currently used by MPI implementations, but are there in case future
// implementations might need the arguments.
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// Get the name of the processor
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
// Print off a hello world message
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
// Finalize the MPI environment. No more MPI calls can be made after this
MPI_Finalize();
} | ||||||
Warning | ||||||
| ||||||
Zbog bind model spajanja, potrebno je koristiti operativne sustave koji su slični operativnom sustavu Supeka Red Hat Enterprise Linux 8.6. Neki od mogućih su: |
Grafički procesori i CUDA
...