Senden 2D-Int-Array mit MPI_Send und Recv
Ich bin versucht, senden Sie eine 2D-integer-Arrays beliebiger Länge von slave-Prozessen master, aber ich bekomme immer ein "segmentation fault". Als MPI ist ziemlich schwierig zu Debuggen, ich bin nicht sicher, dass das Problem hat zu tun mit den send/recv, aber wenn es nicht, dann wird es mit der Art und Weise bin ich für die Zuweisung der arrays selbst.
Folgte ich einer früheren Frage hier in Bezug auf die Gewährleistung, dass der Speicher für das array zusammenhängender, aber noch nicht fix das "segmentation fault".
Unten sind einige Teile in meinem code:
Array erstellen:
int** create2DArray(int sizeX, int sizeY)
{
int* data = (int *) malloc(sizeX * sizeY * sizeof(int));
int** array= (int **) malloc(sizeX * sizeof(int*));
int i;
for (i=0; i<sizeX; i++)
{
array[i] = &(data[sizeY * i]);
}
return array;
}
Initialisieren von arrays:
if(rank==0)
{
display = x11setup(&win, &gc, width, height);
pixels = create2DArray(X_RESN, Y_RESN);
}
else
{
xStart = xPixels * (rank - 1);
xFinish = xStart + xPixels;
pixels = create2DArray(xPixels, Y_RESN);
}
Senden:
MPI_Send(&pixels[0][0], xPixels * Y_RESN, MPI_INT, 0, type, MPI_COMM_WORLD);
Recv:
for(i = 1; i < processes; i++)
{
int** pixelChunk = create2DArray(xPixels, Y_RESN);
MPI_Recv(&pixelChunk[0][0], xPixels * Y_RESN, MPI_INT, i, type, MPI_COMM_WORLD, &status);
int xStart = xPixels * (i - 1);
int xFinish = xStart + xPixels;
int k;
for(j = xStart; j < xFinish; j++)
{
for(k = 0; k < Y_RESN; k++)
{
pixels[j][k] = pixelChunk[j - (xPixels * i - 1)][k];
}
}
}
Welcher Vorgang genau Ergebnis in einem segfault?
Dein code scheint ein wenig Komplex, d.h. Wir sehen nicht hier, wo
Sind Sie sicher, dass
int xPixels = X_RESN / (Prozesse - 1); Es ist der "Spaltenbreite" der Pixel verwendet, um Sie zu Spalten, bis für jeden slave-Prozessor. Die Auflösung beträgt 600x600 und ich bin zu splitten in 15 block 40x600.
Ja 16 Prozesse, xPixels = 600 / (16-1)
Dein code scheint ein wenig Komplex, d.h. Wir sehen nicht hier, wo
xPixels
kommen aus zum Beispiel. Haben Sie versucht, die Vereinfachung der code zum senden eines festen Arrays, empfangen es und versuchen, um sicherzustellen, dass es korrekt übertragen wird? Die senden/empfangen-code legit aussieht.Sind Sie sicher, dass
X_RESN
ist teilbar durch processes - 1
?int xPixels = X_RESN / (Prozesse - 1); Es ist der "Spaltenbreite" der Pixel verwendet, um Sie zu Spalten, bis für jeden slave-Prozessor. Die Auflösung beträgt 600x600 und ich bin zu splitten in 15 block 40x600.
Ja 16 Prozesse, xPixels = 600 / (16-1)
InformationsquelleAutor Jarrod Cabalzar | 2013-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Zeile sieht verdächtig aus:
Zum Beispiel, sagen wir, wir haben
np = 2
, so dass wir Links mit einem einzigen chunk, dannNicht richtig Aussehen, nicht wahr?
?
Den send - /recv-code ist in Ordnung wahrscheinlich.
Okay, habe ein paar seltsame Ergebnisse...ich habe es mit
-np 2
und es funktionierte perfekt. Als ich versuchte-np 3 or -np 4
ich habe den seg fault.Fixiert es. Abgesehen von den Fragen, die Sie bereits gefunden, ich hatte ein anderes problem mit den Aktionen war ich die Ausführung auf die Daten, bevor ich es sende. Ich hatte die for-Schleife ab xPixels statt 0, damit es seg fehlerhaften. (Ich wurde vergessen, obwohl es in der Berechnung einen bestimmten Abschnitt der Pixel, der idexz auf, der Prozess geht von 0 bis xPixel, anstatt xStart, xFinish). Danke für Eure Hilfe, es wird sehr geschätzt 🙂
InformationsquelleAutor unkulunkulu