BLACS上下文值和多个MPI通信器

计算科学 线性代数 并行计算 mpi 英特尔-mkl 斯卡拉包
2021-12-03 08:21:50

我在这里重新发布一个以前在 stackoverflow 中提出的问题:正如我在回答我的问题时所建议的那样,scicomp 可能是为我的问题获取一些有用的评论/建议的更好地方。

我正在尝试使用 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 会出现这种行为吗?再次感谢您的支持!

0个回答
没有发现任何回复~