OpenMPI学习笔记(三)之围圈报数

目标:

n 个人围成一圈, 从某一个开始报数一直循环到本人。
即rang为r的进程发送信息给:

rang为r+1的进程,如果其存在;
否则给rang为0的进程。

代码部分:

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char**argv){
    MPI_Init(&argc, &argv);
    int world_size, wrank;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &wrank);

    if(world_size < 2){
        printf("人数必须大于2\n");
        MPI_Finalize();
    }

    int pass = 0;
    if(wrank == 0){
        //MPI发送函数
        //函数原型 int MPI_Send ( const void * buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm );

        //int MPI_Send(数据包, 大小, 数据类型, 目的地标识, 数据包标记, 容器)
        MPI_Send(&pass, 1, MPI_INT, wrank + 1, wrank, MPI_COMM_WORLD);

        //MPI接收函数, 与Send函数对应。
        //函数原型int MPI_Recv ( void * buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status * status );

        //int MPI_Recv(数据包, 大小, 数据类型, 数据源标识, 数据包标记, 容器, MPI状态)
        MPI_Recv(&pass, 1, MPI_INT, world_size - 1, world_size - 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        ++pass;
        printf("我是 %d. 我收到 %d的报数. 总人数 : %d.\n", wrank, world_size - 1, pass);
    }
    else{
        //先接收后发送,否则容易造成死锁发生。
        MPI_Recv(&pass, 1, MPI_INT, wrank - 1, wrank - 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        ++pass; 

        //选择发送目的地, 如果当前进程rang不等于进程总数-1(即存在存在rang为r+1的进程),则发送rang为r+1的进程;否则发送给rang为0的进程。
        int dest = wrank < world_size - 1 ? wrank + 1 : 0;

        MPI_Send(&pass, 1, MPI_INT, dest, wrank, MPI_COMM_WORLD);
        printf("我是 %d. 我收到 %d的报数. 总人数 : %d.\n", wrank, wrank - 1, pass);
    }
    MPI_Finalize();
}

结果截图:

tirage1_result

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值