ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
260
260
EMPFEHLEN
-
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:
Der Nachteil des Codes bestelt nun darin, dass man wissen muss, dass die Datei 64*64 Werte einzulesen hat.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)]; } } }
Also wollte ich das anpassen mit dynamischer Speicherverwaltung:
Der neue Code funktioniert nicht.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)]; } } }
Jemand eine Idee?
Gruß
magGeändert von mag1000 (26.08.11 um 11:27 Uhr)
-
Hi
Wenn du genau sagst, was nicht funktioniert, könnte man schneller/gezielter helfen.
Compilerfehler? Absturz des Programms (mit Fehlermeldung)? Aufhängen? ...?
-
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.
-
26.08.11 12:28 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Versuch's mal so:
GrußCode c:1
double *dummyArray = calloc(int_iMeshPoints * int_jMeshPoints, sizeof(double));
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Wie kann ich denn dann auf die Daten zugreifen. Dabei handelt es sich ja dann um einen 1dimensionalen Array.
-
wird zuCode cpp:
1
array[x][y]
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)
-
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ß
-
Ä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ß
-
Ja die Größe ändert sich.
Dann nehme ich wohl am besten immer denselben.
-
Dann vielen Dank für die schnelle Hilfe!
Ähnliche Themen
-
session_start() macht Probleme
Von cinema im Forum PHPAntworten: 3Letzter Beitrag: 28.04.11, 08:44 -
HL2 macht Probleme
Von Alexander12 im Forum Microsoft WindowsAntworten: 3Letzter Beitrag: 10.11.05, 15:09 -
Cinema macht probleme
Von PhoenixEN im Forum Cinema 4DAntworten: 9Letzter Beitrag: 01.03.05, 17:30 -
hp psc 750 macht probleme!
Von psycho_matic im Forum HardwareAntworten: 2Letzter Beitrag: 25.07.04, 02:01 -
Maus macht probleme
Von KennyMcCormick im Forum Cinema 4DAntworten: 2Letzter Beitrag: 18.09.03, 20:31





Zitieren

Login






