我正在编写一个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
最佳答案
该片段暗示了对MPI_Gatherv()
语义的一些困惑。rcounts
和displ
是MPI_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?上雄辩地回答了