您现在的位置:首页 > >

第12章并行程序设计基础

发布时间:

第12章并行程序设计基础 并行程序设计概述 1 并行程序设计难的原因 2 并行语言的构造方法 3 并行性问题 4 交互/通信问题 5 五种并行编程风范 6 计算圆周率的样本程序 2 ? 1 并行程序设计难的原因 ? 技术先行,缺乏理论指导 ? 程序的语法/语义复杂, 需要用户自已处理 ? 任务/数据的划分/分配 ? 数据交换 ? 同步和互斥 ? 性能平衡 ? 并行语言缺乏代可扩展和异构可扩展, 程序移植困难, 重写代码难度太大 ? 环境和工具缺乏较长的生长期, 缺乏代可扩展和异构可扩展 3 ? 2 并行语言的构造方法 串行代码段 (c) 加编译注释构造并行程序的方法 for ( i= 0; i<N; i++ ) A[i]=b[i]*b[i+1]; #pragma parallel for (i= 0; i<N; i++) c[i]=A[i]+A[i+1]; #pragma shared(A,b,c) (a) 使用库例程构造并行程序 #pragma local(i) { id=my_process_id(); # pragma pfor iterate(i=0;N;1) p=number_of_processes(); for (i=0;i<N;i++) A[i]=b[i]*b[i+1]; for ( i= id; i<N; i=i+p) A[i]=b[i]*b[i+1]; # pragma synchronize barrier(); # pragma pfor iterate (i=0; N; 1) for (i= id; i<N; i=i+p) c[i]=A[i]+A[i+1]; 例子: MPI,PVM, Pthreads for (i=0;i<N;i++)c[i]=A[i]+A[i+1]; } (b) 扩展串行语言 例子:SGI power C my_process_id,number_of_processes(), and barrier() A(0:N-1)=b(0:N-1)*b(1:N) c=A(0:N-1)+A(1:N) 例子: Fortran 90 4 ? 2 并行语言的构造方法 三种并行语言构造方法比较 方法 实例 优点 缺点 库例程 MPI, PVM 扩展 Fortran90 编译器注释 SGI powerC, HPF 易于实现, 不需要新编 无 编 译 器 检 查 , 译器 分析和优化 允许编译器检查、分析 实现困难,需要新 和优化 编译器 介于库例程和扩展方法之间, 在串行平台 上不起作用. 5 ? 3 并行性问题 3.1 进程的同构性 ?SIMD: 所有进程在同一时间执行相同的指令 ?MIMD:各个进程在同一时间可以执行不同的指令 ?SPMD: 各个进程是同构的,多个进程对不同的 数据执行相同的代码(一般是数据并行的同义语) 常对应并行循环,数据并行结构,单代码 ?MPMD:各个进程是异构的, 多个进程执行不 同的代码(一般是任务并行,或功能并行,或控 制并行的同义语) 常对应并行块,多代码 要为有1000个处理器的计算机编写一个完全异 构的并行程序是很困难的 6 ? 3 并行性问题 并行块 parbegin S1 S2 S3 …….Sn parend S1 S2 S3 …….Sn可以是不同的代码 并行循环: 当并行块中所有进程共享相同代码时 parbegin S1 S2 S3 …….Sn parend S1 S2 S3 …….Sn是相同代码 简化为 parfor (i=1; i<=n, i++) S(i) 进程的同构性 7 ? 3 并行性问题 进程的同构性 SPMD程序的构造方法 用单代码方法说明SPMD 要说明以下SPMD程序: parfor (i=0; i<=N, i++) foo(i) 用户需写一个以下程序: pid=my_process_id(); numproc=number_of _processes(); parfor (i=pid; i<=N, i=i+numproc) foo(i) 此程序经编译后生成可执行程序A, 用shell 脚本将它加载到N个处理结点上: run A –numnodes N 用数据并行程序的构造方法 要说明以下SPMD程序: parfor (i=0; i<=N, i++) { C[i]=A[i]+B[i]; } 用户可用一条数据赋值语句: C=A+B 或 forall (i=1,N) C[i]=A[i]+B[i] 8 ? 进程的同构性 3 并行性问题 MPMD程序的构造方法 用多代码方法说明MPMD 对不提供并行块或并行循环的语言 要说明以下MPMD程序: parbegin S1 S2 S3 parend 用户需写3个程序, 分别编译生成3 个可执行程序S1 S2 S3, 用shell脚 本将它们加载到3个处理结点上: run S1 on node1 run S2 on node1 run S3 on node1 S1, S2和S3是顺序语言程序加上进 行交互的库调用. 用SPMD伪造MPMD 要说明以下MPMD程序: parbegin S1 S2 S3 parend 可以用以下SPMD程序: parfor (i=0; i<3, i++) { if (i=0) S1 if (i=1) S2 if (i=2) S3 } 因此, 对于可扩展并行机来说, 只要支 持SPMD就足够了 9 ? 3 并行性问题 3.2 静态和动态并行性 程序的结构: 由它的组成部分构成程序的方法 静态并行性: 程序的结构以及进程的个 数在运行之前(如编译时, 连接时或加 载时)就可确定, 就认为该程序具有静 态并行性. 动态并行性: 否则就认为该程序具有动 态并行性. 即意味着进程要在运行时创 建和终止


热文推荐
猜你喜欢
友情链接: 简历 面试求职范文 职业规划 自我管理 社交礼仪 76242百科