我可以使用 MPI_Comm_size
来获取处理器总数。
但是如何获取真实物理机的数量呢?
最佳答案
如果物理机是指一组处理元素,共享一个公共(public)内存地址空间,那么 MPI-3 按类型拆分操作 MPI_COMM_SPLIT_TYPE
可用于便携地获取此类机器的数量:
int getNodeCount(void)
{
int rank, is_rank0, nodes;
MPI_Comm shmcomm;
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,
MPI_INFO_NULL, &shmcomm);
MPI_Comm_rank(shmcomm, &rank);
is_rank0 = (rank == 0) ? 1 : 0;
MPI_Allreduce(&is_rank0, &nodes, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
MPI_Comm_free(&shmcomm);
return nodes;
}
在 Fortran 中:
subroutine getNodeCount(count)
use mpi
implicit none
integer, intent(out) :: count
integer :: shmcomm, rank, is_rank0, ierr
call MPI_COMM_SPLIT_TYPE(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, &
MPI_INFO_NULL, shmcomm, ierr)
call MPI_COMM_RANK(shmcomm, rank, ierr)
if (rank == 0) then
is_rank0 = 1
else
is_rank0 = 0
end if
call MPI_ALLREDUCE(is_rank0, count, 1, MPI_INTEGER, MPI_SUM, &
MPI_COMM_WORLD, ierr)
call MPI_COMM_FREE(shmcomm, ierr)
end subroutine getNodeCount
该函数首先将世界通信器分成能够创建共享内存区域的组,即每个物理机器一组(给出上面的定义)。然后,它通过对 rank-0 实体的数量求和来计算此类组的数量。由于使用集体操作,该函数必须被世界组中的所有等级调用。
免责声明:未经测试的代码 - 使用风险自负。
关于c - MPI中如何获取物理机数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34115227/