2016-08-03 4 views
1

Ich habe eine Situation in einem MPI-Code, wo viele Prozesse viele Dateien lesen und ihre eigenen Domänen erstellen, indem sie verschiedene Daten aus verschiedenen Dateien bekommen. Die meisten Dateien werden von mehreren Prozessen gelesen. Die meisten Prozesse lesen aus mehreren Dateien. Ich versuche einen Weg zu finden, alle Prozesse aktiv zu halten. Ich dachte, ich könnte versuchen, Code zu schreiben, so dass jeder Prozess seine Liste von Dateien durchläuft (zur Laufzeit bestimmt, unmöglich vorher zu bestimmen), versuchen, mit MPI_File_open zu öffnen, wenn er sieht, dass seine aktuelle Datei bereits verwendet wird, mach weiter und probiere die nächste Datei aus. Dieser Zyklus würde fortgesetzt, bis alle Daten gelesen sind.MPI_File_open: Kann man aufgeben, wenn eine Datei gefunden wird?

Aber ist es möglich, MPI_File_open Verhalten auf diese Weise zu machen? Soweit ich sagen kann, wenn MPI_File_open sieht eine Datei bereits verwendet wird, wartet es nur, bis es es öffnen kann. Ich konnte nichts finden, was dieses Verhalten ändert.

Antwort

1

Es sieht so aus, als könnten Sie Informationen an mpi_file_open übergeben, um anzugeben, wie lange Sie warten sollen, bevor Sie zu einer neuen Datei wechseln. Dies scheint implementationsabhängig zu sein, aber von openmpi docs scheint der Hinweis shared_file_timeout gibt an, wie lange warten soll, wenn die Datei vor der Rückgabe MPI_ERR_TIMEDOUT gesperrt ist. So etwas könnte funktionieren (ich habe das nur getestet, wenn die Datei nicht gesperrt ist).

#include "mpi.h" 
#include <stdio.h> 
#include <sys/file.h> 

int main(int argc, char *argv[]) 
{ 
    MPI_Fint handleA, handleB; 
    int rc, ec, rank; 
    MPI_File fh; 
    MPI_Info info; 

    //int fd = open("temp", O_CREAT | O_RDWR, 0666); 
    //int result = flock(fd, LOCK_EX); 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN); 
    MPI_Info_create(&info); 
    MPI_Info_set(info, "shared_file_timeout", "10.0"); 
    ec = MPI_File_open(MPI_COMM_WORLD, "temp", MPI_MODE_RDONLY, info, &fh); 
    if (ec != MPI_SUCCESS) { 
     char estring[MPI_MAX_ERROR_STRING]; 
     int len; 
     MPI_Error_string(ec, error_string, &len); 
     fprintf(stderr, "%3d: %s\n", rank, error_string); 
    } else{ 
     fprintf(stderr, "%3d: %s\n", rank, "Success"); 
    } 
    MPI_File_close(&fh); 
    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL); 
    MPI_Finalize(); 
    return 0; 
} 

paar Noten, müssen Sie wahrscheinlich MPI_Errhandler, um die MPI_ERR_TIMEDOUT Fehler, um sicherzustellen, nicht zur Kündigung führen. Nicht sicher, wie man dieses portable über verschiedene Versionen von mpi macht, aber die standard scheint keine nützlichen Hinweise für diesen Fall anzugeben und überlässt es den Implementierern. Für mpich funktioniert das nicht und blockt einfach endlos (ich sehe in mpich keine Option zum Timeout). Nicht blockierende Datei öffnen wird in der advanced features of MPI-3 so wahrscheinlich nicht bald in Betracht gezogen.

Die andere Alternative besteht darin, einfach zu prüfen, ob die Datei in welcher Sprache auch immer gesperrt ist, und sie dann nur mit mpi zu öffnen, wenn sie nicht gesperrt ist.

+0

Endlich habe ich eine Ahnung, worum es bei MPI_Info geht. Danke für die Antwort! –

Verwandte Themen