Adressage de la mémoire dans MPI_Gather C

J’essaie de transmettre des données à MPI_Gather . J’alloue de la mémoire comme suit:

 float *phie, *phitemp; MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); phitemp=(float *) malloc(20*sizeof(float)); if (rank==1) phie=(float *) malloc(itermax*20*size*sizeof(float)); 

puis demandez à tous les processus d’envoyer des données au rang 1 en utilisant MPI_Gather() comme ci-dessous:

 for (iter=0;iter<itermax;iter++) { MPI_Gather((float *) phitemp, 20, MPI_FLOAT, (float *) (phie+iter*20*size*sizeof(float)), 20, MPI_FLOAT, 1, MPI_COMM_WORLD); iter=0; 

}

Je reçois des messages d’erreur indiquant que je n’alloue pas la mémoire correctement.

L’arithmétique de pointeur est effectuée sur la taille du mot pointé par le pointeur. Puisque phie est un float * , le sizeof(float) dans phie+iter*20*size*sizeof(float) est redondant et vous phie+iter*20*size*sizeof(float) de la mémoire valide.

Supprimez le sizeof(float ) ou changez-le en un index d’indexation plus clair: &(phie[iter * 20 * size])

Vous devez également supprimer tous les conversions de pointeurs, elles sont toutes redondantes et peuvent masquer des problèmes. Vous ne devriez lancer que lorsque vous savez que vous en avez besoin.

Concernant votre question supplémentaire: le paramètre recvbuf de MPI_Gather n’a d’importance que pour le processus racine. Par conséquent, seul l’ iter du processus racine compte. Néanmoins, étant donné que tous vos processus suivent la même boucle d’exécution de MPI_Gather et qu’ils ne peuvent pas se doubler, ils auront toujours le même iter lors des regroupements correspondants.