Erreur de segmentation utilisant MPI en C?

J’ai donc besoin d’implémenter une fonction d’addition de vecteur en parallèle en utilisant MPI en C. Malheureusement, lorsque je l’exécute, il affiche une trace de nombreux emplacements de mémoire, puis le message suivant:

================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = PID 2419 RUNNING AT hbaum-pc = EXIT CODE: 6 = CLEANING UP REMAINING PROCESSES = YOU CAN IGNORE THE BELOW CLEANUP MESSAGES =================================================================================== YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6) This typically refers to a problem with your application. Please see the FAQ page for debugging suggestions 

Voici mon code de fonction:

 double* vector_vector_addition_parallel(double* a, double* b, int length) { int rank, size, error; double* result = (double*)malloc(sizeof(double)*length); error = MPI_Init(NULL,NULL); error = MPI_Comm_size(MPI_COMM_WORLD,&size); error = MPI_Comm_rank(MPI_COMM_WORLD,&rank); int sublist_length = (int)(length/size); double* sub_a = (double*)malloc(sizeof(double) * sublist_length); double* sub_b = (double*)malloc(sizeof(double) * sublist_length); error = MPI_Scatter(a, sublist_length, MPI_DOUBLE, sub_a, sublist_length, MPI_DOUBLE, 0, MPI_COMM_WORLD); error = MPI_Scatter(b, sublist_length, MPI_DOUBLE, sub_b, sublist_length, MPI_DOUBLE, 0, MPI_COMM_WORLD); double* buffer = (double*)malloc(sizeof(double)*sublist_length); for(int i = 0; i < sublist_length; i++) { buffer[i] = sub_a[i] + sub_b[i]; } error = MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,length,MPI_DOUBLE,0,MPI_COMM_WORLD); error = MPI_Finalize(); return result; } 

Et voici le code qui l’appelle:

 int main(int argc, char** argv) { double a[8] = {1.0,3.0,5.0,7.0,9.0,11.0,13.0,15.0}; double b[8] = {2.0,4.0,6.0,8.0,10.0,12.0,14.0,16.0}; double* vec = vector_vector_addition_parallel(a,b,8); return 0; } 

Je le comstack avec

 mpicc  

et l’exécuter avec

 mpiexec -n 4  

J’ai aussi essayé d’utiliser gdb pour déboguer le code, mais selon gdb, il n’y a pas de problème et tout va bien. Lorsque j’utilise printf pour générer le vecteur, il imprime même le vecteur correct lorsque je lance le programme via gdb.

Je pense qu’il y a quelque chose qui cloche dans la façon dont j’ai utilisé MPI_Gather. Lorsque je commente ce commentaire, le code fonctionnera sans erreur de segmentation, bien que ce ne soit évidemment pas la bonne réponse car je dois utiliser MPI_Gather pour obtenir un résultat.

Comment puis-je améliorer mon code afin de ne pas avoir une erreur de segmentation?

En effet, votre MPI_Gather est le problème. Le paramètre de compte de réception doit être le nombre d’éléments reçus d’un processus unique . Ainsi, vous devriez passer sublist_length au lieu de la length pour recvcount , à savoir:

 MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,sublist_length,MPI_DOUBLE,0,MPI_COMM_WORLD);