Я пытаюсь написать код MPI C, который многократно выполняет вычисления и сохраняет его результат в один массив для вывода менее часто. Пример кода ниже (размер вар, 200, достаточно для числа процессоров в использовании):Ошибка утверждения при использовании MPI_Gather
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv){
float *phie, *phitemp, var[200];
int time=0, gatherphi=10, gatherfile = 200, j, iter=0, lephie, x;
int nelecrank = 2, size, rank, Tmax = 2000;
FILE *out;
MPI_Init(&argc, &argv) ;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
lephie = gatherfile/gatherphi; // number of runs of calculation before output
// allocate memory
//printf("%d Before malloc.\n", rank);
if (rank==1) phie=(float *) malloc(nelecrank*size*gatherfile/gatherphi*sizeof(float));
phitemp=(float *) malloc(nelecrank*sizeof(float));
//printf("%d After malloc.\n", rank);
for(j=0;j<200;j++) var[j]=rank;
for(time=0;time<Tmax;time++){
if (!time%gatherphi) {// do calculation
for (j=0;j<nelecrank;j++) { // each processor does the calculation nelecrank times
phitemp[j]=0;
for (x = 0; x<=4; x++) {
phitemp[j]=phitemp[j]+var[rank+j*size];
}
}
} // end of j for loop
printf("iter: %d, %d Before MPI_Gather.\n", iter, rank);
MPI_Gather(phitemp, nelecrank, MPI_FLOAT, phie+iter*nelecrank*size*sizeof(float), nelecrank, MPI_FLOAT, 1, MPI_COMM_WORLD);
iter++;
} // end of gatherphi condition
if (time % gatherfile) { //output result of calculation
iter=0;
if (rank==1) {
out = fopen ("output.txt", "wt+");
if (out == NULL) {
printf("Could not open output file.\n");
exit(1);
}
else printf("Have opened output file.\n");
for (j=0;j<nelecrank*size*lephie;j++) {
fprintf(out,"%f ",*(phie+j*sizeof(float)));
}
fclose(out);
}
} // end of file output
if (rank==1) {
if (phie) free (phie);
}
if (phitemp) free (phitemp);
MPI_Finalize();
return 0;
}
Это дает мне повторил проблемы распределения памяти, пока, наконец, не выйдет. У меня нет опыта использования памяти в MPI - можете ли вы помочь?
Большое спасибо, Марта
Можете ли вы описать точный характер ваших «проблем с распределением памяти»? Не хватает ли выделенной памяти? Вы получаете SIGSEGV для незаконного доступа к памяти? Вы получаете двойную бесплатную? –
Вот он: MPT ERROR: rank: 1, function: MPI_GATHER, сообщение усечено при приеме: ошибка приложения заставила отправителя отправлять слишком много данных MPT ERROR: Ранг 1 (g: 1) прерывается с кодом ошибки 0. \t Process ID: 580144, Ведущий: sgiuv, Программа:/Главная/MV12/Код/Fibrosisnew/пример \t MPT Версия: SGI MPT 2,15 11/13/16 2:05:30 MPT: ----- --- трассировка стека ------- MPT: Присоединение к программе:/proc/580144/exe, процесс 580144 – Marta
Возможный дубликат [Адресация памяти в MPI \ _Gather C] (http://stackoverflow.com/ вопросы/41985758/address-memory-in-mpi-gather-c) Не открывайте несколько вопросов по одной и той же проблеме. – Zulan