文档介绍:十二章并行程序设计基础
11/10/2017
1
Copyright Parallel Programming
并行程序设计基础
并行程序设计概述
进程
线程
同步
通信
并行程序设计模型
11/10/2017
2
Copyright Parallel Programming
并行程序设计概述
并行程序设计难的原因
并行语言的构造方法
并行性问题
交互/通信问题
五种并行编程风范
计算圆周率的样本程序
11/10/2017
3
Copyright Parallel Programming
1 并行程序设计难的原因
技术先行,缺乏理论指导
程序的语法/语义复杂, 需要用户自已处理
任务/数据的划分/分配
数据交换
同步和互斥
性能平衡
并行语言缺乏代可扩展和异构可扩展, 程序移植困难, 重写代码难度太大
环境和工具缺乏较长的生长期, 缺乏代可扩展和异构可扩展
11/10/2017
4
Copyright Parallel Programming
2 并行语言的构造方法
串行代码段
for ( i= 0; i<N; i++ ) A[i]=b[i]*b[i+1];
for (i= 0; i<N; i++) c[i]=A[i]+A[i+1];
(a) 使用库例程构造并行程序
id=my_process_id();
p=number_of_processes();
for ( i= id; i<N; i=i+p) A[i]=b[i]*b[i+1];
barrier();
for (i= id; i<N; i=i+p) c[i]=A[i]+A[i+1];
例子: MPI,PVM, Pthreads
(b) 扩展串行语言
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
(c) 加编译注释构造并行程序的方法
#pragma parallel
#pragma shared(A,b,c)
#pragma local(i)
{
# pragma pfor iterate(i=0;N;1)
for (i=0;i<N;i++) A[i]=b[i]*b[i+1];
# pragma synchronize
# pragma pfor iterate (i=0; N; 1)
for (i=0;i<N;i++)c[i]=A[i]+A[i+1];
}
例子:SGI power C
11/10/2017
5
Copyright Parallel Programming
三种并行语言构造方法比较
2 并行语言的构造方法
11/10/2017
6
Copyright Parallel Programming
3 并行性问题
进程的同构性
SIMD: 所有进程在同一时间执行相同的指令
MIMD:各个进程在同一时间可以执行不同的指令
SPMD: 各个进程是同构的,多个进程对不同的数据执行相同的代码(一般是数据并行的同义语)
常对应并行循环,数据并行结构,单代码
MPMD:各个进程是异构的, 多个进程执行不同的代码(一般是任务并行,或功能并行,或控制并行的同义语)
常对应并行块,多代码
要为有1000个处理器的计算机编写一个完全异构的并行程序是很困难的
11/10/2017
7
Copyright Parallel Programming
并行块
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)
进程的同构性
3 并行性问题
11/10/2017
8
Copyright Parallel Programming
用单代码方法说明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脚本将它加载到