我正在尝试从从属进程向主服务器发送任意长度的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];
}
}
}
答案 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];
发送/接收代码可能正常。