mpi all_gatherv奇怪的行为?

时间:2020-06-26 14:18:19

标签: c++ mpi eigen boost-mpi

我正在尝试收集在不同进程上计算的2个矩阵,我正在使用mpi allgatherv函数来执行此操作,但结果感到惊讶。

在我正在研究的示例中,矩阵的形状为(20,80),我想将它们收集到一个形状为(40,80)的矩阵中;并将过程0计算出的矩阵存储在前20行中。

这里是我正在使用的代码示例(示例中nbRegimes为0):

boost::mpi::communicator world;
int  rank = world.rank();

std::vector< ArrayXXd> phiOutLoc(nbRegimes);

for (int iReg = 0; iReg < nbRegimes; ++iReg)
    phiOutLoc[iReg].resize(nScenarioCur * nDimension, nbPoints);
    
... computation and storage into phiOutLoc[iReg] ...
    
//gathering results
ArrayXXd storeGlob(nScenarios * nDimension, nbPoints);
for (int iReg = 0; iReg < nbRegimes; ++iReg)
{
    boost::mpi::all_gatherv<double>(world, phiOutLoc[iReg].data(), phiOutLoc[iReg].size(), storeGlob.data());   
}

例如,这是在进程0和进程1上计算的phiOutLoc [iReg]第一行的开头:

rank 0

0      -353509      -366699      -379888      -393077      -406267      -419456      -432646  ... 
rank 1

0      -399021      -413908      -428795      -443683      -458570      -473457      -488345  ...

这些行应分别存储在storeGlob的索引0行和索引20行中; 如果我正确理解all_gatherv函数的行为。

如何将storeGlob的索引0行变成这样:

storeGlob row 0:
 0      -366699      -393077      -419456     ...  0      -413908      -443683      -473457 

和storeGlob的索引20行:

storeGlob row 20:
-353509      -379888      -406267      -432646 ... -399021      -428795      -458570      -488345

storeGlob的索引0行由phiOutLoc [iReg]矩阵的第一行的偶数索引填充。 奇数索引存储在索引20行中。

我真不明白为什么要这样收集。

这种行为正常吗?有没有办法按照我想要的方式收集两个矩阵?

0 个答案:

没有答案