具有长位移的mpi scatterv上的错误

时间:2012-05-13 01:21:32

标签: c mpi

我正在使用MPI_Scatterv来分散一个非常大的数组:

MPI_Scatterv(list, counts, displacements, MPI_LONG, pSubList, counts[rank], MPI_LONG, MASTER, MPI_COMM_WORLD);

并且我已经声明变量计数位移(int类型不够),但是,MPI_Scatterv只接受计数和位移的int变量。

我怎么能以某种方式解决这个问题?

3 个答案:

答案 0 :(得分:2)

你不能长期替换int,至少在大多数MPI 2.2实现中都不能。即使您按照Greg的建议创建了用户定义的数据类型,您也可能(并且通常会)遇到实现限制,例如使用整数来表示内部偏移。 MPI 3.0草案专门解决了这个问题,并要求在C和Fortran绑定中,offset和count参数都是长(64位)类型。

在MPI 3.0成为标准并且符合要求的实现出来之前,我会坚持使用一些子通信方案,例如将数据分布在几轮中,并将多个分散分配到等级的子集。

答案 1 :(得分:1)

为什么不分发你的分散,以便int类型就足够了?

您可以将MPI进程视为树的节点。并且让中间树节点具有它们自己的相应子树的散布/收集。

答案 2 :(得分:0)

您可以创建自定义MPI数据类型来表示LONG的块。然后,位移和计数将是该块大小的倍数。