使用MPI_Send和Recv发送2D Int数组

时间:2013-04-15 08:23:52

标签: c int mpi multidimensional-array multiple-processes

我正在尝试从从属进程向主服务器发送任意长度的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);

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

1 个答案:

答案 0 :(得分: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];

发送/接收代码可能正常。