(ASC20笔记)并行计算学习笔记
前言
最近在网上了解了MPI编程,找到了一些感觉比较有用的知识,但是网上的知识过于杂乱无章,所以写这篇博客总结一下,做个笔记。
并行计算背景
我们在刚开始学习编程时都知道,一个程序是总是顺序执行的,从头到尾依次下来。但是遇到数据量比较大的问题时,我们可能在每次调试时都需要用很久的时间。这样下来,单是调试就会耽误很久,所以在很早之前,计算机科学家们就开始想:有没有什么方法能够使得数据量大的程序跑的更快呢?一部分科学家通过算法逻辑的改进、一部分科学家通过硬件部分的设计…
这时有些科学家想到,一个问题,我能不能分别进行运行呢?如果这样可以的话,我能不能改进传统模式下的单个程序顺序执行的模式呢?于是就有了并行计算的概念。
所谓并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。(如果你学过操作系统的话,会很容易理解这段话。)
串行计算与并行计算的对比
串行计算特点:
- 一个问题被分解成为一系列离散的指令;
- 这些指令被顺次执行;
- 所有指令均在一个处理器上被执行;
- 在任何时刻,最多只有一个指令能够被执行。
并行计算特点:
- 一个问题被分解成为一系列可以并发执行的离散部分;
- 每个部分可以进一步被分解成为一系列离散指令;
- 来自每个部分的指令可以在不同的处理器上被同时执行;
- 需要一个总体的控制/协作机制来负责对不同部分的执行情况进行调度。
举个例子:
仓促的上学期要过去了,武汉理工大学又到了半年一度的期末考,作为通识必修课——高等数学又成为了新一届同学的噩梦。随着同学们合上笔帽,忙着收拾行李回家时,理学院的数学老师开始了难过的改卷之旅。已知试卷共有十道题目,5000份试卷,由1个老师来改卷(显然非常不合理)。
那么这个老师先从第一个同学的第一题开始改卷,到第一个同学结束,接着改第二个同学的第一题、第二题…第三个同学…一直到第5000个同学。这样下来一共需要50天能够改完。(这就是一个串行的过程,其中数学老师可理解为CPU、改试卷就是任务量也即一个程序。)
数学老师一算,不行,教务处规定学生成绩必须在1.20之前提交上传,还有10天就截止了。于是数学老师向学院反映,理学院院长一看,说:“我再给你九个人,凑成十个人吧,你们十个人改。”这样数学老师很顺利的在五天之内就该完了试卷,上传了成绩。(那么这个过程就是并行计算了,相当于我们为计算机提供了10个CPU,这样下来,任务量相当于平均分配给了这十个CPU,时间自然就变成了之前的十分之一。)
并行编程
了解基本概念后我们就要开始了解并行编程了:原本的串行的程序怎么才可以并行处理呢???
我们通常将采取的两种方式为:任务并行和数据并行。
任务并行:是指将有待解决的问题需要执行的任务分配到各个核上完成。
数据并行:是指将有待解决的问题所需要处理的数据分配到各个核上完成,每个核在所分配的大致相当的数据集上执行相同操作。
举个例子:我们还拿上述的例子进行比较
上述问题中我们知道每张卷子十道题,5000张卷子,十个老师。那么他们会怎么改卷呢?第一种方式就是每个老师改自己对映的那一道题,(比如最厉害的老师改最难的题???猜测而已);第二种方式就是每个老师改500张试卷。那么第一种就是任务并行,第二种就是数据并行。
并行编程的手段
一:MPI
MPI实现并行是进程级;采用的是分布式内存系统,显式(数据分配方式)实现并行执行,通过通信在进程之间进行消息传递,可扩展性好。MPI虽适合于各种机器,但它的编程模型复杂:
- 需要分析及划分应用程序问题,并将问题映射到分布式进程集合;
- 需要解决通信延迟大和负载不平衡两个主要问题;
- 调试MPI程序麻烦;
- MPI程序可靠性差,一个进程出问题,整个程序将错误;
二:Pthreads
Pthreads实现并行是线程级;采用的是共享内存系统,只有在POSIX的系统(linux、mac OS X、Solaris、HPUX等)上才有效。目前Windows上已经可以支持Pthreads库了,但是需要用特定的编译器。它是一个可以连接到C程序中的库,目前标准的C++共享内存线程库还在开发中,也许在将来在C++程序中,使用这个库更加方便。
三:OpenMP
OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive) 。OpenMP支持的编程语言包括C、C++和Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
四:OpenCL
OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
五:GPU
GPU(Graphics Processing Unit,图形处理器):GPU由数量众多的计算单元和超长的流水线组成,适合处理大量的类型统一的数据。但GPU无法单独工作,必须由CPU进行控制调用才能工作。GPU以图形类数值计算为核心。用于处理类型高度统一、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。GPU擅长的是图形类的或者是非图形类的高度并行数值计算,GPU可以容纳上千个没有逻辑关系的数值计算线程,它的优势是无逻辑关系数据的并行计算。
六:Hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
(来源百度百科)
本博客仅用作学习参考,如有错误或补充,欢迎指出