|
|
accès étudiants
|
#include <stdio.h>
#include <unistd.h>
#include "mpi.h"
int main(int argc, char **argv)
{ int rank, size;
char hostname[100];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
gethostname(hostname, 100);
printf("Hello from process %d of %d on host %s\n", rank, size, hostname);
MPI_Finalize();
return 0;
}
Compiler le programme en utilisant mpicc (les mêmes options que gcc). Exécuter en utilisant mpiexec.
La première fonction MPI utilisée dans un programme doit être MPI_Init. Chaque programme doit se terminer par MPI_Finalize.
Pour connaître le nombre total de processus, utilisez MPI_Comm_size. Chaque processus possède un numéro entre 0 et n - 1, où n est le nombre total de processus. Pour connaître le numéro du processus courant, utilisez MPI_Comm_rank.
#include <stdio.h>
#include <string.h>
#include "mpi.h"
#define TAG 99
int main(int argc, char **argv)
{ int rank, size;
int i;
char msg[100];
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{ for (i = 1; i < size; i++)
{ sprintf(msg, "Hello %d!", i);
MPI_Send(msg, strlen(msg) + 1, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
}
}
else
{ MPI_Recv(msg, 100, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &status);
printf("%d received %s\n", rank, msg);
}
MPI_Finalize();
return 0;
}
Dans cet exemple le processus 0 envoie un message aux autres processus. Les autres processus reçoivent ce message.
Les primitives de communication les plus simples sont MPI_Send et MPI_Recv. Consulter la documentation de ces deux fonctions (ici).
On suppose que nous avons n processus en anneau. Le voisin gauche de processus p est p - 1 et son voisin droit est p + 1 (le voisin gauche de 0 est n - 1 et le voisin droit de n - 1 est 0). Faire passer par l'anneau un message de longueur k octets m fois (k et m sont paramètres de la ligne de commande). La communication est initié par processus 0, chaque processus reçoit le message de son voisin gauche et l'envoie à son voisin droit. Mesurer le temps nécessaire en utilisant MPI_Wtime.