MPI sende empfang problem



  • Hi,

    ich hab während meiner Projektarbeit nun viel gelernt, nur halt noch nicht genug, z.B. habe ich nicht gelernt warum dieser Quelltext hier nicht funktioniert.
    Kurze Info falls es notwendig ist sich von der Umgebung ein Bild zu machen in der entwickelt wird: MS VS 6.0 auf einem XP Servicepack 2 System Centrino Core 2 DUO | verwendete MPI version ist die "mpich.nt.1.2.1" von "Argonne National Lab"

    #include <mpi.h>
    #include <iostream.h>
    
    void main(int argc, char* argv[])
    {
    	int myid, numProcs;
    	MPI_Init(&argc,&argv);
    	MPI_Comm_size(MPI_COMM_WORLD,&numProcs);
    	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    
    	int anz;
    
    	if(myid == 0)
    	{
    		cout << "Menge: ";
    		cin >> anz;
    		cout << "\n";
    
    		MPI_Send(&anz,1,MPI_INT,1,0,MPI_COMM_WORLD);
    
    		double* wert = new double(anz);
    
    		wert[0] = 0.451;
    		for (int i = 1; i < anz; i++)
    		{
    			wert[i] = 1+ wert[i-1];
    			cout << "Master " << i+1 << " " << wert[i] << "\n";
    			cout.flush();
    		}
    
    		MPI_Ssend(wert,anz,MPI_DOUBLE,numProcs-1,0,MPI_COMM_WORLD);
    		delete(wert);
    	}
    	else
    	{
    		MPI_Status status;
    		MPI_Request request;
    		MPI_Recv(&anz,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
    
    		cout << "Slave " << anz << "\n";
    		cout.flush();
    
    		double* wert = new double(anz);
    
    		cout << "Slave " << anz << " OK\n";
    		cout.flush();
    
    		MPI_Recv(wert,anz,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
    
    		cout << "Slave empfang OK\n";
    		cout.flush();
    		for (int i = 0; i < anz; i++)
    		{
    			cout << "Slave " << i+1 << " " << wert[i] << "\n";
    			cout.flush();
    		}
    	}
    	if (MPI_SUCCESS == MPI_Finalize())
    	{
    		cout << "supi\n";
    	}
    	else
    	{
    		cout << "nope\n";
    	}
    }
    

    Das Problem das bei diesem Programm auftritt ist dass es ab und an vor oder nach dem MPI_Finalize abschmiert. Starten lasse ich es mit "mpirun MPI_ein.txt"
    In dieser .txt steht drin:

    exe testprog.exe
    hosts
    notekuh2 2

    Ich will doch ganz einfach nur ein double Array verschicken.

    Ich denke das hat etwas damit zu tun, dass ich kein MPI_Wait nutze und das unter Umständen der Buffer den ich versenden möchte plötzlich weg ist, aber ich weiß nicht, wie ich dieses MPI_Wait nutze.

    Ich suche schon mal weiter, aber wäre selbst redend für jede Hilfe dankbar.

    EDIT: Mitlererweile hab ich rausgefunden, das ich auf der Slave Seite noch nicht mal ein vernünftiges array anlegen kann.

    Der Code

    anz = 12;
    //              double* da = new double(anz);
    		double* da = (double*) malloc(anz);
    		for (int j = 0; j < anz; j++)
    		{
    			da[j] = j+0.125;
    			cout << "Slave pre" << da[j] << "\n";
    			cout.flush();
    		}
    

    macht schon keine korrekten Ausgaben. Egal ob mit malloc oder mit new.



  • entweder
    malloc(anz*sizeof double)
    oder
    new double[anz]



  • kann mir vieleicht jemand einen MPI debugger empfehlen oder mir erklären wie ich mit dem MS VS 6.0 ein MPI-Programm debugge.

    @ Nix Da danke ich bin ja auch so ..... unaufmerksam. Danke 🙂



  • ich würde dir raten die MPI-C++ Syntax zu verwenden, wenn du eh C++ verwendest. liest sich einfach schöner und man hat Objekte (das es sich dabei um einfache wrapper handelt kann dir egal sein). zudem solltest du auf ein neueres visual studio upgraden. Glaub die 2008er express edition supportet auch das mpi-debuggen. bei der prof version ist das jedenfalls der fall und es gibt von micrsofot ein tutorial pdf. ich selbst verwende MSVC 2008 + mpich2 und das debuggen klappt einwandfrei.
    http://www.microsoft.com/windowsserver2003/ccs/techresources/paralleldebug.mspx

    anstatt eines double* solltest du einfach einen std::vector<double> versenden (den musst du dann nicht per hand deallokieren)

    einfach

    send(&vec[0],...)
    


  • Hi,

    ich will schon seit einem Jahr auf ein neueres VS umsteigen, doch mein Cheff blokiert dieses vorhaben seit dem ich damit anfangen wollte. Er hat immer Angst das man dadurch Zeit verlieren würde. Mitlererweile hätten wir das ganze aber schon mehrfach raus.

    Egal das MPICH-Paket das wir nutzen unterstützt komischer Weise die C++ Syntax nicht. Ich hab die Vermutung das ich die Header falsch eingebunden habe (Oldschool mit .h) und darum kann ich die Syntax nicht nutzen. Das mit dem Vector hab ich zu spät bemerkt.

    Bin jetzt fertig mit meiner kleinen Programmieraufgabe.

    danke für die Hilfe.



  • Hallo liebe Gemeinde,

    ich hab nun ein zweites Programm geschrieben, eine MFC-Anwendung, mit dieser erstelle ich die MPI-Konfigurations-Datei und starte anschießend "mpirun" mit der Konfigurationsdatei als Parameter durch die Funktion "CreateProcess". Meine MPI Anwendung gibt regelmäßig Statusdaten auf der Konsole aus. Die Standard Ein- und Ausgaben habe ich nun ich meine MFC-Anwendung umgelenkt. Ich hab nun das Problem meine MPI Anwendung erstellt 3 Prozesse, im Taskmanager kann ich MPIrun und 3 mal meine Anwendung finden. wie bekomme ich nun alle 4 Prozesse beendet. Die Programme Arbeiten quasi in einer Endlosschleife. In der Konsole laufend konnte ich immer STRG-C drücken und dann stoppte das ganze Prozessgerüsst, also alle 4 Prozesse endenten dann.
    Ich hab nun schon probiert mit TerminateProcess die Prozesse zu stoppen, allerdings beendet die Funktion nur den MPIrun-Prozess. Die Anwendungsprozesse die von MPIrun gestartet werden werden nicht beendet.

    Kann mir da jemand helfen, ich meine mit dem Taskmgr kann man ja die Prozesse auf killen, da sollte das gleiche ja auch durch ein Programm möglich sein, oder?

    Besten dank im Voraus

    Christian


Log in to reply