c - MPI_Gather 二维数组

标签 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 子矩阵,我试图将它们全部收集到根进程中,全局矩阵在那里等待它们。但是,它只会抛出一个错误,有什么想法吗?

我收到一个段错误:

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);
//}

然后一切正常。但是全局矩阵不应该只存在于根进程中吗?


编辑_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);
}

关于c - MPI_Gather 二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536780/

相关文章:

java-8 - 添加 ArrayList 时的 stream() 与 parallelStream()

c - MPI_Gather 似乎不起作用

c - 如何使用并行计算机 (MPI) 进行矩阵乘法

c - 使用 main(int argc,char *argv[]) 时出现问题

c - Realloc 一直失败(在 C 中)

c - 未定义对 `sctp_get_no_strms' 的引用

r - 用于准确预测的数据集中的最小行数

ubuntu - CUDA 中的矩阵行列式

c++ - MPI 和 Valgrind 不显示行号

c - GSM PDU 解码算法行为异常