并行算法就是用多台处理机联合求解问题的方法和步骤,其运行过程是将给定的问题首先分解成若干个尽量相互独立的子问题,然后使用多台计算机同时求解他,从而最终求得原问题的解。
1.并行算法设计
并行算法设计包括划分法、分治法、平衡树法、倍增法、指针跳跃法、流水线法、破对称法等,根据问题的特性来选择适合的设计方法。
并行编程的模型主要有数据并行、消息传递和共享存储器。并行语言发展迅速,并行语言种类也非常多。并行语言产生的基本方法对Fortran和C/C++结合起来实现的
根据运算的基本对象不同,可以把并行算法分为数值并行算法和非数值并行算法。
根据进程之间的依赖关系可以分为同步并行算法和异步并行算法。同步并行算法步调一致,异步并行算法步调进展互不相同。同步并行算法任务的各个部分是同步向前推进的,有一个全局时钟来控制各部分的步伐。而对于异步并行算法各部分步伐是互不相同的,他们是根据计算过程的不同阶段决定等待继续或终止
特征 | 消息传递 | 共享存储 | 数据并行 |
典型代表 | MPI, PVM | OpenMP | HPF |
可移植性 | 所有主流并行计算机 | SMP, DSM | SMP, DSM, MPP |
并行粒度 | 进程级大粒度 | 线程级细粒度 | 进程级细粒度 |
并行操作方式 | 异步 | 异步 | 松散同步 |
数据存储模式 | 分布式存储 | 共享存储 | 共享存储 |
数据分配方式 | 显式 | 隐式 | 半隐式 |
学习入门难度 | 较难 | 容易 | 偏易 |
可扩展性 | 好 | 较差 | 一般 |
2.数组求和
2.1数组求总和
在PRAM模型上设计一个数字数组求和的算法。数组A[1,...,n]在全局共享存储器中,在A[1,..,n]中计算A[1]+A[2]+...+A[n],总和将在最后单元A[n]中。加上n是2的次幂。
算法:数组求和
procedure Sum(A,n)
begin
for i=1 to logn do
forall Pj,where 1<=j<=n/2 do in parallel
if(2j module 2^i)=0 then
A[2j]<——A[2j]+A[2j-2^(i-1)]
end if
end forall
end for
end
复杂度分析:for 循环执行了log n 次,
运行时间T(n)=O(log n),
处理器数量P(n)=n/2,
成本C(n)=O(nlog n)。
该算法大部分处理器在大部分时间是空闲的
2.2数组求所有部分和
在PRAM模型上数字数组的所有和的算法。加上数组A[1,...n]在全局共享存储器中,在A[1,...,n]中计算A[1],A[1]+A[2],A[1]+
A[2]+A[3],....,A[1]+A[2]+A[3]+...+A[n].
算法:求所有数组和
procedure AllSum(A,n)
begin
for i=1 to logn do
forall Pj,where 2^(i-1)+1<=j<=n do in parallel
A[j]<——A[j]+A[j-2^(i-1)]
end forall
end for
end
复杂度分析:for 循环执行了log n 次,
运行时间T(n)=O(log n),
处理器数量P(n)=n-1,
成本C(n)=O(nlog n)。
该算法几乎所有理器是活跃的。