【发布时间】: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