并行算法

并行算法就是用多台处理机联合求解问题的方法和步骤,其运行过程是将给定的问题首先分解成若干个尽量相互独立的子问题,然后使用多台计算机同时求解他,从而最终求得原问题的解。

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

 并行算法_第1张图片

复杂度分析: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

 并行算法_第2张图片

复杂度分析:for 循环执行了log n 次,

          运行时间T(n)=O(log n),

          处理器数量P(n)=n-1,

          成本C(n)=O(nlog n)

该算法几乎所有理器是活跃的。

 

你可能感兴趣的:(course)