【问题标题】:Sending 2D Int Array with MPI_Send and Recv使用 MPI_Send 和 Recv 发送 2D Int 数组
【发布时间】:2013-04-07 07:14:21
【问题描述】:

我正在尝试从从属进程向主进程发送一个任意长度的二维整数数组,但我不断收到分段错误。由于 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];
        }               
    }
}

【问题讨论】:

  • 究竟哪个操作会导致段错误?
  • 您的代码似乎有点复杂,例如,我们在这里看不到 xPixels 的来源。您是否尝试过将代码简化为只发送一个固定数组、接收它并尝试确保它被正确传输?发送/接收代码看起来合法。
  • 你确定X_RESN可以被processes - 1整除吗?
  • int xPixels = X_RESN / (进程 - 1);它是像素的“列宽”,用于为每个从处理器拆分它们。分辨率为 600x600,我将它们分成 15 个 40x600 的块。
  • 是 16 个进程,xPixels = 600 / (16-1)

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


【解决方案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];

发送/接收代码大概没问题。

【讨论】:

  • 我实现了这个改变,但不幸的是它仍然出现了段错误:/
  • 好的,得到了​​一些奇怪的结果...我用-np 2 运行它,它运行良好。当我尝试-np 3 or -np 4 时,我遇到了段错误。
  • 已修复。除了您已经发现的问题之外,我在发送数据之前对数据执行的操作还有另一个问题。我的 for 循环从 xPixels 而不是 0 开始,所以它出现了段错误。 (我忘记了,即使它正在计算像素的特定部分,该过程中的 idexz 也会从 0 到 xPixel,而不是从 xStart 到 xFinish)。感谢您的帮助,非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 2014-04-02
  • 2014-01-25
  • 2020-03-23
  • 2016-01-04
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多