1

我正在尝试从从进程向主进程发送一个任意长度的二维整数数组,但我不断收到分段错误。由于 MPI 很难调试,我不确定问题是否与发送/接收有关,但如果不是这样,那么它必须与我自己分配数组的方式有关。

我在这里关注了一个关于确保分配给数组的内存是连续的问题的问题,但这仍然没有解决分段错误。

以下是我的代码的一些部分:

创建数组:

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

1

这条线看起来很可疑:

pixels[j][k] = pixelChunk[j - (xPixels * i - 1)][k];

例如,假设我们有np = 2,所以我们只剩下一个块,然后

i = 1;
xStart = 0;
j = 0;
xPixels = 600;
pixelChunk[0 - (600 * 1 - 1)[k] == pixelChunk[-599][k]

看起来不太对,是吗?

这个?

pixels[j][k] = pixelChunk[j - xPixels * (i - 1)][k];

发送/接收代码可能没问题。

于 2013-04-15T08:50:21.557 回答