此博文包含图片 (2018-11-04 21:37:12)
http://blog.sina.com.cn/s/blog_151391cb60102z0e3.html
标签: it 杂谈 分类: Linux
一、MPI多机并行接口协议
定义:
MPI:Message-Passing Interface,“消息传递接口”协议
特点:
进程级;分布式存储;显式;可扩展性好;编程复杂
需要分析及划分应用程序问题,并将问题映射到分布式进程集合
需要解决通信延迟大和负载不平衡两个主要问题
集群资源不够起所有instance,则MPI的job一直等待
某个instance(进程?)计算failed,则所有instance都要重新计算
instance太多会增加进程间通信开销
无论硬件是否共享内存空间,都可以使用
与OpenMP相比,可以处理规模更大的问题
性能上会受到通信网络的影响
支持库:
主要有两大类库:OpenMPI和MPICH(包括MPICH、MPICH2、MPICH3、IntelMPI、MVAPICH、MVAPICH2)(下划线代表主流MPI库)
1、OpenMPI、MPICH、MVAPICH等编译命令(不分编译器):
mpicc、mpicxx、mpif77、mpif90、mpic++、mpiCC
2、IntelMPI编译命令(分编译器):
GNU编译器:mpicc、mpicxx、mpifc(mpigcc、mpigcc、mpif77、mpif90)
Intel编译器:mpiicc、mpiicpc、mpiifort
CPPFLAGS:预处理选项
LDFLAGS:链接选项
LIBS:链接库选项
CC:C编译命令
CFLAGS:C编译选项
CXX:C++编译命令
CXXFLAGS:C++编译选项
F77:Fortran 77编译命令
FFLAGS:Fortran 77编译选项
FC:Fortran 9x编译命令
FCFLAGS:Fortran 9x编译选项
二、OpenMP多核并行接口协议
定义:
OpenMP:Open Multi-Processing,“开放式多重处理”协议
特点:
线程级;共享式存储;隐式;可扩展性差;编程简单
所有线程共享内存空间,硬件制约较大
目前主要针对循环并行化
支持库:
不需要额外安装支持库,现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持,
比如gcc -fopenmp xxx.c;icc -openmp xxx.c
(鸣谢:https://blog.csdn.net/s_sunnyy/article/details/60956201;https://blog.csdn.net/bi_hu_man_wu/article/details/69568950)
三、进程(process)和线程(thread)
(鸣谢:https://www.zhihu.com/question/25532384)
背景1:Linux所谓同时多任务处理,就是先加载任务1环境+处理任务1(不一定完成)+保存任务1新环境;然后加载任务2环境+处理任务2+保存任务2新环境;接着可以继续任务1等等;短时间内切换处理不同任务,在人看来好像同时处理多个任务(只有一个NCL,但大家都“同时”单独画图)
背景2:操作系统的设计,因此可以归结为三点:
1 以多进程形式,允许多个任务同时运行
2 以多线程形式,允许单个任务分成不同的部分运行
3 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源
进程包含CPU加载上下文+CPU运行+CPU保存上下文
线程属于进程一部分,共享CPU加载上下文+若干CPU运行(若干线程)+共享CPU保存上下文
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同
进程是CPU资源分配的最小单位,线程是CPU调度运行的最小单位
MPI并行是进程级并行,集群计算机多机并行(<"加载环境+多核运行+保存环境"多进程并行>)
OpenMP并行是线程级并行,单机多核并行(共享加载环境+<"多核运行"多线程并行>+共享保存环境)