当前位置:  开发笔记 > 编程语言 > 正文

如何获取MPI中的物理机数量

如何解决《如何获取MPI中的物理机数量》经验,为你挑选了1个好方法。

我可以MPI_Comm_size用来获得总处理器的数量.但是如何才能获得真实物理机的数量呢?



1> Hristo Iliev..:

如果物理机器是指一组处理元素,共享一个公共内存地址空间,那么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实体的数量求和来计算这些组的数量.由于使用集体操作,该功能必须由世界组中的所有等级调用.

免责声明:未经测试的代码 - 使用风险由您自行承担.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有