我正在尝试收集在不同进程上计算的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行中。
我真不明白为什么要这样收集。
这种行为正常吗?有没有办法按照我想要的方式收集两个矩阵?