MPI_Gatherv否定次数错误

时间:2017-08-29 01:27:02

标签: c arrays mpi mpich

我正在编写一个MPI程序,我需要从每个进程到根进程收集一个数组。我正在使用MPI_Gatherv(因为数组可以有可变长度)函数来执行此操作,但是,我一直得到PMPI_Gatherv(455): Negative count异常。以下是执行此MPI_Gatherv调用的代码段。我没有发布完整的代码,因为它太大但我可以根据需要添加所需的代码部分。

double *errs;
int *rcounts, *displ;
printf("P:%d calling gather with count %d\n", p->rank, f->slice_size);
if (p->rank == 0) {
errs = (double*) malloc (sizeof(double) * NGRID);
rcounts = (int*) malloc (sizeof(int) * p->total); 
displ = (int*) malloc (sizeof(int) * p->total);

}
MPI_Gatherv(f->err, f->slice_size, MPI_DOUBLE,
    (void*) errs, rcounts, displ, 
    MPI_DOUBLE, 0, MPI_COMM_WORLD);
printf("P:%d done with gather\n", p->rank);

f->err表示我尝试发送的数组的数组,f->slice_size是该数组的大小。首先printf在所有4个进程上打印正确的值,但是在进程printf之外的所有进程上执行最后0

我得到以下异常

P:0 calling gather with count 250
P:1 calling gather with count 250
P:1 done with gather
P:2 calling gather with count 250
P:2 done with gather
P:3 calling gather with count 250
P:3 done with gather
    [cli_0]: aborting job:
    Fatal error in PMPI_Gatherv:
    Invalid count, error stack:
    PMPI_Gatherv(547): MPI_Gatherv failed(sbuf=0x2588290, scount=0, MPI_DOUBLE, rbuf=0x2588a70, rcnts=0x2548750, displs=0x2546d90, MPI_DOUBLE, root=0, MPI_COMM_WORLD) failed
    PMPI_Gatherv(455): Negative count, value is -1908728888

1 个答案:

答案 0 :(得分:0)

该片段表明对MPI_Gatherv()语义的一些混淆。 rcountsdisplMPI_Gatherv()只读使用的输入参数。必须在调用MPI_Gatherv()之前正确初始化这些数组。如果根级别不知道其他级别将发送多少数据,则必须手动添加一些额外的逻辑以便检索此信息。 MPI_Gather()可用于检索rcounts,然后可以displ构建rcounts

How to use MPI_Gatherv for collecting strings of diiferent length from different processor including master node?

已经提出了一个类似的问题并得到了雄辩的回答