初识并发编程 MPI
MPI是一个跨语言的通讯协议,用于并发编程。MPI标准定义了一组具有可移植性的编程接口。
安装环境
MPICH 是开源的消息传递接口(MPI)标准的实现。
下载地址
# 解压文件
tar -xzvf mpich-3.2.1.tar.gz
cd mpich-3.2.1
# /usr/local/Cellar/mpich 改为你要安装 MPICH 的路径
./configure –-prefix=/usr/local/Cellar/mpich |& tee c.log
make |& tee m.log
make install |& tee mi.log
# 将你安装 MPICH 的路径添加到 PATH
export PATH=/usr/local/Cellar/mpich:$PATH;
编程例子
1. 简单 MPI 编程之进程识别
#include <mpi.h> // mpi 头文件
#include <stdio.h>
int main(int argc, char **argv) {
int numprocs, myid;
MPI_Init (&argc, &argv); // 初始化 MPI 执行环境
MPI_Comm_size (MPI_COMM_WORLD, &numprocs); // 获取有多少个进程属于 MPI_COMM_WORLD 通信域
MPI_Comm_rank (MPI_COMM_WORLD, &myid); // 获取当前进程的 id
if (myid == 0) {
// 进程号为0的进程执行的操作...
} else {
// 其它进程执行的操作...
}
// 所有进程都执行的操作...
MPI_Finalize(); // 结束 MPI 执行环境
return 0;
}
2. MPI 简单通信
#include <mpi.h> // mpi 头文件
#include <stdio.h>
int main(int argc, char **argv) {
int data[100], myid;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &myid);
if (myid == 0)
MPI_Send(data, 100, MPI_INT, 1, 0, MPI_COMM_WORLD);
else if (myid == 1)
MPI_Recv(data, 100, MPI_INT, 0, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
MPI_Finalize(); // 结束 MPI 执行环境
return 0;
}
其中,MPI_SEND(buf, count, datatype, dest, tag, comm)
是发送消息的 API,
buf
是消息缓存区。
count
是消息大小。
datatype
是数据类型。
dest
是目的进程在指定的进程域 comm
的进程号。
tag
是用户定义的消息的类型。
MPI_RECV(buf, count, datatype, source, tag, comm, status)
是(阻塞)接收消息的 API。
source
是来源进程在指定的进程域 comm
或 MPI_ANY_SOURCE
的进程号。
tag
可以是 MPI_ANY_TAG
。
status
用来接收更多信息,可以用 MPI_STATUS_IGNORE
如果我们不需要更多信息。
编译运行程序
封装的编译器:
- 对于 C 程序:
mpicc test.c -o test
- 对于 C++ 程序:
mpicxx test.cpp -o test
- 对于 Fortran 77 程序:
mpif77 test.f -o test
- 对于 Fortran 90 程序:
mpif90 test.f90 -o test
你也可以链接其它库:mpicc test.c -o test -lm
运行:
启动 16 个进程:mpiexec -n 16 ./test
如果-n 指定的进程数超过了系统的CPU(核)数,就会报错如下:
There are not enough slots available in the system to satisfy the 16 slots
that were requested by the application:
./test
Either request fewer slots for your application, or make more slots available
for use.
进阶一些:
// 非阻塞发送。非阻塞接收为 MPI_Irecv,具体说明可以用 man 命令查询.
int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
MPI_Comm comm, MPI_Request *request)
// 检测非阻塞通信是否完成。阻塞等待为 MPI_Wait,可以等待全部(MPI_Waitall)、等待一些(MPI_Waitsome,MPI_Waitany)
nt MPI_Test( MPI_Request *request, int *flag, MPI_Status *status );
// 数据归约:通过计算收集到的多个数据得到一个数据。
int MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
初识并发编程 MPI的更多相关文章
- 学习笔记:java并发编程学习之初识Concurrent
一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...
- 《Go并发编程实战》读书笔记-初识Go语言
<Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...
- Python并发编程之初识异步IO框架:asyncio 上篇(九)
大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...
- C#并发编程之初识并行编程
写在前面 之前微信公众号里有一位叫sara的朋友建议我写一下Parallel的相关内容,因为手中商城的重构工作量较大,一时之间无法抽出时间.近日,这套系统已有阶段性成果,所以准备写一下Parallel ...
- Python3 与 C# 并发编程之~ 线程篇
2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...
- Go并发编程实战 (郝林 著)
第1章 初识Go语言 1.1 语言特性 1.2 安装和设置 1.3 工程构造 1.3.1 工作区 1.3.2 GOPATH 1.3.3 源码文件 package main import ( " ...
- Go并发编程实战 第2版 PDF (中文版带书签)
Go并发编程实战 第2版 目录 第1章 初识Go语言 1 1.1 语言特性 1 1.2 安装和设置 2 1.3 工程结构 3 1.3.1 工作区 3 1.3.2 GOPATH 4 1.3.3 源码文件 ...
- 【漫画】JAVA并发编程 如何解决原子性问题
原创声明:本文转载自公众号[胖滚猪学编程],转载务必注明出处! 在并发编程BUG源头文章中,我们初识了并发编程的三个bug源头:可见性.原子性.有序性.在如何解决可见性和原子性文章中我们大致了解了可见 ...
- day38 Pyhton 并发编程
# 网络编程 # arp协议 : # 1.这是一个通过ip找mac地址的协议 # 2.由于有了socket,用户在使用网络的时候,只需要关心对方用户的ip地址就可以了 # 3.如果用户即将和这个ip进 ...
随机推荐
- Xaramin IOS 开发常见问题
调试时提示找不到obj某某文件,勾选后编译,再取消勾选后再次调试 APP不能上网(而且无法通过配置允许上网的APP,因为根本 找不到需要的APP),不要使用IOS11测试版本,自动禁网 截图路径 %U ...
- 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)(1) - 目录
昨天发表了<如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor>后,大家十分热情,几个小时内就收到了不少问题,包括: 对于ui自动化测试这方 ...
- JButton 按钮,JRadioJButton单选按钮,JChectBox复选框
一. [按钮JButton] //导入Java类 import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;im ...
- 四、View的工作原理
1.ViewRoot和DecorView ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完 ...
- PM过程能力成熟度2级
当PM意识到自己不再是程序员后,就会在项目管理方面,逐渐达到过程能力成熟度1级.尽管这种亲身经历会带给PM管理的信心,但从项目的层面来说,整体还是混沌的,PM在经历过1级的阶段性胜利后,将面临更多的问 ...
- nginx + flask + uwsgi + centos + python3 搭建web项目
1. python3之前已经搭建好,安装flask,使用 pip3 intall flask,这个比较简单,就不过多介绍 2.我在 /usr/local/nginx/html3 (html3是我新建 ...
- UltraEdit 注册机
IDM-All-Products-KeyGen-v3.6UltraEdit 注册机 1.断开网络连接,运行UltraEdit软件后,点击“帮助”—“注册/激活”; 2.许可证ID填写“zd423”.密 ...
- centos7操作记录
/root/wang/shell 存放练习的shell文件,快捷命令wsh(alias wsh='cd /root/wang/shell') /root/wang/OS_bak 存放系统备份文件 ...
- iOS 防止离屏渲染为 image 添加圆角
// image 分类 - (UIImage *)circleImage{ // NO 代表透明 UIGraphicsBeginImageContextWithOptions(self.siz ...
- LeetCode算法题-Max Consecutive Ones(Java实现)
这是悦乐书的第242次更新,第255篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第109题(顺位题号是485).给定二进制数组,找到此数组中连续1的最大数量.例如: 输 ...