存储mpi等级是否会提高性能
Does storing mpi rank enhance the performance
在遗留代码库中,mpi
应用程序的等级存储在结构中。每当检查排名时,都会从该结构中读取排名,而不是调用 MPI_Comm_rank
.
我发现这种方法存在一些问题,即:
- 结构和
MPI_Comm_rank
需要同步。如果 struct 和 MPI_Comm_rank
不包含相同的 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
将 比仅从结构中获取一个字段 慢。但是,我认为解决方案之间的时间差异不会很大。
在遗留代码库中,mpi
应用程序的等级存储在结构中。每当检查排名时,都会从该结构中读取排名,而不是调用 MPI_Comm_rank
.
我发现这种方法存在一些问题,即:
- 结构和
MPI_Comm_rank
需要同步。如果 struct 和MPI_Comm_rank
不包含相同的 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
将 比仅从结构中获取一个字段 慢。但是,我认为解决方案之间的时间差异不会很大。