中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr 十二、并行程序设计基础
十二、并行程序设计基础
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr 并行程序设计基础 121并行程序设计概述 122进程 123线程 124同步 125通信 12.6并行程序设计模型 国家高性能计算中心(合肥 2021/2/19
国家高性能计算中心(合肥) 2 2021/2/19 并行程序设计基础 ▪ 12.1 并行程序设计概述 ▪ 12.2 进程 ▪ 12.3 线程 ▪ 12.4 同步 ▪ 12.5 通信 ▪ 12.6 并行程序设计模型
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr 并行程序设计欐述 并行程序设计难的原因 2并行语言的构造方法 3并行性问题 4交互/通信问题 5五种并行编程风范 6计算圆周率的样本程序 国家高性能计算中心(合肥 2021/2/19
国家高性能计算中心(合肥) 3 2021/2/19 并行程序设计概述 1 并行程序设计难的原因 2 并行语言的构造方法 3 并行性问题 4 交互/通信问题 5 五种并行编程风范 6 计算圆周率的样本程序
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr 1并行程序设计难的原因 ◇技术先行,缺乏理论指导 ◇程序的语法/语义复杂,需要用户自已处理 >任务/数据的划分/分配 数据交换 同步和互斥 性能平衡 ◇并行语言缺乏代可扩展和异构可扩展,程序移植困难, 重写代码难度太大 ◇环境和工具缺乏较长的生长期,缺乏代可扩展和异构可 扩展 国家高性能计算中心(合肥 2021/2/19
国家高性能计算中心(合肥) 4 2021/2/19 1 并行程序设计难的原因 ❖ 技术先行,缺乏理论指导 ❖ 程序的语法/语义复杂, 需要用户自已处理 ➢ 任务/数据的划分/分配 ➢ 数据交换 ➢ 同步和互斥 ➢ 性能平衡 ❖ 并行语言缺乏代可扩展和异构可扩展, 程序移植困难, 重写代码难度太大 ❖ 环境和工具缺乏较长的生长期, 缺乏代可扩展和异构可 扩展
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr 2并行语言的构造方法 串行代码段 (c)加编译注释构造并行程序的方法 for(i=0;i<N;++)A[=b[”b[i+1 pragma parallel for(=0;i<N;i++)c]=A]+A[+1] #pragma shared(A, b, c) #pragma local() (a)使用库例程构造并行程序 id=my_process id 0; pragma pfor iterate (i=0; N 1) p=number of _ processes for(=0;iN;}++)A]=b"b[+1]; for(i=id; i<N; i=i+p)A[]=b[]"b[i+1]; pragma synchronize barriero pragma pfor iterate(i=0; N; 1) for(=id;N=计p)A四+A+1:for(=0N+)c=A[+A+1 例子:MPl,PVM, Pthreads 例子: SGI power C (b)扩展串行语言 my_process _id, number- of_processes(, and barriero A(0:N-1)=b(0:N-1)*b(1:N) c=A(O:N-1)+A(1:N) 例子: Fortran90 回家同住能计异十心(口胎
国家高性能计算中心(合肥) 5 2021/2/19 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