我正在尝试使用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获得?非常感谢您的支持!