3

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

4

1 回答 1

0

关于这个问题的一些有趣的链接:

如果它对任何人有帮助,对我来说问题是我使用Csys2blacs_handle()了(C 包装器)然后blacs_gridinit_()是(Fortran 接口)。这看起来很傻,但你应该检查两次你没有混合它们。

用于调试目的的注释:对于 Fortran 接口,上下文整数类似于 MPI 通信器(非常大的整数),但对于 C 包装器,它是一个小整数 (0,1..)。

解决方案是替换blacs_gridinit_()Cblacs_gridinit().

于 2021-09-29T08:00:35.910 回答