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 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

Schreibe einen Kommentar