MPI_Gather 我可能会看到
MPI_Gather 2D array
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
个子矩阵,我试图将它们全部收集到根进程中,全局矩阵在其中等待它们。但是,它只会抛出一个错误,有什么想法吗?
我收到一个段错误:
BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
PID 29058 RUNNING AT linux16
EXIT CODE: 139
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 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);
变量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);
}
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
个子矩阵,我试图将它们全部收集到根进程中,全局矩阵在其中等待它们。但是,它只会抛出一个错误,有什么想法吗?
我收到一个段错误:
BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES PID 29058 RUNNING AT linux16 EXIT CODE: 139 YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 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);
变量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);
}