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.