1

任意の長さの 2D 整数配列をスレーブ プロセスからマスターに送信しようとしていますが、セグメンテーション エラーが発生し続けます。MPI はデバッグが非常に難しいため、send/recv に問題があるかどうかはわかりませんが、そうでない場合は、配列自体を割り当てる方法に関係している必要があります。

配列に割り当てられたメモリが連続していることを確認することに関して、ここで前の質問に従いましたが、それでもセグメンテーション違反は修正されませんでした。

以下は私のコードのいくつかのセクションです:

配列を作成:

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

配列を初期化します。

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);
} 

送信:

MPI_Send(&pixels[0][0], xPixels * Y_RESN, MPI_INT, 0, type, MPI_COMM_WORLD);

受信:

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];
        }               
    }
}
4

1 に答える 1