Tous mes programmes MPI (écrits en c) donnent une erreur de segmentation

J’ai écrit quelques programmes de base en C en utilisant MPI. Certains d’entre eux travaillaient jusqu’à hier. Aujourd’hui, la plupart d’entre eux présentent des défauts de segmentation. On fait une boucle infinie, mais je n’ai pas de boucle. Cela me rend vraiment fou. C’est le programme qui va en boucle.

#include  #include  #include  #include "mpi.h" int main(int argc, char *argv[]) { int rank, nprocs, maxn, i, j, local_counter, global_counter; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm comm; MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* Number of processes */ MPI_Comm_rank(MPI_COMM_WORLD, &rank); int N = 0; /*Number of prime numbers I've found*/ if (rank == 0){ printf("What is the maximum number to check?"); scanf("%d", &maxn); } MPI_Finalize(); return 0; } 

En utilisant scanf vous essayez de lire depuis stdin ce qui n’est généralement pas admissible dans MPI et sur mon système (un cluster d’ordinateurs), le programme se bloque et s’exécute “à l’infini”.

Ce que vous devez faire, c’est lire votre valeur dans un fichier ou en tant qu’argument de ligne de commande.

Voici la version de l’argument en ligne de commande:

 #include  #include  #include  #include "mpi.h" int main(int argc, char *argv[]) { int rank, nprocs, maxn, i, j, local_counter, global_counter; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm comm; /* Number of processes */ MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); /* Number of prime numbers I've found */ int N = 0; // Usage check if(argc!=2){ printf("Error\n"); printf("Syntax mpi_in \n"); MPI_Finalize(); exit(1); } maxn = atoi(argv[1]); if (rank == 0){ printf("Maximum number to check is: %d \n", maxn); } MPI_Finalize(); return 0; } 

Dans la version d’argument de ligne de commande, vous pouvez également obliger tous les processus à décompresser l’argument. Ici, pour un processus de démonstration, 0 affiche la valeur.

L’appel de MPI_Init nettoie la liste d’arguments afin que le programme utilise ensuite argc et argv[] comme s’il s’agissait d’un programme non MPI. Ce n’est apparemment pas un comportement garanti, mais cela fonctionne sur deux systèmes différents que j’utilise. Dans ce cas, argc sera 2 puisque le premier argument est toujours le nom du programme. Vous pouvez le lancer depuis le terminal avec, par exemple, 5 processus,

 mpirun -np 5 mpi_in 300 

Notez que, puisque argv est un tableau de pointeurs sur des chaînes, le programme doit atoi convertir le nombre de chaînes en chaînes int.