我正在尝试使用多个MPI通信器的BLACS/Scalapack (C接口,英特尔MKL版本)进行一些测试:具体地说,我试图获得的是一组(一对一)对应于一组(不相交的) MPI通信器的BLACS上下文/网格。虽然我在使用单个“全局”通信器(MPI_COMM_WORLD)时没有问题,但在使用多个通信器的情况下我遇到了一些困难。我希望你能对下面的问题给我一些建议。
我对调用Cblacs_gridinit之后的BLACS上下文变量值更新有点困惑:让我们从与MPI_COMM_WORLD通信器相对应的“全局”上下文开始。我可以通过调用获得相应的BLACS上下文:
MPI_Comm globalCommunicator(MPI_COMM_WORLD);
MKL_INT globalContext(Csys2blacs_handle(globalCommunicator));并在其上创建一个网格
Cblacs_gridinit(&globalContext,
&c_blacsGridOrdering,
MKL_INT i_nTaskRow,
MKL_INT i_nTaskCol);例如,使用char c_blacsGridOrdering('R')。
本例中的globalContext值为0。
在我的代码中的某个点上,使用了6个MPI任务,一个对应于id为[0;3]的4个任务组的MPI通信器(localCommunicator)正在被创建:在这个点上,我想为这个“本地”通信器创建一个新的BLACS上下文(localContext),并在它上面创建一个本地网格。我可以用代码做到这一点
MKL_INT localContext(Csys2blacs_handle(localCommunicator));
Cblacs_gridinit(&localContext,
&c_blacsGridOrdering,
MKL_INT i_nTaskRowLocal,
MKL_INT i_nTaskColLocal);其中上述函数调用序列仅由包括在本地通信器中的任务来执行。
在调用Csys2blacs_handle之后,localContext值等于1(对于本地通信器的每个任务),但是它被修改并被随后的Cblacs_gridinit调用设置为0。
显然,这会在我的其余代码中导致一些问题,因为,例如,如果我试图通过调用Cblacs2sys_handle来检索与localContext对应的MPI通信器,我会得到一个对应于初始globalCommunicator的六任务通信器。
很可能我犯了一些非常愚蠢的错误(缺少对某些BLACS函数的调用??)或者我不清楚多个MPI通信器和BLACS上下文/网格之间的相互作用,但我找不到我的代码有什么问题。
你对上述问题有什么建议吗?非常感谢您的帮助!
更新1
我对我的问题进行了更新,这对找到解决方案或至少解释观察到的问题是有用的:如果我在一个任务网格上初始化第一个网格(利用全局上下文的网格),那么所描述的问题就不再存在,任务网格的大小使得所有可用的MPI任务都包括在内,例如使用MKL_INT i_nTaskRow(1)和MKL_INT i_nTaskCol(MPI_COMM_WORLD size)。这是BLACS预期的行为吗?再次感谢您的支持!
发布于 2021-09-29 08:00:36
关于这件事有几个有趣的链接:
如果它对任何人有帮助,对我来说,问题是我先使用了Csys2blacs_handle() (C包装器),然后使用了blacs_gridinit_() ( Fortran接口)。这看起来很愚蠢,但您应该检查两次,以确保您没有将它们混合在一起。
用于调试的备注:在Fortran接口中,上下文整数类似于MPI通信器(非常大的整数),但在C包装器中,它是一个小整数(0,1..)。
解决方案是用Cblacs_gridinit()替换blacs_gridinit_()。
https://stackoverflow.com/questions/22488233
复制相似问题