《并行计算:Parallel Computing》 结构编程算法应用 §3.2并行程序设计基础与样例 (第二部分,续) 徐悦牲Yueshen Xu)) ysxu@xidian.edu.cn 软件工程系 西安电子科技大学
§3.2 并行程序设计基础与样例 (第二部分,续) 徐悦甡(Yueshen Xu) ysxu@xidian.edu.cn 软件工程系 西安电子科技大学 《并行计算:Parallel Computing》 结构 编程 算法 应用
上节内容回顾 历些子种枝大” XIDIAN UNIVERSITY →并行程序设计模型(计算圆周率的样本程序) 口π的计算 ■π的近似计算公式 1+(0刀 ■ 串行程序→不同程序设计模型下并行程序的编写 >并行程序设计模型(四种) -隐式并行(Implicit Parallel) 数据并行(Data Parallel) 消息传递(Message Passing) 共享变量(Shared Variable)
上节内容回顾 并行程序设计模型(计算圆周率的样本程序) 𝜋的计算 𝜋的近似计算公式 2 𝜋 = න 0 1 4 1 + 𝑥 2 𝑑𝑥 ≈ 0≤𝑖<𝑁 4 1 + 𝑖 + 0.5 𝑁 2 ⋅ 1 𝑁 串行程序 不同程序设计模型下并行程序的编写 ➢ 并行程序设计模型(四种) - 隐式并行(Implicit Parallel) - 数据并行(Data Parallel) - 消息传递(Message Passing) - 共享变量(Shared Variable)
上节内容回顾 历些荒子科枚大学 XIDIAN UNIVERSITY →并行程序设计模型(计算圆周率的样本程序) ■π计算的串行计算程序 #define N 1000000 >其中,N是等分间隔数 int main( N值越大越精确,但计 double local,pi =0.0,w; 算时间越长 long i; w=1.0/N; for (i 0;i<N;i++){ local (i+0.5)*w; pipi +4.0/(1.0+local local); } printf("pi is %f \n",pi *w); return 0; 关键字 3
上节内容回顾 并行程序设计模型(计算圆周率的样本程序) 3 #define N 1000000 int main() { double local, pi = 0.0, w; long i; w=1.0/N; for (i = 0; i<N; i ++) { local = (i + 0.5)*w; pi = pi + 4.0/(1.0+local * local); } printf(“pi is %f \n”, pi *w); return 0; } ➢ 其中,N是等分间隔数 ➢ N值越大越精确,但计 算时间越长 关键字 𝜋计算的串行计算程序
并行程序设计模型 历些毛子种枝大学 XIDIAN UNIVERSITY 计算圆周率的样本程序 口隐式并行(Implicit Parallel) ■内涵 >程序员用熟悉的串行语言编程 >编译器或运行支持系统自动转化为并行代码 ■特点 >语义简单 >可移植性好 >单线程,易于调试和验证正确性 >效率很低
并行程序设计模型 计算圆周率的样本程序 隐式并行(Implicit Parallel) 内涵 ➢ 程序员用熟悉的串行语言编程 ➢ 编译器或运行支持系统自动转化为并行代码 特点 ➢ 语义简单 ➢ 可移植性好 ➢ 单线程,易于调试和验证正确性 ➢ 效率很低 4
并行程序设计模型 历些毛子科枚大多 XIDIAN UNIVERSITY →计算圆周率的样本程序 ▣数据并行(Data Parallel) ■SMD的自然模型,基于局部计算和数据选路操作 ■特点 >单线程、并行操作于聚合数据结构(数组)、松散同步、单一地 址空间、隐式交互作用、显式数据分布 main({ C:pi=sum(temp); 1ongN=1000000 D:printf("pi is %f n",pi*w); double local[N],temp[N],pi,w; long i,j,t; A:W=1/N; B:forall(i=0;i<N;i++) P:local[i]=(i+0.5)*w; Q:temp[i]=4.0/(1.0+local[i]*local[i]); 关键字 5
并行程序设计模型 计算圆周率的样本程序 数据并行(Data Parallel) SIMD的自然模型,基于局部计算和数据选路操作 特点 ➢ 单线程、并行操作于聚合数据结构(数组)、松散同步、单一地 址空间、隐式交互作用、显式数据分布 main(){ long N= 1000000 double local[N], temp[N], pi, w; long i, j, t; A: w=1/N; B: forall(i=0;i<N;i++){ P: local[i]=(i+0.5)*w; Q: temp[i]=4.0/(1.0+local[i]*local[i]); } C: pi=sum(temp); D: printf(“pi is %f\n”,pi*w); } 关键字 5