存储mpi等级是否会提高性能

Does storing mpi rank enhance the performance

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

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

因此,我喜欢摆脱它。

我的问题是,这种方法是否提高了性能?有没有人体验过 MPI_Comm_rank 的调用与读取结构体的值相比有多长?

我试过使用 google benchmark,但两者都太快了,我无法区分。

我们来分析一下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 比仅从结构中获取一个字段 慢。但是,我认为解决方案之间的时间差异不会很大。