Message Passing Interface (MPI)
[plgrycerz@zeus mytest]$ module add plgrid/tools/impi
#include <stdio.h> #include <mpi.h> int main (int argc, char * argv[]) { int rank, size; MPI_Init (&argc, &argv); /* starts MPI */ MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */ MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */ printf( "Hello world from process %d of %d\n", rank, size ); MPI_Finalize(); return 0; }
[plgrycerz@zeus mytest]$ mpicc hello.c -o hello
#!/bin/bash -l ## Nazwa zlecenia #SBATCH -J MPIMytest ## Liczba alokowanych węzłów #SBATCH -N 2 ## Liczba zadań per węzeł (domyślnie jest to liczba alokowanych rdzeni na ##węźle) #SBATCH --ntasks-per-node=6 ## Maksymalny czas trwania zlecenia (format HH:MM:SS) #SBATCH --time=00:00:10 ## Specyfikacja partycji #SBATCH -p plgrid-testing ## Plik ze standardowym wyjściem #SBATCH --output="output.out" ## Plik ze standardowym wyjściem błędów #SBATCH --error="error.err" srun /bin/hostname ## Zaladowanie modulu IntelMPI w wersji domyslnej module add plgrid/tools/impi ## przejscie do katalogu z ktorego wywolany zostal sbatch cd $SLURM_SUBMIT_DIR mpiexec ./hello
[plgrycerz@zeus mytest]$ sbatch run.sh
[plgrycerz@zeus mytest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 5596299 plgrid-te MPIMytes plgrycer PD 0:00 2 (None)
[plgrycerz@zeus mytest]$ cat output.out n1049-amd n1050-amd n1049-amd n1049-amd n1049-amd n1049-amd n1049-amd n1050-amd n1050-amd n1050-amd n1050-amd n1050-amd Hello world from process 0 of 12 Hello world from process 6 of 12 Hello world from process 1 of 12 Hello world from process 7 of 12 Hello world from process 2 of 12 Hello world from process 8 of 12 Hello world from process 3 of 12 Hello world from process 9 of 12 Hello world from process 4 of 12 Hello world from process 10 of 12 Hello world from process 5 of 12 Hello world from process 11 of 12
[plgrycerz@zeus mytest]$ cat error.err plgrid/tools/impi/2018 unloaded. plgrid/tools/impi/2018 loaded.
DANE=MOJNUMER AKUMULATOR=0 POWTORZ N razy wyslij DANE do procesu (M+1)%N (prawy sąsiad). odbierz DANE2 od procesu (M-1)%N (lewy sąsiad) AKUMULATOR=AKUMULATOR+DANE2 DANE=DANE2 KONIEC POWTORZ wypisz AKUMULATORKażdy proces dodaje otrzymaną liczbę do lokalnego akumulatora. Na koncu kazdy powinien wypisac sume wszystkich numerów procesów. Uwaga na deadlock !