MIT算法导论公开课之第20课 高级课题、并行算法(一)
程序员文章站
2024-02-13 22:56:46
...
并行算法
- 对于串行算法,一般只有一种基础模型(随机存取机器模型),而在并行领域,有许多种不同的并行算法模型和并行化模型,没有一种最佳模型的共识。
本节课讨论的模型基于动态多线程的多核机器,它是为共享内存的编程而设计的。
Ex:
Fib(n)
if n<2
return n
x ← spawn Fib(n-1)
y ← spawn Fib(n-2)
sync
return (x+y)
spawn:
调用一个子程序,且它能和父程序同时执行。
sync:
等待至所有子程序完成。
- 上述伪码表示对并行逻辑的描述,并不是实际的并行化执行,需要一个调度器来决定如何将这样一个动态的不断延伸的程序映射到可用的处理器上。
多线程计算
- 并行指令流是一个有向无环图(DAG)。
- 图的顶点为线程,线程为不包含任何并行控制的最长指令序列,在执行一个程序时spawn、sync、return操作会将当前的线程结束。
- Ex:
性能评估
Tp=程序在P个处理器上运行的时间。
实际中,Tp不是一个常数,显然调度算法不同就会有不同的结果。
T1=work=程序在1个处理器上运行的时间(串行运行时间)。
T∞=关键路径长度=DAG中最长的路径。
Ex:
假设每个线程运行消耗一个单位时间。
Fib(4):
T1=17
T∞=8Tp的下界:
Tp>=T1/P(因为P个处理器每一步最多能做P个线程)
Tp>= T∞(∞个处理器中总可以取出P个处理器来工作,以达到Tp时间)
注:在做任何优化工作前,最好先想办法衡量一下优化最好能达到的程度。加速比(Speedup):
调度
通过一个运行时系统,将计算分配到P个处理器上。
在线的调度算法(比如随机调度算法)是非常复杂的,课程要讲的是离线调度的思想。
贪心调度算法
- 主要思想是,如果DAG图中某一顶点的前一顶点没有执行完,就不能执行这一顶点,贪心的思想体现在每一步都尽量执行最多的线程。
- 每一步调度时存在两种情况:
1.完全步(Complete step),可以调度的线程数>=处理器数P,此时为所有处理器分配任意的P个线程。
2.不完全步(),可以调度的线程数<处理器数P,此时让处理器执行所有可以调度的线程。
注:把DAG完美地调度到P个处理器上属于NP完全问题,非常复杂。- 证明贪婪调度算法的Tp<=T1/P+T∞(两个下界的和):
- 推论:
如果使用的处理器数量P=O(P(_)),贪婪调度算法则可以做到线性加速。
- 证明贪婪调度算法的Tp<=T1/P+T∞(两个下界的和):
动态多线程语言Cilk
Cilk应用于Chess程序
上一篇: 数据结构篇——优先级队列(堆)
下一篇: 浅谈AI聊天机器人