MPI_Gather 2D数组

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分段错误 ,我将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); 

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

 &(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); }