一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种异构众核上基于主-从模型的轻量级多线程机制的制作方法

2022-03-22 20:18:13 来源:中国专利 TAG:


1.本发明涉及一种异构众核上基于主-从模型的轻量级多线程机制,属于高性能计算技术领域。


背景技术:

2.国产申威异构众核处理器最突出的优势是高性能,尤其适用于高性能计算领域,主要应用于超大规模并行机等大型实用系统中。每颗申威众核处理器包含多个核组,每个核组由一个主核核心和大量从核加速核心组成。
3.当前申威众核软件栈支持三种模式:默认模式、共享模式和全片共享模式。默认模式下,每个核组一个进程,进程间内存空间隔离,主核控制本核组从核加速计算,进程之间通过消息实现数据交互,各核组内存隔离,无法实现多线程和三级共享编程模型;共享模式下,与默认模式类似,但同一处理器内的进程间共享内存,由于内存共享,可使用进程充当线程,但处理器内需要多线程协同运算的片段散落在程序各处,由于线程无法任意创建与回收,用户必须时刻根据进程号显示地维护主进程及充当线程作用的从属进程的任务状态,并通过频繁的同步、锁等操作保证程序的正确性,牵扯程序员大量精力、编程繁琐且容易出错;全片共享模式下,处理器内0号核组的主核运行一个进程,同时控制片内所有从核加速计算,其他主核通过0号主核调用pthread库和操作系统提供的线程迁移接口实现片内多线程,多个芯片的0号主核通过消息实现数据交互,只支持一个处理器内有一个进程,用户无法根据自身需求选择线程组大小,且每次线程创建需要利用pthread库结合操作系统线程迁移系统调用接口才能实现,开销较大。
4.以往申威众核芯片上的软件栈默认是以进程为单位组织同一处理器内多个核组的资源,每个核组运行一个进程,而不能很好的支持以线程组的方式组织资源。这会使得用户开发并行程序时,或者使用系统提供的全片共享模式,但该模式不够灵活,且线程创建开销大,不能很好的契合用户需求;或者基于共享模式,以进程为单位,通过频繁的同步、锁等操作模拟芯片内多线程,但处理器内需要多个核组协同运算的程序片段往往散落在程序各处,用户必须时刻根据进程号显示地维护主进程及充当线程作用的从属进程的任务状态,编程繁琐且容易出错;或者放弃使用芯片内多线程,这在一定程度上迫使用户程序以“核组内共享-核组间消息”的两级并行编程模型开发程序,使得用户难以发挥处理器内共享内存带来的编程便利和性能潜力。
5.多核组共享内存有利于降低通信需求,但会增加并行开销。因此一些用户希望支持一种三级并行编程模型:处理器内根据用户需求设置多个进程;进程间通过消息交互数据;进程内的若干核组以线程组方式组织,基于共享内存协同运算;核组内利用从核加速。然而,当前的三种使用模式均无法很好地支持三级并行编程模型。彻底解决该问题,需要作业管理系统、操作系统、编译环境、通信库等底层软件栈全面支持,工作量大、牵扯面广,修改复杂且周期较长。


技术实现要素:

