基于可配置处理器的异构多核系统线程级动态调度方法
技术领域
本发明涉及一种计算机技术领域的方法,尤其涉及一种基于可配置处理器的异构多核系统线程级动态调度方法。
背景技术
现有的任务调度模型大致可以分为静态调度和动态调度两类,静态调度是指程序在编译时已经确定了调度规则,运行时操作系统或控制程序只需根据调度规则将并发任务指派给对应的处理核心即可;而动态任务调度与之相反,程序在编译时没有确定调度规则,运行时操作系统或控制程序根据当前系统的工作状态,将并发任务指派给某一适合的处理核心,因此只有运行时才能确定任务在各个核上的执行序列。
实际上,有些异构结构本质上就不能实现动态调度。动态调度可行与否取决于异构多核处理器指令集的设计。现有的异构多核处理器指令集设计思路大致可以分为以下三类:(1)指令集完全不同。在此类设计中,选择不同功能导向的处理核心组成一个异构多核体系,其上的每一种处理核心针对某一类处理都具有较强的功能,因此每个处理核心在指令集设计方面都存在巨大差异。不过由于指令集完全不同,只能通过静态调度的方式完成任务指派。(2)指令集完全相同。在此类设计中,选取具有相同指令集但是硬件配置上有所不同的处理核心,组成异构多核系统。这类设计由于性能提高不多,因此商业化程度较低。(3)指令集部分相同。此类设计是随着可配置处理器技术发展而出现的,它可以针对应用扩展指令集以增强处理能力。在此类设计中,处理核心是一组可配置处理器,所有的处理核心具有一个公共的指令集,每个核心又可以根据应用增加一些扩展指令,从而使该核心针对应用某一方面有较好的处理能力。
经对现有技术文献检索发现,Seng Lin Shee等在2008年二月的《International Journal of Parallel Programming》Vol.36,No.1(140~162页)上发表的《Architectural Exploration of Heterogeneous MultiprocessorSystems for JPEG》一文中,针对其提出的两种由可配置处理器组成的异构多核结构,采用了静态调度的方法。具体为:以JPEG编码程序为例,在两种异构多核结构中使用了静态调度的方法。一种是主从式结构,一个主核加上几个辅核,主核负责其他辅核数据的分发、输入/输出操作以及霍夫曼编码,JPEG编码过程中的剩余任务通过并行化,并发的在所有辅核上执行。另一种是流水结构,几个处理核组成流水线,每一个核处理的当前数据依赖于流水线上前一个核上一次的处理结果。作者将JPFG编码过程划分为几个顺序执行流水任务,然后按照任务的执行顺序依次指派给流水线的处理核执行,第一个核处理初始任务,第二个核处理第二个任务,依此类推。该方法不足在于:(1)必须认真分析任务之间复杂的流水关系,然后静态指派任务到合适的处理核上,这要求程序员具有较高的素质和经验,否则一旦任务指派不当,程序执行时间就会增加。而系统实际运行时的信息很难准确掌握。(2)静态调度不够灵活,在解决问题内在逻辑的同时,还要考虑问题任务在各个处理核上的执行顺序,增加了编程时的复杂度。
发明内容
本发明的目的在于解决现有技术的不足,提供一种基于可配置处理器的异构多核系统线程级动态调度方法,针对使用第三种指令集设计的异构多核系统,该方法可以使得在由可配置处理器组成的异构多核系统中,调度器根据系统实际的运行情况,动态调度满足该方法的线程至空闲处理核上运行,从而解决静态调度分配效率不高的缺点。此外,由于方法中采用线程作为任务的描述,可以减少学习时间,简化编程模型。
本发明是通过以下技术方案实现的,本发明包括以下步骤:
第一步,选择异构多核结构
本发明所使用的异构多核结构由一组可配置处理核组成,每个处理核都具有一组公共指令集,此外每个核可根据应用的需求增加扩展指令集以优化处理核性能,因此每个核都具有一个指令集配置core_isa,表示此核可以运行哪些指令集。
第二步,划分线程
应用程序被划分为多个线程,每个线程之间仅存在数据依赖,而不存在内部的控制关系。每个线程具有一个期望指令集属性thread_isa,表示该线程使用了此指令集中的指令集。
第三步,操作系统的工作机制的设置
操作系统与运行在其上的应用一同编译为二进制可执行文件,所有处理器核共享同一个操作系统数据区。操作系统初始化时,首先初始化系统区,然后才进入正常工作状态。正常工作状态下,每个处理核心通过调度器得到合适的线程以运行。
第四步,在上述三个步骤完成之后,进行线程级动态调度,具体调度步骤如下:
步骤d1:调度器在某一个处理核上启动,执行步骤d2;
步骤d2:调度器获得当前处理核的指令集配置core_isa;
步骤d3:获得线程就绪队列中第一个就绪线程的句柄,得到该线程预期使用的指令集thread_isa;
步骤d4:检查core_isa是否满足thread_isa的运行要求,如果满足调度器停止查找,执行步骤d7,如果不满足执行步骤d5;
步骤d5:检查是否还有未遍历的就绪线程,如果有执行步骤d6,如果无执行步骤d8;
步骤d6:获得下一个就绪线程的句柄,得到该线程预期使用的指令集thread_isa,然后执行步骤d4;
步骤d7:切换系统上下文,执行选出的合适线程,到步骤d9;
步骤d8:系统睡眠,然后重新执行步骤d1;
步骤d9:调度结束。
所述的调度器是在现有的成熟的软件线程调度器上进行的改进,现有调度器可以在同构多核系统中正确的动态调度线程,本发明通过对其进行改进,使其实现上述的功能,从而达到本发明的目的。
以Motion-JPEG编码应用为例,本发明可以有效平衡芯片面积和执行速度之间的矛盾,能够获得较优的性价比指标。MJPEG(Motion JPEG)是在JPEG基础发展起来的动态图像压缩技术,它只对视频流中每一帧进行JPEG压缩,基本不考虑视频流中不同帧之间的变化,因此与背景技术所使用样例程序在技术实现和复杂度上相同。
与背景技术相比,最高性价比指标方面,是主从式结构静态调度的2.57倍,是流水式结构静态调度的1.56倍;如果以相同核数的加速比作比较,3核时,本发明比主从式结构静态调度加速比提高了111.25%,而流水式结构中作者给出的最少核数为5核。由此可见,本发明在提高执行性能上具有明显的优势。
此外,本发明可以使程序员从分配任务的工作中解放出来,从而减少了编程时的复杂度和学习时间。
附图说明
图1是处理核心、线程和指令集集合之间的映射关系示意图
图2是调度方法流程图
具体实施方式
下面结合附图对本发明的实施例作详细说明:本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
下面以使用3个处理核组成的异构多核系统为例说明本发明的具体实施方式。
a)选择异构多核结构
每个核都具有一个硬件编号,最小编号为0,依次递增。三核分别记为core0,core1,core2,每个处理核都具有一组公共指令集,记为ISA1,将core1扩展一组指令集,记为ISA2,将core2扩展一组指令集,记为ISA3。建立一个二维数组,第一维记录处理核编号,第二维记录每个处理核能够运行的指令集core_isa,例如core 0可以运行ISA1,core 1可以运行ISA1和ISA2。每个处理核只能有一个core_isa。
b)划分线程
将应用程序划分为多个线程,每个线程之间仅存在数据依赖,而不存在内部的控制关系。扩展POSIX线程标准,为每个线程添加一个thread_isa属性,用来记录该线程使用了什么指令集,创建线程时设置该属性。例如线程1代码中只用了ISA1中指令,故thread_isa为ISA1,而线程2代码中使用了ISA2中指令,故thread_isa为ISA2。
c)操作系统的工作机制的设置
所有处理器核共享同一个操作系统数据区。操作系统初始化时,首先由编号为0的处理核初始化系统区,此时其他核处于等待状态,当系统区初始化完成,系统进入正常工作状态。正常工作状态下,每个处理核心通过调度器得到合适的线程以运行。
d)在上述三个步骤之后,进行线程级动态调度,调度步骤如下:
步骤d1:调度器在某一个处理核上启动,执行步骤d2;
步骤d2:根据步骤a)中的二维数组,调度器获得当前处理核的指令集配置core_isa;
步骤d3:所有就绪态线程组成了一个队列,调度器获得该队列中第一个就绪线程的句柄,从而得到步骤b)中thread_isa;
步骤d4:比较core_isa和thread_isa,如果thread_isa是core_isa的一个子集,表示线程使用的指令可以运行在当前的处理核上,于是调度器停止查找,执行步骤d7,如果不满足执行步骤d5;
步骤d5:检查是否到达了就绪队列的尾部,如果没有到达,说明还有未检查的就绪线程,于是执行步骤d6检查该就绪线程是否可以运行在当前处理核上,如果到达了队列尾部,说明现阶段,所有的就绪线程都无法运行在当前的处理核上,于是执行步骤d8;
步骤d6:从队列中获得下一个就绪线程的句柄,得到该线程预期使用的指令集thread_isa,然后执行步骤d4;
步骤d7:切换系统上下文,执行选出的合适线程,到步骤d9;
步骤d8:系统睡眠一定时间,然后重新执行步骤d1;
步骤d9:调度结束。
以单核,无指令集扩展为对比基准,使用本实施例调度方法,2核使用指令集扩展优化后的加速比为2.72,3核使用指令集扩展优化后的加速比为3.38。性价比指标方面,2核为1.36,是最高性价比指标,3核为1.13,优于背景技术中的指标。