c - MPI中如何获取物理机数量

标签 c fortran mpi

我可以使用 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/

相关文章:

c - 从C中的指针数组中删除元素

c - ansi c 意外行为有问题吗?

c - 为什么可执行文件(.exe 文件)的大小大于编译后的 .C 文件?

makefile - 用f77替换后的Gfortran编译错误

python - 无法在 Beowulf 集群上正确运行个人作业。示例工作工作正常

c - Linux 文件属性检查

arrays - "character*10::a"和 "character::a(10)"之间的区别

fortran - Fortran 90 中的可选子例程

ubuntu - 在/中执行时如何不以root身份执行MPI

centos - 在具有指定 ID 的 CPU 上运行 mpirun