tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
260
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mag1000 mag1000 ist offline Mitglied
    Registriert seit
    May 2011
    Beiträge
    17
    Hallo,

    Die MPI-Routinen eines vorhandenen Programmes will ich verbessern.
    Dabei soll der Buffer, der vorher fest angegeben wurde, nun dynamisch sein:

    Das ist der alte I/O-Code, der funktioniert:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    double dummyArray[64][64];
    pnt_config->MPI_MyOffset = 0;
    MPI_File_set_view(pnt_config->MPI_MyFile, pnt_config->MPI_MyOffset, pnt_config->MPI_MyDatatype, pnt_config->MPI_MySubArray, "native", MPI_INFO_NULL);
    MPI_File_read_all(pnt_config->MPI_MyFile,&dummyArray,pnt_config->MPI_intArray_Subsize[0]*pnt_config->MPI_intArray_Subsize[1],pnt_config->MPI_MyDatatype,&pnt_config->MPI_MyStatus);
    for (k=pnt_config->int_kStartReal; k <= pnt_config->int_kEndReal; k++)
    {
                    for (j=pnt_config->int_jStartReal; j <= pnt_config->int_jEndReal; j++)
                    {
                                   for (i=pnt_config->int_iStartReal; i <= pnt_config->int_iEndReal; i++)
                                   {
                                                   pnt_mesh->x[i][j][k]=dummyArray[i-(pnt_config->int_iStartReal)][j-(pnt_config->int_jStartReal)];
                                   }
                    }
    }
    Der Nachteil des Codes bestelt nun darin, dass man wissen muss, dass die Datei 64*64 Werte einzulesen hat.
    Also wollte ich das anpassen mit dynamischer Speicherverwaltung:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    double ** dummyArray;
    dummyArray = (double **)malloc(int_iMeshPoints * sizeof(double *));
    for (i=0; i < int_iMeshPoints; i++)
    {
                    dummyArray[i] = (double *)malloc(int_jMeshPoints * sizeof(double));
    }
    pnt_config->MPI_MyOffset = 0;
    MPI_File_set_view(pnt_config->MPI_MyFile, pnt_config->MPI_MyOffset, pnt_config->MPI_MyDatatype, pnt_config->MPI_MySubArray, "native", MPI_INFO_NULL);
    MPI_File_read_all(pnt_config->MPI_MyFile,dummyArray,pnt_config->MPI_intArray_Subsize[0]*pnt_config->MPI_intArray_Subsize[1],pnt_config->MPI_MyDatatype,&pnt_config->MPI_MyStatus);
    for (k=pnt_config->int_kStartReal; k <= pnt_config->int_kEndReal; k++)
    {
                    for (j=pnt_config->int_jStartReal; j <= pnt_config->int_jEndReal; j++)
                    {
                                   for (i=pnt_config->int_iStartReal; i <= pnt_config->int_iEndReal; i++)
                                   {
                                                   pnt_mesh->x[i][j][k]=dummyArray[i-(pnt_config->int_iStartReal)][j-(pnt_config->int_jStartReal)];
                                   }
                    }
    }
    Der neue Code funktioniert nicht.
    Jemand eine Idee?

    Gruß
    mag
    Geändert von mag1000 (26.08.11 um 11:27 Uhr)
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Wenn du genau sagst, was nicht funktioniert, könnte man schneller/gezielter helfen.
    Compilerfehler? Absturz des Programms (mit Fehlermeldung)? Aufhängen? ...?
     

  3. #3
    mag1000 mag1000 ist offline Mitglied
    Registriert seit
    May 2011
    Beiträge
    17
    Natürlich, Entschuldigung!
    Also das Programm stürzt ab und folgender Fehler wird ausgegeben:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    [pc60:27832] *** Process received signal ***
     
    [pc60:27832] Signal: Segmentation fault (11)
     
    [pc60:27832] Signal code:  (128)
     
    [pc60:27832] Failing at address: (nil)
     
    [pc60:27832] [ 0] /lib64/libpthread.so.0(+0xf2e0) [0x7f9fb3ce82e0]
     
    [pc60:27832] [ 1] /work/eclipse/saiWENOS/Debug/saiWENOS(MeshImport+0x237) [0x41aa6b]
     
    [pc60:27832] [ 2] /work/eclipse/saiWENOS/Debug/saiWENOS(main+0x20a) [0x41cbca]
     
    [pc60:27832] [ 3] /lib64/libc.so.6(__libc_start_main+0xfd) [0x7f9fb3997b7d]
     
    [pc60:27832] [ 4] /work/eclipse/saiWENOS/Debug/saiWENOS() [0x402239]
     
    [pc60:27832] *** End of error message ***
     
    --------------------------------------------------------------------------
     
    mpirun noticed that process rank 2 with PID 27832 on node pc60 exited on signal 11 (Segmentation fault).
     
    --------------------------------------------------------------------------

    für die anderen MPI-Prozesse erhalte ich die gleichen Fehler.
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Versuch's mal so:
    Code c:
    1
    
    double *dummyArray = calloc(int_iMeshPoints * int_jMeshPoints, sizeof(double));
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    mag1000 mag1000 ist offline Mitglied
    Registriert seit
    May 2011
    Beiträge
    17
    Wie kann ich denn dann auf die Daten zugreifen. Dabei handelt es sich ja dann um einen 1dimensionalen Array.
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Code cpp:
    1
    
    array[x][y]
    wird zu
    Code cpp:
    1
    
    array[x*int_jMeshPoints + y]

    Das Problem am Ganzen war, das du zuerst kein zweidim. Array gemacht hast, sondern ein Pointerarray, bei dem jeder Pointer wieder auf ein Array zeigt.
    Das ist ein Unterschied.

    Und ein zweidim. Array, bei dem "Länge" und "Breite" beide variabel sind...
    ist so, mit dem "Umweg" über eindim., am einfachsten.

    Gruß

    PS: free nicht vergessen!
    Geändert von sheel (26.08.11 um 13:30 Uhr)
     

  7. #7
    mag1000 mag1000 ist offline Mitglied
    Registriert seit
    May 2011
    Beiträge
    17
    Cool,
    damit funktioniert es tatsächlich =).
    Damit kann ich dann auch die MPI-SendRec Befehle realisieren.
    Die MPI-Kommunikation wird bei mir sehr oft durchgeführt. Kennst du dich etwas mit Performance aus und könntest mir sagen, ob es schneller ist, wenn ich einmal eine Buffer anlege, den ich immer wieder verwende, oder ob ich auch vor jedem MPI-SendRec den Buffer neu anlegen und dann wieder freigeben kann? Das wäre nämlich deutlich schneller umzusetzen.

    Gruß
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Ändert sich die Größe des Buffers jedesmal?

    Wenn nicht: Wiederverwenden ist auf jeden Fall besser für die Geschwindigkeit. Nicht immer neu anlegen.

    Wenn schon: Nur dann einen neuen anlegen (und den alten weg), wenn der Alte zu klein ist.
    Solange nur gleich viel oder weniger Größe gebraucht wird, den aktuellen weiterverwenden.

    Gruß
     

  9. #9
    mag1000 mag1000 ist offline Mitglied
    Registriert seit
    May 2011
    Beiträge
    17
    Ja die Größe ändert sich.
    Dann nehme ich wohl am besten immer denselben.
     

  10. #10
    mag1000 mag1000 ist offline Mitglied
    Registriert seit
    May 2011
    Beiträge
    17
    Dann vielen Dank für die schnelle Hilfe!
     

Ähnliche Themen

  1. session_start() macht Probleme
    Von cinema im Forum PHP
    Antworten: 3
    Letzter Beitrag: 28.04.11, 08:44
  2. HL2 macht Probleme
    Von Alexander12 im Forum Microsoft Windows
    Antworten: 3
    Letzter Beitrag: 10.11.05, 15:09
  3. Cinema macht probleme
    Von PhoenixEN im Forum Cinema 4D
    Antworten: 9
    Letzter Beitrag: 01.03.05, 17:30
  4. hp psc 750 macht probleme!
    Von psycho_matic im Forum Hardware
    Antworten: 2
    Letzter Beitrag: 25.07.04, 02:01
  5. Maus macht probleme
    Von KennyMcCormick im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 18.09.03, 20:31

Stichworte