并行程式设计


并行程式设计

文章插图
并行程式设计【并行程式设计】为了提高计算机的运行速度和系统的处理能力 , 在总体设计和逻辑设计中广泛採用并行操作技术 , 使各部件并行工作 。要求作业系统具有并发性及资源共享 , 于是採用了并行程式设计 , 它是能够同时执行2个以上运算或逻辑操作的程式设计技术 。採用了并行程式设计技术后 , 可使分时和多道程式更全面地利用计算机资源 , 使系统效率提高 , 开销减小 (所占记忆体小 , 花费的处理时间短) 。
基本介绍中文名:并行程式设计
外文名:Parallel programming 
学科:物联网
现状:并行软体的发展落后于并行硬体
并行程式设计能同时执行两个以上运算或逻辑操作的程式设计方法 。所谓并行性 , 严格地说 , 有两种含义:一是同时性 , 亦即平行性 , 指两个或多个事件在同一时刻发生;二是并发性 , 指两个或多个事件在同一时间间隔内发生 。程式并行性分为控制并行性和数据并行性 。并行程式的基本计算单位是进程 。并行程式有多种模型 , 包括: 共享存储; 分布存储 (讯息传递); 数据并行;面向对象 。与并行程式设计相适应的硬体也有不同类型 , 如多处理机 , 向量机 , 大规模并行机和机群系统等 , 相应有不同的并行程式设计方法 。具体解题效率还与并行算法有关 。类别目前并行编程类型逐渐汇聚于两类:用于PVP,SMP和DSW的共享变数的单地址空间模型和用于MPP和机群的讯息传递的多地址空间模型.并行编程模型逐渐汇聚于三类标準模型:数据并行(如:HPF),讯息传递(如:MPI和PVM),和共享变数(如OpenMp).现在人们希望高性能的并行机应是 具有单一系统映像的巨大的工作站,使得很多用户都能利用增强处理能力和储存容量来运行多个串列作业,这就是所谓的串列程式并行系统SPPS.当我们在实际的并行机上设计并行程式时,绝大部分均是採用扩展Fortran和C语言的办法,目前有三种扩展的办法:一是库函式法:除了串列语言所包含的库函式外,一组新的支持并行性和互动操作的库函式(如MPI讯息传递库和POSIXPthreads多执行绪库)引入到并行程式设计中 。二是新语言结构法:採用某些新的语言结构来帮助并行程式设计以支持并行性和互动操作(如Fortran 90 中的聚集数组操作); 三是编译製导法:程式设计语言保持不变,但是将称之为编译製导的格式注释引入到并行程式中.并行编程为了对实际的或逻辑的并行性编程 , 必须有一 些用以建立(create)与消灭(destroy ) (即 ,  设立与终止)进程的一些手段和用于这些进程彼此 间通信与同步的一种方法 。许多系统与语言提供了 这样的并行程式设计设施 。显式地提供这样一些机 构的作业系统是DEC PDP-11与DEC VAX 计算机上的UNIX(q.v)系统 。并行Pascal与 Modula都运行在DEC PDP-11上 , Mesa语言 是在Xerox开发的 , Ada (q.v.)语言是为美 国国防部开发的 , 它们都是含有并行程式设计结构的现代程式设计语言的例子 。FORK与JOIN语句是一组可用于动态地建 立与消灭进程的语句 。用于说明并行性的静态设施 是cobegin/coend结构 。它具有如下形式:cobegin S1//S2//…//Sncoend它表示(可能是複合的)语句S1、S2、……与Sn可并行执行 。同步机构有TEST AND SET这样的机器 语言指令 , 它不可分割地执行下列操作序列: 检查 一个存储单元为0还是1 , 把检查结果存储在一个暂存器中 , 使该单元置位为1; 对于实现锁定或象 对信号量的Dijkstra P与V操作这样的低级同步原语 , TEST AND SET是方便的 。在较高级是监督程式 。这一设施用来说明表示一资源的共享数据 结构与定义用于获得、释放与存取该资源的过程; 监督程式容许封闭与调度可被若干进程使用的资源 目标 。获得同步的另一种常用的方法是通过信息传送原语 。简单的例子是send(p , m)与receive (p , m) 。send(p.m)导致信息m传送到进 程p , receive(p.m)等待来自进程p的信息 ,  把该信息插入m中 。因为它并不依赖通过公用存储器中的共享变数进行通信 , 信息传递对于分散式计算是有用的 , 在分散式计算中 , 各任务通过通信线路连线 。仍在进行精炼与测试的Ada语言具有把过程调 用与信息传送两者结合起来的通信与同步语句 。在 两个进程之间的通信通常进行如下 。一个进程用含有输入与输出参数的任务入口调 用来调用另一个进程 , 而被调用的进程发出一个等 待这样一个调用的accept语句;accept语句还包 括一个任意的语句序列 , 该语句序列作为接受此任 务入口调用时出现的集结的一部分执行 。在这个互动作用之后 , 调用进程与被调用进程两者可再并行 执行 。Ada还提供一个选择等待语句 , 在其中有 在处于“开路”的一组accept语句之间的不确定 选择(即 , 如果发出一个相应的任务入口调用 , 其中一个集结是可能的) 。作为并行程式设计的一个例子 , 我们给出对于 一个公用缓冲问题的解决方法 。假设我们要为一个 二进程系统编程 , 其中一个进程是生产者进程 , 它 把一些记录添加到一个存储区 , 另一进程是消费者 进程 , 它把这些记录移走 。生产者进程可以是一个 与输入设备关联的进程 , 它把输入记录添加到存储 缓冲器中 , 而消费者进程负责检索记录并处理它 们;另一方面 , 生产者进程可产生用于与一输出设 备关联的消费者进程的输出记录 。公用缓冲区有N个记录(N≥1)的存储 。主 要问题是使缓冲器的处理同步 , 因而:1.如果有空间的话 , 生产者进程可以只添加 一个记录到缓冲器;如果存在一个记录的 话 , 消费者进程可以只移走一个记录 。2.一次仅一个进程可处理缓冲区 。我们假设生产者进程与消费者进程两者均是 “永远”循环的循环进程 。採用信号量与cobegin/ coend , 程式的轮廓如下:Semaphore empty(N) , {缓冲器中空槽的 数目 , 初始为N}full(0) , {缓冲器中满记 录的数目 , 初 始为0}lock(1); {在缓冲器处理期 间 , 保证互斥}Cobegin producer:loopbegin produce Next Record;P(empty); {只有在缓冲器中 可得到一个空槽 的情况下才进 行}P(lock); {设定锁定到0 , 避 免缓冲器被Consumer存取}Add Record To Buffer;V(lock); {设定锁定到1 , 允 许被producer 或Consumer存 取} V(full) {增加缓冲器中满 记录的数目end consumer:loop begin P(full); {只有在缓冲器中 有一个满记录时 进行}P(lock); {对producer锁 住缓冲器}Take Record From Buffer;V(lock); {缓冲器开锁}V(empty); {增加缓冲器中可 用槽的数目}process Record end Coend