2011-01-13 15 views
0

Ich habe einige Code in C++ geschrieben, die kompiliert und läuft gut (mit vernünftigen Ausgang), wenn g ++ verwenden, aber wenn ich versuche mpiC++ zu verwenden, erhalte ich einen Laufzeit Bus-Fehler. Ich habe herausgefunden, wo der Busfehler auftritt, aber nicht warum. Hier ist mein Code:Busfehler mit mpiC++, aber nicht mit g ++

one = (double *) malloc(sizeof(&one) * nx * nx * nt); 
two = (double **) malloc(sizeof(&two) * nx * nx); 
rho_exp = (double ***) malloc(sizeof(&rho_exp) * nx); 

for(i = 0; i < nx * nx; i++) 
    two[i] = &one[i * nt]; 

for(i = 0; i < nx; i++) 
    rho_exp[i] = &two[i * nx]; 

for(i = 0; i < nx; i++) 
    for(j = 0; j < nx; j++) 
     for(k = 0; k < nt; k++) 
      rho_exp[i][j][k] = 0; 

Der Busfehler tritt während der drei verschachtelten For-Schleifen auf. Meine Frage ist zweifach: Eins, nehme ich an, ich habe meine Zuordnung für die 3D-Matrix vermasselt; Wie hätte ich es tun sollen? Zweitens, warum hat das mit gcc und g ++ funktioniert, aber nicht mit mpiC++?

+0

Könnten Sie Ihren Code unter valgrind laufen. Das gibt Ihnen wahrscheinlich einen sehr guten Hinweis darauf, wo sich Ihr Fehler befindet. –

Antwort

4

Eine Sache, die herausspringt, ist, dass Sie sizeof(&foo) (Größe eines Zeigers zu foo) verwenden, wenn Sie wahrscheinlich sizeof(*foo) bedeuten (Größe der Sache, auf die foo zeigt).

Ich wette, was passiert ist, dass mpiC++ ist mit einem 32-Bit-Ziel kompiliert, wobei die Größe der Doppel 64 Bit und die Größe der Adressen ist 32 Bit. Das führt zu einem Konflikt und verursacht ein Problem. Ihr g ++ zielt wahrscheinlich auf ein 64-Bit-System ab, bei dem diese Größen gleich sind (beide 64 Bit).

EDIT:

Hier ist der Code, den Sie verwenden sollten:

double * one = new double[nx * nx * nt]; 
    double ** two = new double*[nx * nx]; 
    double ***rho_exp = new double**[nx]; 

Und ganz ehrlich, sind neu zu erfinden Sie das Rad. Sie sollten vom Hersteller bereitgestellten BLAS Bibliothek verwenden, die Operationen schnell Matrix optimiert für Ihre Plattform hat (wahrscheinlich mehrere hundert Mal schneller als das, was Sie schreiben, ...).

+0

Ich dachte, das könnte der Fall sein, aber wenn ich es in sizeof (* foo) ändere, funktioniert es nicht nur mit gcc und g ++, es funktioniert immer noch nicht mit mpiC++. – wolfPack88

+1

Gerade bearbeitet, um eine weitere Hypothese hinzuzufügen. – EmeryBerger

+0

Welche Leitung löst den Busfehler aus? –

1

Hier ist das allgemeine Verfahren zur dynamisch eine X x Y x Z Array Zuteilen:

double ***rho_exp = malloc(sizeof *rho_exp * X); 
if (rho_exp) 
{ 
    size_t i; 
    for (i = 0; i < X; i++) 
    { 
    rho_exp[i] = malloc(sizeof *rho_exp[i] * Y); 
    if (rho_exp[i]) 
    { 
     size_t j; 
     for (j = 0; j < Y; j++) 
     { 
     rho_exp[i][j] = malloc(sizeof *rho_exp[i][j] * Z); 
     if (rho_exp[i][j]) 
     { 
      size_t k; 
      for (k = 0; k < Z; k++) 
      { 
      rho_exp[i][j][k] = 0; 
      } 
     } 
     } 
    } 
    } 
} 

Es macht nichts, das ist C; Da Sie C++ verwenden, verwenden Sie new wie oben beschrieben.