2016-11-13 2 views
0

Ich entwickle ein Programm, um die Gleichung Ax = B mit Gaussian Elimination zu lösen. Ich habe eine Datei, in der ich eine Matrix vom Typ double gespeichert habe (Reihe größere Reihenfolge seit C). Ich versuche, die Datei parallel zu lesen, indem ich die parallelen Datei-I/O-Funktionen von MPI verwende.Paralleles Lesen einer nxn-Matrix in einer Datei gespeichert

Ich habe etwas Verständnis von MPI_File_set_view und wie es die freigegebene Datei logisch partitioniert, so dass jeder Prozess eine andere Ansicht der Datei hat. Ich habe auch verstanden, dass eine Ansicht aus einer etype, einer filetype und einer Verschiebung bestehen muss. Jetzt in meinem Fall, ich habe eine zyklische Reihe Verteilung haben und dafür habe ich den folgenden Code bekam:

int count, blksize, stride,lb,extent; 
    MPI_File fh; 
    MPI_Offset of; 
    /* Define types for etype, ftype 
     etype: Type of data stored in the file. 
     ftype: Description of HOW the data is stored in the file. 
     */ 
    MPI_Datatype etype, ftype,mpi_vect; 
    /* etype: 

    */ 
    count = (n + (size -1))/size; blksize = n; 
    stride = size; 
    lb = 0; extent = n*sizeof(double); 
    MPI_Type_vector(count,blksize,stride,MPI_DOUBLE,&mpi_vect); 
    MPI_Type_create_resized(mpi_vect,lb,extent,&etype); 
    MPI_Type_commit(&etype);  

    /* ftype: Describes the logical division of file. 
     A strided vector of blocksize 1 and count n/size. 
     Stride is size 
    */ 
    MPI_Type_vector(count,1,stride, MPI_DOUBLE, &ftype); 
    MPI_Type_commit(&ftype); 
    MPI_File_open(MPI_COMM_WORLD,filename,MPI_MODE_RDONLY,MPI_INFO_NULL,&fh); 
    MPI_File_set_view(fh,0,etype,ftype,native,MPI_INFO_NULL); 
    /* Assume buf is allocated as an mpi_vector with blocksize equal to row size and stride equal to number of processors */ 
    MPI_File_read(fh,buf,count,mpi_vec,MPI_STATUS_IGNORE); 

Meine Frage ist, wie kann ich die richtige etype entscheiden und FTYPE? Jede Hilfe wäre willkommen.

Danke.

Antwort

0

etype und ftype immer noch stolpern und ich arbeite seit 15 Jahren mit MPI-IO. Das Konzept ist nicht so schwer, aber aus irgendeinem Grund bleibt die Namenskonvention nicht bei mir.

Die etype oder "Elementartyp" legt die grundlegende Einheit für verschiedene Zählungen fest. Wenn Sie MPI_File_read_at_all aufrufen und einen Offset angeben, ist dieser Offset eine Zahl von etype. Keine Bytes.

Es gibt zwei Möglichkeiten, eine bestimmte Region einer Datei zu lesen: Sie können die Dateiansicht für jeden Prozess anpassen, um an der gewünschten Stelle zu beginnen, oder Sie können die expliziten Offset-Routinen verwenden (z. B. MPI_File_read_at_all). Wenn Sie für jeden Prozess eine Dateiansicht erstellen, müssen Sie sich möglicherweise nicht einmal Gedanken über den Typ machen: Setzen Sie ihn auf MPI_BYTE.

+0

kann ich zustimmen. Ich habe mich entschieden, wieder auf traditionelle I/O zu wechseln. –

+0

das war nicht der Punkt, den ich versuchte zu machen! Du bist ziemlich nah dran. Möchten Sie, dass jeder Prozessor eine Zeile der Matrix liest? –

+0

Es ist ein anderes Szenario, ich möchte, dass die Prozesse die Matrix in einem Block zyklisch lesen. Praktischerweise ist es in der Reihenfolge der Reihenfolge, dass ich möchte, dass sie auf –