MPI Problem: 2D Array spaltenzyklisch auf Prozesse verteilen



  • Hi,

    ich häng da jetzt irgendwie seit ein paar Tagen dran fest und komm nur mühsam weiter, aber nicht mit dem gewünschten Ergebnis. Also ich befasse mich seit ein paar Wochen mit MPI und nachdem es anfangs recht gut und zügig lief, trete ich gerade auf der Stelle.
    Also ich hab ein 2D Array welches ich auf dem Root Prozess alloziere und initialisere. Dessen Spalten will ich jetzt zyklisch nach Spalten an die anderen Prozesse kommunizieren.
    Nach meinem jetzigen Wissenstand sollte sich MPI_Scatter dafür eignen und der abgeleitete Datentyp MPI_Type_vector, um die Spalten des Arrays zu senden. Das gelingt mir aber nur für die erste Spalte.
    Was ich aufjedenfall schaffe, ist es das alles zyklisch nach Zeilen zu machen.

    MPI_Type_vector(n/nr_proz,1,spalten,MPI_DOUBLE,&vector_mpi_t) ;
    
    intialisierung ub_mpi_t.....
    
    MPI_Scatter(&(A[0][0]),zeilen,ub_mpi_t,spalten_z,spalten,MPI_DOUBLE,0,MPI_COMM_WORLD) ;
    

    Ich weiß nicht, wo ich da die ganze Zeit ein Brett vorm Kopf habe oder ob das üebrhaupt der beste Ansatz ist. Hoffe auf ein paar Tipps. Danke



  • Das Problem kann ich lösen indem ich Scatter in eine Schleife einbinde, dass wiederum macht dann nur den abgeleiteten Datentypen überflüssig und führt zu dem Problem, dass alles nur klappt wenn die 2D Array dimensionen gleich der Prozessanzahl sind.
    Ich les mich die ganze Zeit tiefer in die Materie ein, aber eigentlich müsste doch scatter dafür ausreichen?! Die Spalten die auf die Prozesse versendet werden, würde ich in einem 2D Array mit entsprechender Dimension speichern.
    Die spalten zyklische Verteilung ist ja ein Spezialfall der blockzyklischen, aber einen Ansatz finde ich da nicht, weil ich ja keinen eigenen Kommunikator brauche, da alles Prozesse aus MPI_COMM_WORLD eh benötigt werden.
    Mein Code sieht so aus:

    //double* lokale_spalte 
    //lokale_spalte=(double*)malloc(sizeof(double)*m) ;
        double lokale_spalte[5] ;
    
         MPI_Type_vector(n/p,1,n,MPI_DOUBLE,&vector_mpi_t) ;
    
        types[0] = vector_mpi_t ;
        types[1] = MPI_UB ;
    
        displacements[0] = 0 ;
        displacements[1] = sizeof(double) ;
    
        block_lengths[0] = block_lengths[1] = 1 ;
    
        MPI_Type_struct(2,block_lengths,displacements,types,&ub_mpi_t);
        MPI_Type_commit(&ub_mpi_t) ;
    
    //     for(i=0;i<m;i++)
        MPI_Scatter(&(A[0[0]),1,ub_mpi_t,lokale_spalte,1,MPI_DOUBLE,0,MPI_COMM_WORLD) ;
    

    Ganz verstehen kann ich auch nicht, warum ich lokale_spalte nicht als pointer initialisieren kann und danach den Speicher allozieren kann. Liegt wohl daran das dann gleichzeitig alle Prozesse das machen und es zu Speicherzugriffsfehlern kommt!?

    Komm aus der Sackgasse nicht mehr raus 😞


Anmelden zum Antworten