我正在尝试使用 BLACS/Scalapack(C 接口,英特尔 MKL 版本)进行一些测试,使用多个 MPI 通信器:特别是,我想要获得的是一组对应于(一对一)的 BLACS 上下文/网格一组(不相交的)MPI 通信器。虽然我在使用单个“全局”通信MPI_COMM_WORLD
器(我希望你能给我一些关于以下问题的建议。
在调用 BLACS 上下文变量值更新后,我有点困惑Cblacs_gridinit
:让我们假设从与通信器对应的“全局”上下文开始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 任务的某个时刻,正在创建一个localCommunicator
对应于具有 id 的 4 个任务组的 MPI 通信器 () [0;3]
:此时我想为此创建一个新的 BLACS 上下文 ( localContext
) “本地”通信器和其上的本地网格。我可以用代码做到这一点
MKL_INT localContext(Csys2blacs_handle(localCommunicator));
Cblacs_gridinit(&localContext,
&c_blacsGridOrdering,
MKL_INT i_nTaskRowLocal,
MKL_INT i_nTaskColLocal);
其中上述函数调用序列仅由本地通信器中包含的任务执行。
localContext
在调用 之后,该值Csys2blacs_handle
等于 1(对于本地通信器的每个任务),但随后的调用将其修改并设置为 0 Cblacs_gridinit
。
显然,这会在我的其余代码中引起一些问题,因为例如,如果我尝试检索localContext
与调用对应的 MPI 通信器,Cblacs2sys_handle
我会得到一个与初始globalCommunicator
.
很可能我犯了一些非常愚蠢的错误(缺少对某些 BLACS 函数的调用??),或者我不清楚多个 MPI 通信器和 BLACS 上下文/网格之间的相互作用,但我找不到我的代码有什么问题。
您对上述问题有什么建议吗?非常感谢您的帮助!
更新 1
我的问题有一个更新,这可能有助于找到解决方案或至少解释观察到的问题:如果我在任务网格的大小使得所有可用的 MPI 任务都包括在内,例如MKL_INT i_nTaskRow(1)
和MKL_INT i_nTaskCol(MPI_COMM_WORLD size)
。BLACS 会出现这种行为吗?再次感谢您的支持!