- 40
- 0
- 约2.37千字
- 约 23页
- 2019-11-18 发布于广东
- 举报
并行计算框架;并行计算框架设计
并行计算框架的具体实现
并行计算框架的应用
;IM并行计算框架为同步模块提供一种异步的多线程并行计算支持,通过调用IM并行计算框架提供的API,将原工作线程中串行执行的互不影响的计算任务交由并行计算线程并行执行。
其中并行线程来自并行计算框架维护的一个公共的线程池。
这种模型使多核CPU资源能够更充分地被利用,可以降低原工作的整体处理时间,主要的优势是降低高耗时请求的平响时间。;同步+异步模型示意;并行计算任务的旅程(1);并行计算任务的???程(2);主要类的UML;Event可以理解为并行任务的载体
IEvent是虚基类,目前只有一个派生类EventBase
IEvent要求派生类实现的主要方法,包括
setCallback:设置计算任务的回调函数
callback:执行回调函数
setCounter:设置任务对应的计数器
setTimeout:设置任务的超时时间
;用户在每个工作线程中定义EventBase
设置callback,即将并行任务提取成函数调用,需要自行准备数据,特别需要注意的是,并行任务之间不应当有对任何共享数据的写操作
设置event对应的counter,它负责在任务全部完成时唤醒工作线程,这部分在Counter类介绍
通过reactor将event加入待执行任务队列,这部分在Reactor类介绍;EventBase的内部实现比较简单
通过各set方法设置各成员变量
callback方法直接执行回调函数;reactor是控制并行线程池、任务队列的对象,应当设置为全局只有一个(进程级)
reactor对象在构造时,指定并行线程池的线程数量、任务队列的长度。应放在程序初始化处进行
reactor向用户开放以下接口:
run:并行线程启动
stop:并行线程停止
join:等待所有并行线程结束
post:抛起任务,交由并行线程执行
;任务队列是一个用数组实现的循环队列
定义了虚基类IEQueue和它的派生类DualLockEQueue
IEQueue对Reactor和并行计算线程开放的方法为
push:将IEvent指针加入队列
pop:将IEvent指针取出队列
计划修改为单锁版本后,push和pop的全过程使用同一互斥锁
;每个并行线程在生成后,循环执行以下操作:
尝试从队列pop出一个event
如果成功
如果此时任务未超时或者未设置支持超时检查,则执行event-callback()
任务执行完成后,通过event设定的counter,给计数加一,并判断是否全部任务已经完成,这部分在Counter类说明
如果队列为空
usleep 50us
Reactor的stop方法通过设置标志变量,使并行线程结束循环
;post方法通过调用队列的push函数,将任务event指针push到队列中;Counter类的功能是提供一个支持阻塞等待的计数器,对用户主要提供以下方法
setCountNum:设定计数的总量,并将当前计数清零
add_and_check:计数增一并且判断是否已经达到计数总量
poll:工作线程通过调用此方法进入等待,当此方法返回时,计数器确保已经通过add_and_check方法达到了计数总值;由于Counter提供的是阻塞等待式的模式,每个工作线程最多只能在等待一个Counter对象的poll返回
因此一般情况下,用户可以为每个工作线程定义一个Counter对象,反复使用
在使用reactor对象post每个event之前,根据event的数量设置计数总值
使用每个待计算的event对象的setCounter方法,将它们绑定到自身工作线程的Counter对象上
在使用reactor对象post每个event之后,调用poll函数等待;Counter的实现,通过一个互斥锁和一个条件锁
add_and_check的过程用互斥锁控制,避免多个线程同时更新计数
poll函数阻塞在条件锁处
当计数到达总数时,内部通过finish函数,唤醒poll中的条件锁
条件锁的保证机制在后面关于条件锁处说明;对互斥锁、自旋锁、条件锁的封装。基本上是通过复制ublock中对三种锁的实现得到的
自旋锁和互斥锁,在构造时加锁,析构时解锁
自旋锁:第一个加锁的线程获得向下执行的权力,其它线程在加锁处等待,但不释放CPU,当解锁时,会有一个等待的线程得到向下执行的权力,以此类推。
互斥锁:与自选锁的区别在于,等待的线程会释放CPU资源。
自旋锁适合临界区执行时间较短的场景;条件锁:主要包括wait和signal两个操作,需要与一个互斥锁配合。
首先,互斥锁加锁,然后执行wait,wait操作会使条件锁加锁的同时,互斥锁被解开(原子操作)
在另一个线程执行signal时,条件锁被解开,互斥锁被
原创力文档

文档评论(0)