我正在使用MPI_Scatterv来分散一个非常大的数组:
MPI_Scatterv(list, counts, displacements, MPI_LONG, pSubList, counts[rank], MPI_LONG, MASTER, MPI_COMM_WORLD);
并且我已经声明变量计数和位移(int类型不够),但是,MPI_Scatterv只接受计数和位移的int变量。
我怎么能以某种方式解决这个问题?
答案 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的块。然后,位移和计数将是该块大小的倍数。