6.本发明的目的是提供一种异构众核上基于主-从模型的轻量级多线程机制,其为用户提供方便使用、更加灵活、开销更低的片内多线程解决方案。
7.为达到上述目的,本发明采用的技术方案是:提供一种异构众核上基于主-从模型的轻量级多线程机制,设置四种线程状态:__status_init=0、__status_wait=-1、__status_done=-2和__status_quit=-3,其含义分别为初始化、等待任务、任务完成和线程退出;每个处理器的总核组数记为cg_num、线程组的大小记为cg_per_process、参数缓冲大小记为max_param_size;在共享内存上开辟长整形数组__master_pc[cg_num],用于记录各核组的线程状态和任务pc传递,程序启动时,核组的默认状态为__status_init;在共享内存上开辟数组master_parameter[cg_num / cg_per_process][max_param_size],用于线程组内主线程向从属线程传递参数;各个核组的核组号记为cgid,将tid=cgid%cg_per_process为0的核组设为主线程,host置为1;将gid=cgid/cg_per_process相等的核组设为一个线程组,线程组内非主线程的核组host置为0;gid为同一处理器内线程组的逻辑号,tid为各核组在线程组内的逻辑号;根据主线程及其从属线程核组号,设置每个线程组的掩码cgmask,掩码有cg_num位,本线程组包含的核组号对应的位为1,其余位置为0;使用共享模式运行并行程序,每个核组为一个进程;当需要进入线程状态时,同一线程组内的核组同时调用master_enter接口,该master_enter接口接收host、线程组掩码cgmask和线程组参数地址master_parameter[gid]三个参数;各核组通过host判断自身为主线程还是从属线程,如果是从属线程,则调用master_waiting_for_task接口进入线程等待状态,如果是主线程,则通过线程组同步等待线程组初始化完毕;从属线程调用的master_waiting_for_task接口接收线程组掩码和参数列表地址两个参数;该master_waiting_for_task接口中,从属线程首先将本核组对应的__master_pc状态修改为_status_wait,然后通过线程组同步等待主线程和其他从属线程完成初始化,而后进入任务等待状态:从属线程读取__master_pc[cgid]状态,如果为__status_wait,则继续等待任务;否则如果为__status_quit,则退出任务等待状态;否则根据__master_pc[cgid]记录的pc和参数列表地址执行主线程分配的任务;任务执行完毕后,通过线程组同步等待线程组内其他线程执行完毕,而后将__master_pc[cgid]状态恢复为__status_wait,继续等待任务;需要多线程并发处理时,主线程调用master_spawn接口为线程组分派任务,根据线程组掩码将需要分派给线程组的任务pc写入线程组在__master_pc数组中的对应位置,参数列表写入master_parameter[cgid];该master_spawn接口为非阻塞接口,主线程调用该接口完毕后立即返回,可以选与从属线程协同处理任务,也可以进行其他计算任务或收发来自其他线程组的消息;从属
线程基于主线程提供的任务pc和参数表执行任务;主线程调用master_join接口,通过线程组掩码和线程组同步等待从属线程执行完毕,将自身__master_pc状态恢复为__status_wait,然后等待线程组内所有线程的状态恢复为__status_wait,该接口为阻塞接口;当需要退出线程状态时,主线程调用master_leave接口,根据线程组掩码释放线程组内线程,将线程组内所有核组的__master_pc状态置为__status_quit;执行完毕后,各核组恢复进程状态,可以根据进程号继续执行任务。
[0008]
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:本发明一种异构众核上基于主-从模型的轻量级多线程机制,以共享模式为基础,利用处理器共享内存,能够在尽量不修改底层软件栈的前提下,实现线程“即用即取、用完即走”的使用模式,为用户提供方便使用、更加灵活、开销更低的片内多线程解决方案,可避免大范围、长周期修改底层支撑软件可能造成的错误引入、服务中断、用户开发进度延误等负面影响,能够快速为用户提供三级并行编程接口与服务,且轻量级服务机制“即用即取、用完即走”的特性避免了传统多线程机制频繁调用fork/join/bind等系统调用和频繁创建、销毁线程带来的性能开销,可使用户获得更好的多线程加速效果。附图说明附图1为线程信息与空间分布示例(cg_num=6, cg_per_process=3);附图2为master_enter流程图;附图3为master_waiting_for_task流程图;附图4为master_spawn流程图;附图5为master_join流程图;附图6为master_leave流程图;附图7为基于主-从模型的轻量级多线程机制接口原型及典型使用方式。
具体实施方式
[0009]
实施例:本发明提供一种异构众核上基于主-从模型的轻量级多线程机制,设置四种线程状态:__status_init=0、__status_wait=-1、__status_done=-2和__status_quit=-3,其含义分别为初始化、等待任务、任务完成和线程退出;每个处理器的总核组数记为cg_num、线程组的大小记为cg_per_process、参数缓冲大小记为max_param_size;在共享内存上开辟长整形数组__master_pc[cg_num],用于记录各核组的线程状态和任务pc传递,程序启动时,核组的默认状态为__status_init;在共享内存上开辟数组master_parameter[cg_num / cg_per_process][max_param_size],用于线程组内主线程向从属线程传递参数;各个核组的核组号记为cgid,将tid=cgid%cg_per_process为0的核组设为主线程,host置为1;将gid=cgid/cg_per_process相等的核组设为一个线程组,线程组内非主线程的核组host置为0;gid为同一处理器内线程组的逻辑号,tid为各核组在线程组内的逻辑号;根据主线程及其从属线程核组号,设置每个线程组的掩码cgmask,掩码有cg_num位,本线程组包含的核组号对应的位为1,其余位置为0;
使用共享模式运行并行程序,每个核组为一个进程;当需要进入线程状态时,同一线程组内的核组同时调用master_enter接口,该master_enter接口接收host、线程组掩码cgmask和线程组参数地址master_parameter[gid]三个参数;各核组通过host判断自身为主线程还是从属线程,如果是从属线程,则调用master_waiting_for_task接口进入线程等待状态,如果是主线程,则通过线程组同步等待线程组初始化完毕;从属线程调用的master_waiting_for_task接口接收线程组掩码和参数列表地址两个参数;该master_waiting_for_task接口中,从属线程首先将本核组对应的__master_pc状态修改为_status_wait,然后通过线程组同步等待主线程和其他从属线程完成初始化,而后进入任务等待状态:从属线程读取__master_pc[cgid]状态,如果为__status_wait,则继续等待任务;否则如果为__status_quit,则退出任务等待状态;否则根据__master_pc[cgid]记录的pc和参数列表地址执行主线程分配的任务;任务执行完毕后,通过线程组同步等待线程组内其他线程执行完毕,而后将__master_pc[cgid]状态恢复为__status_wait,继续等待任务;需要多线程并发处理时,主线程调用master_spawn接口为线程组分派任务,根据线程组掩码将需要分派给线程组的任务pc写入线程组在__master_pc数组中的对应位置,参数列表写入master_parameter[cgid];该master_spawn接口为非阻塞接口,主线程调用该接口完毕后立即返回,可以选与从属线程协同处理任务,也可以进行其他计算任务或收发来自其他线程组的消息;从属线程基于主线程提供的任务pc和参数表执行任务;主线程调用master_join接口,通过线程组掩码和线程组同步等待从属线程执行完毕,将自身__master_pc状态恢复为__status_wait,然后等待线程组内所有线程的状态恢复为__status_wait,该接口为阻塞接口;当需要退出线程状态时,主线程调用master_leave接口,根据线程组掩码释放线程组内线程,将线程组内所有核组的__master_pc状态置为__status_quit;执行完毕后,各核组恢复进程状态,可以根据进程号继续执行任务。
[0010]
对上述实施例的进一步解释如下:申威众核芯片的软件栈默认以进程为单位组织同一处理器内多个核组的资源,每个核组运行一个进程,用户采用“核组内共享-核组间消息”的两级并行编程模型开发应用程序。在支持共享内存的处理器架构上利用多线程技术能够减少通信需求,有利于程序性能的提高。因此一些用户需要一种三级并行编程模型:根据自身需求设置处理器内进程数和线程组大小;进程间通过消息交互数据;进程内的若干核组以线程组方式组织,基于共享内存协同运算;核组内利用从核加速。然而当前申威众核芯片的软件栈难以很好的支持三级并行编程模型,或者不支持线程创建,或者用户编程繁琐容易出错,或者不够灵活且线程创建开销较大。
[0011]
本发明以共享模式为基础,利用共享内存和主-从模型实现一种轻量级多线程机制,无需修改底层软件栈,实现了一套基础的多线程机制,采用“即用即取、用完即走”的模式,帮助用户更容易、更高效的实现基于三级并行编程模型的应用开发。
[0012]
该机制描述如下:1、设置四种线程状态,__status_init=0、__status_wait=-1、__status_done=-2和__status_quit=-3,其含义分别是初始化、等待任务、任务完成、线程退出。
[0013]
2、每个处理器的总核组数记为cg_num、线程组的大小记为cg_per_process、参数缓冲大小记为max_param_size。在共享内存上开辟长整形数组__master_pc[cg_num],用于记录各核组的线程状态和任务pc传递,程序启动时,核组的默认状态为__status_init。在共享内存上开辟数组master_parameter[cg_num / cg_per_process][max_param_size],用于线程组内主线程向从属线程传递参数,参见图1。
[0014]
3、各个核组的核组号为cgid,将tid=cgid%cg_per_process为0的核组设为主线程,host置为1;gid=cgid/cg_per_process相等的核组设为一个线程组,线程组内非主线程的核组host置为0;gid为同一处理器内线程组的逻辑号,tid为各核组在线程组内的逻辑号。根据主线程及其从属线程核组号,设置每个线程组的掩码cgmask,掩码有cg_num位,本线程组包含的核组号对应的位为1,其余位置为0。可根据用户传递的主线程掩码完成设置,参见图1。
[0015]
4、使用共享模式运行并行程序,每个核组为一个进程。当需要进入线程状态时,同一线程组内的核组同时调用master_enter接口,该接口接收三个参数,分别为host、线程组掩码cgmask和线程组参数地址master_parameter[gid]。各核组通过host判断自身为主线程还是从属线程,从属线程调用master_waiting_for_task接口进入线程等待状态,主线程通过线程组同步等待线程组初始化完毕,参见图2。
[0016]
5、从属线程调用的master_waiting_for_task接口接收两个参数,分别为线程组掩码和参数列表地址。该接口中,从属线程首先将本核组对应的__master_pc状态修改为_status_wait,然后通过线程组同步等待主线程和其他从属线程完成初始化,而后进入任务等待状态:从属线程读取__master_pc[cgid]状态,如果为__status_wait则继续等待任务;否则如果为__status_quit则退出任务等待状态;否则根据__master_pc[cgid]记录的pc和参数列表地址执行主线程分配的任务;任务执行完毕后通过线程组同步等待线程组内其他线程执行完毕,而后将__master_pc[cgid]状态恢复为__status_wait,继续等待任务,参见图3。
[0017]
6、需要多线程并发处理时,主线程调用master_spawn接口为线程组分派任务,根据线程组掩码将需要分派给线程组的任务pc写入线程组在__master_pc数组中的对应位置,参数列表写入master_parameter[cgid]。该接口为非阻塞接口。主线程调用该接口完毕后立即返回,可以选与从属线程协同处理任务,也可以进行其他计算任务或收发来自其他线程组的消息;从属线程基于主线程提供的任务pc和参数表执行任务,参见图4。
[0018]
7、主线程调用master_join,通过线程组掩码和线程组同步等待从属线程执行完毕,将自身__master_pc状态恢复为__status_wait,然后等待线程组内所有线程的状态恢复为__status_wait。该接口为阻塞接口,参见图5。
[0019]
8、当需要退出线程状态时,主线程调用master_leave接口,根据线程组掩码释放线程组内线程,将线程组内所有核组的__master_pc状态置为__status_quit。执行完毕后,各核组恢复进程状态,可以根据进程号继续执行任务,参见图6。
[0020]
9、该机制的函数接口原型和典型使用方式如图7所示。
[0021]
本专利提出的多线程机制仅有4个用户接口,使用简便,易学易用;无需系统调用,仅通过共享内存上的状态切换与参数传递实现,开销小;处理器内进程组、线程组大小均可设置,灵活性高;基于共享模式运行程序,无需修改底层软件栈;可以实现
ꢀ“
即用即取、用完即走”的多线程加速模式,按需申请、回收线程组,随时切换进程、线程状态,更贴合用户编程习惯,能够有效支撑三级并行编程模型应用的开发。
[0022]
采用上述一种异构众核上基于主-从模型的轻量级多线程机制时,其以共享模式为基础,利用处理器共享内存,能够在尽量不修改底层软件栈的前提下,实现线程“即用即取、用完即走”的使用模式,为用户提供方便使用、更加灵活、开销更低的片内多线程解决方案,可避免大范围、长周期修改底层支撑软件可能造成的错误引入、服务中断、用户开发进度延误等负面影响,能够快速为用户提供三级并行编程接口与服务,且轻量级服务机制“即用即取、用完即走”的特性避免了传统多线程机制频繁调用fork/join/bind等系统调用和频繁创建、销毁线程带来的性能开销,可使用户获得更好的多线程加速效果。
[0023]
为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:异构众核芯片:将少量承担管理、通信和运算功能的通用主核核心和大量承担运算功能的精简从核核心集成在一颗完整芯片上的高性能异构中央处理器;通用主核核心运行通用的操作系统,主要承担整个芯片的管理和控制功能,也承担一定的运算功能和芯片与外部的通信功能;从核核心起到加速计算的功能。
[0024]
核组:由一个主核核心、若干由其管理的从核核心及其配套外围部件构成的结构称为核组,一颗申威异构众核芯片由多个核组组成。
[0025]
进程:操作系统进行资源分配和调度的基本单位,是指令、数据及其组织形式的描述,是程序的实体。
[0026]
线程:操作系统能够进行运算调度和分派的最小单位,包含于进程之中,是进程中的实际运作单位;线程指的是进程中一个单一顺序的控制流,是程序执行的最小单元,一个进程可以并发多个线程,每个线程执行不同的任务。
[0027]
多线程:指从软件或硬件上实现多个线程并发执行的技术,本专利中多线程指软件多线程。
[0028]
作业:需要运行的程序称为作业。
[0029]
阻塞函数/非阻塞函数:阻塞函数指函数调用后、任务完成前函数会一直挂起,直至任务完成才会返回调用点;非阻塞函数是指函数调用后立即返回调用点。
[0030]
pc:程序计数器,用于存放下一条指令所在的地址,c语言中函数的pc即为函数名。
[0031]
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献