Ultimo aggiornamento: 2021-10-27
Lo scopo di questo esercizio è di implementare la funzione
void my_Bcast(int *v)
che effettua una comunicazione di tipo broadcast. La funzione deve inviare a tutti i processi diversi dal master (processo 0) il valore *v
presente nella memoria del master.
Nota. MPI mette a disposizione la funzione
MPI_Bcast()
per realizzare una comunicazione di tipo broadcast, che va sempre preferita a soluzioni "fatte in casa" come quella descritta nel seguito. Lo scopo di questo esercizio è di vedere una possibile implementazione dell'operazione broadcast in MPI, sebbene non ci sia alcuna garanzia che la funzioneMPI_Bcast()
sia realizzata effettivamente come descritto.
Per realizzare la funzione my_Bcast()
, ogni processo determina il proprio rango \(p\) e il numero \(P\) di processi MPI attivi. Il processo 0:
*v
ai processi \((2p + 1)\) e \((2p + 2)\) (se esistono: potrebbe capitare che nessuno dei due esista, oppure esista solo \(2p+1\), oppure esistano entrambi)Ogni altro processo \(p > 0\):
riceve un valore intero dal processo \((p - 1)/2\) e lo memorizza nella locazione di memoria \(v\);
invia il valore \(v\) ai processi \((2p + 1)\) e \((2p + 2)\) (purché esistano).
Ad esempio, nel caso siano presenti \(P=15\) processi MPI, si otterrebbe lo schema di comunicazione illustrato nella Figura 1; le frecce indicano comunicazioni punto-punto, i numeri indicano il rango dei processi coinvolti. Si noti che il procedimento descritto sopra funziona correttamente qualunque sia il numero \(P\) di processi.
Il file mpi-my-bcast.c contiene lo scheletro della funzione my_Bcast()
. Si chiede di completarne il corpo usando MPI_Send()
e MPI_Recv()
.
Compilare con:
mpicc -std=c99 -Wall -Wpedantic mpi-my-bcast.c -o mpi-my-bcast
Eseguire con:
mpirun -n 4 ./mpi-my-bcast