在遗留代码库中,mpi
应用程序的排名存储在结构中。每当检查排名时,都会从此结构中读取排名,而不是调用MPI_Comm_rank
。
我发现这种方法存在一些问题,即:
MPI_Comm_rank
需要同步。如果struct和MPI_Comm_rank
不包含相同的rank值,则会发生错误。因此,我喜欢摆脱它。
我的问题是,如果这种方法可以提高性能吗?有没有人经历MPI_Comm_rank
的调用与从结构中读取值相比多长时间?
我尝试使用google benchmark
,但两者都很快,我无法区分。
答案 0 :(得分:2)
让我们分析MPI_Comm_rank
函数:
这是代码(取自this来源):
int MPI_Comm_rank(MPI_Comm comm, int *rank)
{
MEMCHECKER(
memchecker_comm(comm);
);
OPAL_CR_NOOP_PROGRESS();
if ( MPI_PARAM_CHECK ) {
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
if (ompi_comm_invalid (comm))
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
if ( NULL == rank )
return OMPI_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG,
FUNC_NAME);
}
*rank = ompi_comm_rank((ompi_communicator_t*)comm);
return MPI_SUCCESS;
}
这是ompi_comm_rank
函数的代码(取自this源代码):
static inline int ompi_comm_rank(ompi_communicator_t* comm)
{
return comm->c_my_rank;
}
正如您所看到的,在返回排名的实际值(也存储在结构中)之前,在该函数中执行了一些健全性检查,如果您执行严格的基准测试,肯定会产生开销
在实际情况下,如果您的排名查询数量非常大,MPI_Comm_rank
将更慢而不仅仅是从结构中获取字段。但是,我不认为解决方案之间的时差会非常大。