C++ 并行计算 MPI Tutorial-7


使用 MPI 进行并行排名-问题总览

当所有进程都在其本地内存中存储一​​个数字时,了解它们相对于所有进程包含的整个数字集的编号顺序是很有用的。例如,用户可能正在对MPI群集中的处理器进行基准测试,并想知道每个处理器相对于其他处理器的速度顺序。此信息可用于安排任务等。可以想象,如果所有其他数字分布在各个进程中,那么很难在所有其他数字的背景下找出它们的顺序。这个并行排名问题,就是我们在本课中要解决的问题。下图显示了并行排名的输入和输出:


图示中的进程(标记为0到3)从四个数字开始各有 -5、2、7和4。然后,并行排名算法计算出进程0 在一组数字(即第一个数字)中具有排名 0。 进程3 具有排名1 ,进程0 具有排名 2,进程2 具有数字集中的最后一个排名。很简单,对吧?

并行排名-API 定义

在深入研究并行排名问题之前,我们首先要确定我们的功能如何运行。我们的函数需要在每个进程上取一个数字,并返回其在所有进程中相对于所有其他编号的关联排名。同时,我们将需要其他杂项信息,例如正在使用的 communicator 以及被编号的数据类型。给定此函数定义后,我们的 rank 函数原型如下所示:

TMPI_Rank(
    void *send_data,
    void *recv_data,
    MPI_Datatype datatype,
    MPI_Comm comm)

TMPI_Rank 采用 send_data 缓冲区,其中包含一个数据类型。 recv_data 在每个进程中仅接收一个整数,其中包含 send_data 的排行值。 comm 变量是进行排名的 communicator。

解决并行排名问题

现在我们有了 API 定义,我们可以深入研究如何解决并行排名问题。解决并行排名问题的第一步是对所有过程中的所有数字进行排序。必须做到这一点以便我们可以找到整个数字集中每个数字的排名。我们可以通过多种方式来实现这一目标。最简单的方法是将所有数字收集到一个进程中,并对数字进行排序。

// 收集用于给进程0 进行TMPI_Rank 的数字。
// 分配空间并返回void *缓冲区给进程0,其他进程返回NULL。
void *gather_numbers_to_root(void *number, MPI_Datatype datatype,
                             MPI_Comm comm) {
   
  	int comm_rank, comm_size;
  	MPI_Comm_rank(comm, &comm_rank);
  	MPI_Comm_size(comm, &comm_size);

  	// 在根进程上分配一个数组,其大小取决于使用的 MPI 数据类型
  	int datatype_size;
  	MPI_Type_size(datatype, &datatype_size);
  	void *gathered_numbers;
  	if (comm_rank == 0) {
   
    	gathered_numbers = malloc(datatype_size * comm_size);
  	}

  	// 在根进程上收集所有数字
  	MPI_Gather(number, 1, datatype, gathered_numbers, 1,
             datatype, 0, comm);</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值