Il s’agit d’un anneau de communication. Écrire un programme MPI où parmi n processus, le processus de rang r reçoit la valeur 1000 + (r − 1) du processus de rang r − 1, 1 ≤ r ≤ n − 1, et où le processus de rang 0 reçoit la valeur 1000 + (n − 1) du processus de rang n − 1
时间: 2023-11-28 11:50:04 浏览: 34
Voici un exemple de programme MPI en C qui implémente l'anneau de communication décrit dans votre question :
```c
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
int rank, size, value;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0) {
// Le processus 0 envoie la valeur 1000 + (n - 1) au processus 1
value = 1000 + size - 1;
MPI_Send(&value, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
for (int i = 1; i < size; i++) {
if (rank == i) {
// Le processus i reçoit la valeur du processus i - 1
MPI_Recv(&value, 1, MPI_INT, i - 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Process %d received value %d from process %d\n", rank, value, i - 1);
// Le processus i envoie la valeur 1000 + (i - 1) au processus i + 1
value = 1000 + i - 1;
if (i < size - 1) {
MPI_Send(&value, 1, MPI_INT, i + 1, 0, MPI_COMM_WORLD);
}
}
}
if (rank == 0) {
// Le processus 0 reçoit la valeur du processus n - 1
MPI_Recv(&value, 1, MPI_INT, size - 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Process %d received value %d from process %d\n", rank, value, size - 1);
}
MPI_Finalize();
return 0;
}
```
Le programme commence par initialiser MPI et obtenir le rang de chaque processus et la taille du communicateur MPI_COMM_WORLD. Le processus 0 envoie la valeur 1000 + (n - 1) au processus 1 en utilisant MPI_Send. Ensuite, chaque processus i (1 <= i < n) reçoit la valeur du processus i - 1 avec MPI_Recv et envoie la valeur 1000 + (i - 1) au processus i + 1 en utilisant MPI_Send (sauf pour le dernier processus, qui ne peut pas envoyer de valeur). Finalement, le processus 0 reçoit la valeur du dernier processus en utilisant MPI_Recv et affiche les valeurs reçues.
Notez que ce programme suppose que le nombre de processus est supérieur à 1. Si n = 1, il ne se passera rien.