为什么我们需要并行编程?
比如:RAM处理器一次一个操作,PRAM处理器(PRAM代表P个RAM处理器一起,他们具备私有的memory和共享的memory)一次可以处理P个操作。所以某种程度上会快。
[PRAM种类]
[Work and Size]
[work 和 PRAM p个数的关系]
[optimality优化]
[speedup,加速]
[Amdahl’s Law]
[Gustafson’s Law]
PRAM种类
EREW、CRCW、ERCW、CREW
E = exclusive
C = concurrent
R = read
W = write
意思使同步读写等,这是多个RAM对于共享memory出现的问题。
work and size
定义T(n) 代表在顺序情况下完成n个输入的最好时间。
t(n)代表在并行下使用的并行步骤(可以理解为时间),p(n)代表总共有多少个PRAM
work = t(n) * p(n) 也就是说让所有的PRAM都全部执行的总量(其实很多时候只有部分PRAM在工作,但是work就是计算他们每一个PRAM都是busy的情况)
size = 虽有PRAM所执行的总共的操作,可以看到这里执行的操作就不再考虑每一个PRAM都需要使busy的情况了。
通常 $T(n) \leq $size(n) && $size(n)\leq $work(n) 也就是说对于总的操作来说顺序的时间会少(并行的拉成一条线所以长),但是如果使用并行后,时间可以叠在一起,运行时间就会少了。
work 和 PRAM p个数的关系
work = t(n) * p(n)
假设有work1 = t1(n) * p1(n),如果想用p2(n)个PRAM来代替,则t2(n) = $ \lceil \frac{p1}{p2} \rceil $* t1(n)
所以 work1 = t2(n) = $ \lceil \frac{p1}{p2} \rceil $* t1(n) * p2(n)。这是合理的,不过从多往少转变很容易二从少想多转变就会很困难(并行化很困难)。
optimality优化
考虑一个算法是不是优化算法,n为问题的规模,T(n)为顺序程序的时间,新的PRAM使用p(n)个处理器且并行时间为t(n)。
该算法是优化的需要满足:
- t(n) = O(logcn) c 为一个常数。
- work = t(n) * p(n) = O(T(n)).(这和[Work and Size]有区别,所以之前的肯定不是优化的算法。)
- 一个常见的作法就是使用logcn个processors这是work = t(n)*O(logcn), t(n) = O(logcn)
speedup,加速
S§ =
T
(
n
)
t
p
(
n
)
\frac {T(n)}{tp(n)}
tp(n)T(n) T(n)指顺序算法时间复杂度,tp(n)指并行下的时间复杂度。
一般来说speedup 和 processor 的个数有关,(一般来说p越多,总的复杂度就会越小,但是可以考虑Amdahl’s Law以及Gustafson’s Law)
Amdahl’s Law
S§ 代表加速比,ts代表sequential时间,f代表可以被加速的部分,p代表有多少个processors
S§ =
t
s
f
∗
t
s
+
[
(
1
−
f
)
∗
t
s
]
/
p
\frac {ts}{f*ts + [(1-f)*ts]/p}
f∗ts+[(1−f)∗ts]/pts =
p
1
+
(
p
−
1
)
∗
f
\frac {p}{1+(p-1)*f}
1+(p−1)∗fp = 1/f(当有很大的p时)
举个例子:sort 当中,顺序执行时间为O(nlogn),比如归并,快排等算法。
Gustafson’s Law
gustafson law 和Amdahl类似,只不过gustafson law 给出了并行r和顺序s各占的比例(s + r = 1),一个处理器完成任务则需要总时间s + p r, (p 为处理器数量),而多个处理器完成则需要s + r,所以sp = s + p r s + r \frac {s+pr}{s+r} s+rs+pr = p + (1-p)s