MPI_Gatherv 负计数错误

MPI_Gatherv Negative count error

我正在编写一个 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 是该数组的大小。 First printf 在所有 4 个进程上打印正确的值,但是 last 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

该片段暗示了一些关于 MPI_Gatherv() 语义的混淆。 rcountsdispl 是由 MPI_Gatherv() 以只读方式使用的输入参数。在调用 MPI_Gatherv() 之前,必须正确初始化这些数组。如果根等级不知道其他等级将发送多少数据,则必须手动添加一些额外的逻辑以检索此信息。 MPI_Gather() 可用于检索 rcounts,然后 displ 可从 rcounts.

构建