Ich versuche, MPI C-Code zu schreiben, der wiederholt eine Berechnung durchführt und sein Ergebnis in einem einzelnen Array speichert, um weniger häufig auszugeben. Beispielcode unten (die Größe von var, 200, ist ausreichend für die Anzahl der verwendeten CPUs):Assertionsfehler unter Verwendung von 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;
}
Es mir Speicherzuordnungsprobleme wiederholt gibt, bis es schließlich beendet. Ich habe keine Erfahrung mit Speicherzuweisung in MPI - können Sie helfen?
Vielen Dank, Marta
Können Sie die genaue Art Ihrer "wiederholten Speicherzuweisungsprobleme" beschreiben? Erhalten Sie nicht genügend Speicher zugewiesen? Erhalten Sie einen SIGSEGV für illegalen Speicherzugriff? Hast du ein Doppeltes frei? –
Hier ist es: MPT FEHLER: Rang: 1, Funktion: MPI_GATHER, Nachricht beim Empfang abgeschnitten: Ein Anwendungsfehler verursachte den Absender zu viele Daten senden MPT FEHLER: Rang 1 (g: 1) wird mit Fehlercode 0 abgebrochen. \t Prozess-ID: 580144, Host: sgiuv, Programm:/home/MV12/Code/Fibrosisnew/example \t MPT Version: SGI MPT 2.15 11/13/16 02.05.30 MPT: ----- --- stack traceback ------- MPT: Zum Programm hinzufügen:/proc/580144/exe, Prozess 580144 – Marta
Mögliches Duplikat von [Adressierungsspeicher in MPI \ _Gather C] (http://stackoverflow.com/ Fragen/41985758/Adressierung-Speicher-in-MPI-Sammeln-c) Bitte öffnen Sie nicht mehrere Fragen zum gleichen Problem. – Zulan