我正在编写一个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
答案 0 :(得分:0)
该片段表明对MPI_Gatherv()
语义的一些混淆。
rcounts
和displ
是MPI_Gatherv()
只读使用的输入参数。必须在调用MPI_Gatherv()
之前正确初始化这些数组。如果根级别不知道其他级别将发送多少数据,则必须手动添加一些额外的逻辑以便检索此信息。 MPI_Gather()
可用于检索rcounts
,然后可以displ
构建rcounts
。