000
11.04.2008, 15:34 Uhr
Lackmeier123
|
Hallo Leute
Ich weiss zwar nicht ob ich hier im Linux Forum richtig bin, da ich mit Cygwin unter Windows xp arbeite, aber der Thread kann ja immer noch verschoben werden...
Mein Problem ist es eine Matrix welche im root Prozess erzeugt wird auf eine Anzahl p von Unterknoten incl root zu verteilen. Ich benutze dafür den Befehl MPI_Scatter der mpich2 Bibliothek.
Hier die relevanten Auszüge aus dem Programm:
C++: |
#include <string.h> #include <math.h> #include <iostream> #include "matrix.h" #undef SEEK_SET #undef SEEK_END #undef SEEK_CUR
#include <mpi.h>
using namespace std; class jacobi { public: int Parallel_jacobi(int max_it, double tol); double distance(double* x_old, double* x_new); void showLocalMatrix(); void output(); jacobi(int p); private: int me; /* Prozessornummer 0 <= me < p */ static const int GLOB_MAX = 3; /* Größe des LGS */ double** A; double** local_A; /* lokal vorhandener Block der zu lösenden Matrix = n_local X n*/ double* local_b; /* lokal vorhandener Teil des Lösungsvektors b */ int i_local, i_global; int n_local, it_num; double x_temp1[GLOB_MAX], local_x[GLOB_MAX]; double *x_old, /* x_new == x^k+1 */ *x_new, /* x_old == x^k */ *temp; }; jacobi::jacobi(int p) { n_local = GLOB_MAX / p; /* lokale Blockgröße */ x_new = (double *) malloc(GLOB_MAX * sizeof(double)); x_old = (double *) malloc(GLOB_MAX * sizeof(double)); temp = (double *) malloc(GLOB_MAX * sizeof(double)); MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &p); //matrix::matrixgen(0, 10, GLOB_MAX, GLOB_MAX, "long.dat"); local_A = matrix::matrixalloc(n_local, GLOB_MAX); if(me == 0) { A = matrix::matrixalloc(GLOB_MAX, GLOB_MAX); matrix::matrixread(A, 0, GLOB_MAX, GLOB_MAX, "long.dat }
MPI_Scatter(A, n_local * GLOB_MAX, MPI_DOUBLE, local_A, n_local * GLOB_MAX, MPI_DOUBLE, 0, MPI_COMM_WORLD); if(me == 0) { output(); showLocalMatrix(); } if(me == 1) { //output(); cout << "qay"<<endl; showLocalMatrix(); cout << "qwert"<<endl; } }
|
Die Funktionen matrix::matrixalloc und matrix::matrixread funktionieren da die Matrix A korrekt angelegt wird und gelesen, verändert usw. werden kann. Beim lesenden Zugriff auf local_A von einem der Prozesse ausser root also hier,
C++: |
if(me == 1) { showLocalMatrix(); }
|
wird auf der Konsole ausgegeben:
_cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
Muss wohl an dem MPI_Scatter liegen aber ich hab schon alles mögliche ausprobiert und komme hier echt nicht weiter gerade. Wäre sehr nett wenn mir da jemand helfen könnte.
Viele Grüße, Lackmeier Dieser Post wurde am 12.04.2008 um 09:52 Uhr von FloSoft editiert. |