MPI_Gather 2D数组

时间:2015-12-30 20:29:30

标签: c parallel-processing mpi send distributed-computing

N为4,N_glob也是如此。它恰好是相同的大小。 p是4。

以下是代码的一小部分:

float **global_grid;
float **gridPtr; 
lengthSubN = N/pSqrt;
subN = lengthSubN + 2;
grid = allocate2D(grid, subN, subN);
..
MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType);
MPI_Type_commit(&rowType);
..
gridPtr = grid;
..
MPI_Barrier(MPI_COMM_WORLD);
if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Gather(&(gridPtr[0][0]), 1, rowType,
           &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(id == 0)
    print(global_grid, N_glob, N_glob);

我有p个子矩阵,我试图将它们全部收集在根进程中,全局矩阵在那里等待它们。但是,它会抛出一个错误,任何想法?

我收到了一个段错:

  

不良终止您的申请流程之一   PID 29058在linux16上运行   退出代码:139   您的应用程序终止于退出键:分段错误(信号11)

编辑:

我发现了这个问题MPI_Gather segmentation fault,我将global_grid初始化为NULL,但没有运气。但是,如果我这样做:

//if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
//}
然后一切正常。但是,全局矩阵不应只存在于根过程中吗?

EDIT_2:

如果我这样做:

if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
} else {
    global_grid = NULL;
}

然后它会崩溃:

MPI_Gather(&gridPtr[0][0], 1, rowType,
                global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);

1 个答案:

答案 0 :(得分:3)

变量global_grid未在排名0以外的等级中初始化。因此,此等式

&(global_grid[0][0])

或者这个:

global_grid[0]

会导致分段错误,因为它会尝试访问global_grid的第一个元素。

只需拨打MPI_Gather两次,一次为0级,另一次为其他:

if(id == 0) {
    MPI_Gather(gridPtr[0], 1, rowType, global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);
} else {
    MPI_Gather(gridPtr[0], 1, rowType, NULL, 0, rowType, 0, MPI_COMM_WORLD);
}