存储mpi排名是否会提高性能

时间:2018-04-17 07:54:31

标签: c performance mpi rank

在遗留代码库中,mpi应用程序的排名存储在结构中。每当检查排名时,都会从此结构中读取排名,而不是调用MPI_Comm_rank

我发现这种方法存在一些问题,即:

  • 结构和MPI_Comm_rank需要同步。如果struct和MPI_Comm_rank不包含相同的rank值,则会发生错误。
  • 结构需要是全局的,或者作为参数传递给需要排名的每个函数。
  • 代码的可读性降低。

因此,我喜欢摆脱它。

我的问题是,如果这种方法可以提高性能吗?有没有人经历MPI_Comm_rank的调用与从结构中读取值相比多长时间?

我尝试使用google benchmark,但两者都很快,我无法区分。

1 个答案:

答案 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更慢而不仅仅是从结构中获取字段。但是,我不认为解决方案之间的时差会非常大。