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

时间:2014-03-18 18:41:32

标签: c mpi intel-mkl scalapack

我正在尝试使用BLACS / Scalapack(C接口,英特尔MKL版本)进行一些测试,使用多个MPI通信器:特别是,我想要获得的是一组BLACS上下文/网格对应(一对一)一)到一组(不相交的)MPI传播者。虽然我在使用单一"全球"沟通者(MPI_COMM_WORLD)我对多个沟通者案件有些困难。我希望你能就以下问题给我一些建议。

在调用Cblacs_gridinit后,我对BLACS上下文变量值更新感到有点困惑:让我们假设以" global"对应于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为localCommunicator的4个任务组相对应的MPI通信器([0;3]):此时我想为此创建一个新的BLACS上下文(localContext) #34;本地"沟通者和当地的网格。我可以用代码

来做到这一点
MKL_INT localContext(Csys2blacs_handle(localCommunicator));

Cblacs_gridinit(&localContext,
                &c_blacsGridOrdering,
                MKL_INT i_nTaskRowLocal,
                MKL_INT i_nTaskColLocal);

其中上述函数调用序列仅由本地通信器中包含的任务执行。

在调用localContext之后,Csys2blacs_handle值等于1(对于本地通信器的每个任务)但是它被修改并通过随后调用{{1}设置为0 }}。

显然这会导致我的其余代码出现一些问题,例如,如果我尝试通过调用Cblacs_gridinit来检索与localContext对应的MPI通信器,我会得到一个对应的六个任务通信器到最初的Cblacs2sys_handle

我很可能犯了一些非常愚蠢的错误(缺少对某些BLACS函数的调用?)或者我不清楚多个MPI通信器和BLACS上下文/网格之间的相互作用但是我找不到我的错误码。

您对上述问题有什么建议吗?非常感谢你的帮助!

///////// 更新1 /////////

我对我的问题进行了更新,这对于找到解决方案或至少解释观察到的问题非常有用:如果我初始化第一个网格(使用全局上下文的网格),则所描述的问题不再存在)在任务网格上,其大小使得包括所有可用的MPI任务,例如使用MKL_INT i_nTaskRow(1)和MKL_INT i_nTaskCol(MPI_COMM_WORLD大小)。这种行为是否可以从BLACS获得?非常感谢您的支持!

0 个答案:

没有答案