技术领域
[0001] 本发明涉及异构计算技术领域,尤其涉及一种支持优先级的GPU线程束的同步方法及系统。
相关背景技术
[0002] 在现代计算机系统中,图形处理单元(GPU)作为加速计算的关键组件,广泛应用于图形渲染、科学计算、人工智能和大数据处理等领域。随着GPU计算任务的复杂性和规模的不断增加,如何高效地管理和调度GPU线程成为了一个重要问题。在GPU中,为了提高计算效率和资源利用率,将线程划分为4个层次: 最底层为GPU线程(thread);较高一层为线程束(warp/wavefront),由一定数量的GPU线程组成(通常为32个)。多个线程束进一步组成线程块;多个线程块进一步组成网格(grid)。其中,一个线程束由一组同时执行的线程组成,这些线程在同一个时钟周期内执行相同的指令。
[0003] 在同一个线程块内,不同的线程束之间可能会为争夺某些公共存储资源而出现数据竞争,即不同的线程束对共享数据进行互斥访问。为了实现这一目的,主流的方案为:采用一些原子操作为共享数据设置互斥锁,当共享数据未上锁时,访问它的线程束通过原子操作可以给数据上锁,以防止访问期间其他线程束对数据的访问。若线程束得不到某个互斥锁,则会释放掉它获得的所有锁并在一段时间后再次尝试获得该锁,这一现象被称为同步失败。不难看出,当某线程束同步失败后,会造成额外的执行开销并降低并行度。
[0004] 在当前的互斥锁方案中,大多没有考虑不同线程束的优先级问题,这导致所有同步失败的线程束必须等待其他线程束主动释放或者因占用互斥锁时间过长而被动释放互斥锁后才能继续向下运行,对于实时性要求较低的任务,这种处理方式的影响较小,而当处理某些实时性要求较高的任务时,这种方式通常不满足实时性要求。
具体实施方式
[0019] 为了使本技术领域的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
[0020] 本发明实施例提供了一种支持优先级的GPU线程束的同步方法,如图1所示,支持优先级的GPU线程束的同步方法具体包括步骤S101‑S104:S101、为同一线程块中的若干个线程束分配任务,并基于分配的任务设置各个线程束的优先级。
[0021] 具体地,获取分配给每个线程束的任务的实时性要求等级。按照实时性要求等级由高到低的顺序,通过竞争优先级寄存器,对分配了任务的若干个线程束设置相应的优先级。其中,接收到高实时性要求等级任务的线程束设置为高优先级。接收到相同实时性要求等级任务的两个或多个线程束的优先级也相同。
[0022] 作为一种可行的实施方式,本发明为线程块中的每个线程束均设置一个竞争优先级寄存器(Competitive Priority Register,CPR),在主机为线程束分配任务的同时,通过设置CPR指定每个被分配了任务的线程束的优先级。优先级可以用正整数表示,0代表最高优先级,数值越大,优先级越小。
[0023] 在一个实施例中,假设2个不同实时性要求的任务为任务A和任务B,分别分配给线程束A和线程束B。若任务A的实时性要求等级高于任务B的实时性要求等级,那么线程束A的优先级高于线程束B的优先级。若任务A的实时性要求等级等于任务B的实时性要求等级,那么线程束A的优先级等于线程束B的优先级。若任务A的实时性要求等级低于任务B的实时性要求等级,那么线程束A的优先级低于线程束B的优先级。
[0024] S102、检测当前线程束申请的互斥锁的锁定状态;其中,锁定状态为未被锁定或已被锁定。
[0025] 具体地,获取当前线程束申请的互斥锁的最高存储位的数值。若最高存储位的数值为0,则确定互斥锁未被锁定,即当前没有线程束占用互斥锁。若最高存储位的数值为1,则确定互斥锁已被锁定,即当前已有线程束在占用互斥锁。
[0026] 进一步地,若互斥锁未被锁定,则直接获取互斥锁执行互斥任务,并将当前线程束的ID存储到互斥锁的其余存储位中。
[0027] 作为一种可行的实施方式,在当前线程束获取到互斥锁后,每向前执行一个任务指令,则将当前线程束中的计数线程的计数值加一;计数值的初始值为0。当计数值达到预设上限后,控制当前线程束释放互斥锁,并将计数值清零。
[0028] S103、若互斥锁已被锁定,则基于线程束的优先级,对当前线程束与正在占用互斥锁的线程束进行仲裁。
[0029] 具体地,在线程块中设置一个仲裁装置,并在仲裁装置中设置FIFO队列。若互斥锁正在被占用,则在互斥锁中获取正在占用互斥锁的线程束的ID。
[0030] 进一步地,将正在占用互斥锁的线程束的ID与当前线程束的ID存储到仲裁装置中。然后通过仲裁装置,比较正在占用互斥锁的线程束与当前线程束的优先级,以进行仲裁。
[0031] 作为一种可行的实施方式,将正在占用互斥锁的线程束的ID与当前线程束的ID存储到仲裁装置中,具体包括:将正在占用互斥锁的线程束的ID与当前线程束的ID组成一个线程束ID对,并作为一个元素存储进仲裁装置的FIFO队列中。通过仲裁装置依次取出FIFO队列中的元素并进行仲裁。
[0032] S104、根据仲裁结果,判断当前线程束能否获取互斥锁。
[0033] 具体地,若当前线程束的优先级高于正在占用互斥锁的线程束的优先级,则向正在占用互斥锁的线程束发出释放互斥锁的信号,以使该线程束释放所有取的互斥锁,并使当前线程束获取互斥锁执行互斥任务。
[0034] 若当前线程束的优先级等于或低于正在占用互斥锁的线程束的优先级,则令当前线程束等待互斥锁,并释放掉已经获取的所有互斥锁。
[0035] 作为一种具体的实施方式,图2为本发明实施例提供的一种支持优先级的GPU线程束的同步方法具体实施方式流程图,如图2所示,本方法的具体流程如下:1、图3为本发明实施例提供的一种支持优先级的GPU线程束的同步系统的具体架构示意图,如图3所示,为线程块中的每个线程束设置一个竞争优先级寄存器(Competitive Priority Register,CPR),在主机为线程束分配任务的同时,通过设置CPR指定了每个被分配了任务的线程束的优先级,这里将优先级用正整数表示,0代表最高优先级,数值越大,优先级越小。
[0036] 2、执行每个线程束的同步任务,申请互斥锁。
[0037] 3、检查互斥锁是否可用。互斥锁的最高位表示当前是否处于锁定状态,0表示未锁定,1表示锁定,其余位存储获得该互斥锁的线程束ID。
[0038] 4、若互斥锁可用,则直接执行互斥任务。
[0039] 5、若互斥锁不可用,线程束在执行具有同步操作的任务时同步失败,它不会立刻释放掉所有已经获得的互斥锁,而是通过互斥锁中存储的线程束ID值找出当前已经获得该互斥锁的线程束ID,并将该ID和该线程束本身ID发送给仲裁装置。如图3所示,本发明在线程块中设置一个仲裁装置,用来对需要和已经获得互斥锁的线程束的执行进行仲裁。仲裁装置根据两个线程束的优先级确定是令已经获得互斥锁的线程束释放互斥锁还是令请求获得互斥锁的线程束进行等待。
[0040] 6、假设线程束A为请求获得互斥锁的线程束,和线程束B为已经获得互斥锁的线程束,确定的方法如下:若线程束A的优先级高于线程束B,则仲裁装置向线程束B发出释放互斥锁的信号,线程束B接收到该信号后释放掉所有取得的互斥锁。
[0041] 若线程束B的优先级等于或高于线程束A,则令线程束A等待并释放掉它已经取得的所有互斥锁。
[0042] 为了适应多个线程束同时申请仲裁的情况,如图3所示,本发明在仲裁装置里设置了FIFO队列,FIFO队列中的每个元素为一个由请求获得互斥锁的线程束的ID和已经获得互斥锁的ID组成的线程束ID对。仲裁装置将依次处理FIFO中的请求。
[0043] 进一步地,本发明在每个线程束中预留出一个线程,线程束获取到互斥锁后,每向前执行一个指令,该线程计数加1,线程束释放掉互斥锁后,计数值清0。当计数值达到上限后,线程束释放掉所有取得的互斥锁,以令其他同优先级的正在等待的任务继续执行。
[0044] 为了使本发明的流程更加清楚明白,下面通过两个线程束同步的例子对同步流程进行说明:假设2个不同实时性要求的任务为任务A和任务B,任务A的实时性要求高于任务B的实时性要求。线程束B首先申请互斥锁。
[0045] S1、将任务A、B分配给线程束0、1,并设置线程束0的优先级为0,线程束1的优先级为1。
[0046] S2、线程束1申请互斥锁,此时互斥锁的最高位值为0,说明互斥锁可用。线程束1获取互斥锁,并将该互斥锁的最高位值改为1,将线程束1的ID:0x1存储到互斥锁的其余存储位中。同时线程束1中的计数线程开始计数。
[0047] S3、在线程束1运行过程中,线程束0申请同一互斥锁,此时互斥锁被线程束1占用。
[0048] S4、线程束0将互斥锁中存储的线程束ID 0x1,以及本线程束的ID 0x0存储进仲裁装置的请求FIFO队列中。
[0049] S5、仲裁装置检测到FIFO队列非空,开始处理仲裁请求,判断线程束0的优先级高于线程束1。
[0050] S6、仲裁装置向线程束1发出释放互斥锁的信号。
[0051] S7、线程束1接收到释放互斥锁的信号,将互斥锁释放。
[0052] S8、线程束0请求仲裁成功,获取互斥锁,继续执行任务,同时线程束0中的计数线程开始计数。
[0053] 另外,本发明实施例还提供了一种支持优先级的GPU线程束的同步系统,如图4所示,支持优先级的GPU线程束的同步系统400具体包括:优先级设置模块410,用于为同一线程块中的若干个线程束分配任务,并基于分配的任务设置各个线程束的优先级;
仲裁模块420,用于检测当前线程束申请的互斥锁的锁定状态;其中,所述锁定状态为未被锁定或已被锁定;若所述互斥锁已被锁定,则基于线程束的优先级,对当前线程束与正在占用所述互斥锁的线程束进行仲裁;根据仲裁结果,判断当前线程束能否获取所述互斥锁。
[0054] 如图3所示,本发明在每个线程块中设置了一个仲裁装置,用来对需要和已经获得互斥锁的线程束的执行进行仲裁,其中包含设定的仲裁逻辑。为了适应多个线程束同时申请仲裁的情况,在仲裁装置里设置了FIFO先进先出队列,FIFO中的每个元素为一个由请求获得互斥锁的线程束的ID和已经获得互斥锁的ID组成的线程束ID对,仲裁装置将依次处理FIFO中的请求。
[0055] 本发明还在每个线程束中预留出了一个计数线程,线程束获取到互斥锁后,每向前执行一个指令,该计数线程的计数加1,线程束释放掉互斥锁后,计数值清0。当计数值达到上限后,线程束释放掉所有取得的互斥锁,以令其他同优先级的正在等待的任务继续执行。计数线程的设置能够保证互斥锁不会被同一个线程束占用太久,保障其他线程束的实时性。
[0056] 上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0057] 为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0058] 本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0059] 还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0060] 本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0061] 本发明中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0062] 上述对本发明特定实施例进行了描述。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0063] 以上所述仅为本发明的实施例而已,并不用于限制本发明。对于本领域技术人员来说,本发明的实施例可以有各种更改和变化。凡在本发明实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。