Ultimo aggiornamento: 2021-05-14
Realizzare un programma MPI chiamato mpi-ring.c che effettua una comunicazione ad anello tra i processi. Più in dettaglio, detto \(P\) il numero di processi MPI (da specificare con il comando mpirun
; si deve avere \(P > 1\)) si richiede di realizzare le funzionalità seguenti:
Il programma riceve sulla riga di comando un valore intero \(K\), che rappresenta il numero di "giri" dell'anello che devono essere effettuati (\(K \geq 1\)). Ricordo che tutti i processi MPI hanno accesso ai valori passati sulla riga di comando, quindi tutti possono conoscere il valore di \(K\) senza bisogno di comunicazioni esplicite.
Il processo 0 (il master) invia al processo 1 un intero, il cui valore iniziale è 1.
Ciascun processo \(p\) (incluso il master) rimane in attesa di ricevere un valore v dal processo \(p-1\); una volta ricevuto, il processo \(p\) invia il valore \((v + 1)\) al processo \(p+1\). Poiché la comunicazione si considera ad anello, il predecessore del processo 0 è \((P - 1)\), mentre il successore del processo \((P - 1)\) è il processo 0.
Il master stampa il valore ricevuto dopo la \(K\)-esima iterazione e la computazione termina; dati il numero P di processi e il valore di \(K\), quale valore deve stampare il master?
Ad esempio, se \(K = 2\) e ci sono \(P = 4\) processi, la comunicazione da realizzare deve essere quella mostrata in Figura 1 (i cerchi sono i processi MPI; le frecce rappresentano messaggi il cui contenuto è il numero indicato sopra). I messaggi percorrono \(K=2\) "giri" dell'anello composto da tutti i processi; al termine dell'esecuzione il processo 0 riceve e stampa il valore 8.
Per compilare:
mpicc -std=c99 -Wall -Wpedantic mpi-ring.c -o mpi-ring
Per eseguire:
mpirun -n 4 ./mpi-ring