2017-02-01 6 views
0

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

+0

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? –

+0

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

+0

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

Antwort

0

Grundsätzlich ist phie nicht groß genug.

Sie malloc ed nelecrank*size*gatherfile/gatherphi*sizeof(float)=80*sizeof(float) Speicher für phie.

Aber Ihre MPI_Gather Verwendung erfordert iter*nelecrank*size*sizeof(float)+nelecrank*size*sizeof(float) Speicher. iter braucht einen maximalen Wert von nelecrank*Tmax-1, also phie muss (nelecrank*Tmax-1)*nelecrank*size*sizeof(float)+nelecrank*size*sizeof(float) sein, was um 8000*size*sizeof(float) groß ist.

Vielleicht möchten Sie iter=0 in Ihrer Schleife irgendwo zurücksetzen?