(三)MPI库的简单使用

  • MPI_Init(&argc, &argv);

被第一个调用的MPI函数用于并行环境初始化,其后面的代码到MPI_Finalize之前的代码可以在每个进程都被执行一次。

  • MPI_Finalize();

退出MPI系统,除了主进程(rank==0)其他所有的进程都必结束。但是经测试该函数后面的代码还是会执行,why?

  • MPI_Comm_rank(MPI_COMM_WORLD, &myid);

初始化,这样以后就根据myid的值来区分每个进程。

  • MPI_Comm_size(MPI_COMM_WORLD, &ThreadSize);

初始化,将开启的线程数存放在ThreadSize中。

  • MPI_Send(&d[i],1,MPI_DOUBLE,0,myid,MPI_COMM_WORLD);

将当前线程中的d[0]地址处的数据发送给myid线程,1表示个数发送一个,0是tag,接受和发送的双方要设置一致。

  • MPI_Recv(&receive,1,MPI_DOUBLE,receiveId,100,MPI_COMM_WORLD,&status);

当前线程接受来自receiveID线程的数据。


以上的六个函数是MPI库中最常用的函数。除此之外还有一些其他的函数,能使进程间的通信非常方便。

  • MPI_Bcast(&d[0], N, MPI_DOUBLE, 0, MPI_COMM_WORLD);

广播操作,将各个线程的d数组的N个值全部都和当前线程相同

  • MPI_Reduce(&num2,&sum_num2,1,MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

将各个线程中num2求和并存在当前线程的sum_num2中。MPI_SUM是加和操作,还有求最大值求最小值等。注意,加和时不能讲num1和sum_num1都这是成一个变量,会出错,比如我们对a变量加和时可以 a = a+a;将得到的和仍然存在a中,这里不行。和的存储必须用另外一个变量。

  • MPI_Allreduce(&num1,&sum_num1,1,MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);

将各个进程中的num1数字加和存储在sum_num1中。然后再将sum_num1广播出去。


  • mpicc -o test test.c

编译C文件

  • mpicxx - o test test.cpp

编译C++文件

  • mpiexec -n 4 ./test或者mpirun -n 4 ./test

开启四个线程执行test程序

mpiexec和mpirun的区别

  1. mpiexec是在MPI标准中定义的,具体MPI定义的标准是什么可以自己google之
  2. mpirun是有许多MPI各自实现的命名,因为他从来没有被标准化过,所以各个版本的MPI总是存在细微的差异。
  3. 我们正常使用就用mpiexec即可。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值