CN121167101A - 矩阵乘法任务执行方法、装置、设备、介质及程序产品 - Google Patents
矩阵乘法任务执行方法、装置、设备、介质及程序产品Info
- Publication number
- CN121167101A CN121167101A CN202511700346.7A CN202511700346A CN121167101A CN 121167101 A CN121167101 A CN 121167101A CN 202511700346 A CN202511700346 A CN 202511700346A CN 121167101 A CN121167101 A CN 121167101A
- Authority
- CN
- China
- Prior art keywords
- register
- thread
- task
- matrix
- thread bundle
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Advance Control (AREA)
Abstract
本申请公开了一种矩阵乘法任务执行方法、装置、设备、介质及程序产品,其中,所述方法应用于图形处理器中的处理器单元,所述方法包括:在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器;生成用于执行所述矩阵乘法任务的至少两类第二线程束;所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
Description
技术领域
本申请涉及处理器技术领域,尤其涉及一种矩阵乘法任务执行方法、装置、设备、存储介质及计算机程序产品。
背景技术
随着人工智能和高性能计算领域的快速发展,矩阵乘法作为计算密集型任务的核心操作,其执行效率直接影响深度学习训练、科学模拟等应用的性能。图形处理器凭借其大规模并行计算架构,成为加速矩阵乘法的关键硬件平台。矩阵乘法中涉及的高维数据交互与计算依赖关系,对GPU的硬件资源管理和线程调度机制提出了严峻挑战。
发明内容
有鉴于此,本申请实施例至少提供一种矩阵乘法任务执行方法、装置、设备、存储介质及程序产品。
本申请实施例的技术方案是这样实现的:
一方面,本申请实施例提供一种矩阵乘法任务执行方法,应用于图形处理器中的处理器单元,所述方法包括:在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器;生成用于执行所述矩阵乘法任务的至少两类第二线程束;所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
另一方面,本申请实施例提供一种矩阵乘法任务执行装置,应用于图形处理器中的处理器单元,所述装置包括:执行模块,用于在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器;生成模块,用于生成用于执行所述矩阵乘法任务的至少两类第二线程束;所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
再一方面,本申请实施例提供一种计算机设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法中的部分或全部步骤。
又一方面,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法中的部分或全部步骤。
又一方面,本申请实施例提供一种计算机程序产品,包括计算机程序或指令,所述计算机程序或指令被处理器执行时,实现上述方法中的部分或全部步骤。
本申请实施例中,在处理器单元执行矩阵乘法任务时,通过为矩阵乘法任务分配目标寄存器,并生成至少两类第二线程束,可以实现对任务资源的有效管理和任务的并行化处理;同时,通过使至少两类第二线程束异步执行矩阵乘法任务,并利用包括共用寄存器的目标寄存器存储执行过程中的中间结果,可以使得不同功能的线程束能够协同工作,且共用寄存器对各类线程束可见,避免了中间结果在片上共享缓冲和线程束私有寄存器之间的频繁搬移,从而节省了片上带宽。基于本申请提供的实施例,可以显著提高矩阵乘法任务的执行效率,减少资源开销,并通过任务的异步并行执行提升处理器单元的整体处理能力。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本申请的技术方案。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,这些附图示出了符合本申请的实施例,并与说明书一起用于说明本申请的技术方案。
图1A为本申请实施例提供的一种图形处理器的架构示意图;
图1B为本申请实施例提供的一种处理器单元的架构示意图;
图1C为本申请实施例提供的一种矩阵乘法的示意图;
图1D为本申请实施例提供的一种矩阵乘法过程中数据加载延迟的示意图;
图1E为本申请实施例提供的一种矩阵乘法的流水示意图;
图2为本申请实施例提供的一种优化后的矩阵乘法的流水示意图;
图3为本申请实施例提供的另一种优化后的矩阵乘法的流水示意图;
图4为本申请实施例提供的一种矩阵乘法任务执行方法的实现流程示意图一;
图5为本申请实施例提供的一种矩阵乘法任务执行方法的实现流程示意图二;
图6为本申请实施例提供的一种线程束的执行流程示意图;
图7为本申请实施例提供的一种寄存器分配器架构;
图8为本申请实施例提供的一种基于到达指令和等待指令的线程异步等待方案示意图;
图9为本申请实施例提供的一种矩阵乘法任务执行装置的组成结构示意图;
图10为本申请实施例提供的一种计算机设备的硬件实体示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面结合附图和实施例对本申请的技术方案进一步详细阐述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。所涉及的术语“第一/第二/第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一/第二/第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请的目的,不是旨在限制本申请。
(1)图形处理器(Graphics Processing Unit,GPU):一种专门用于处理图形和计算任务的处理器。与传统的CPU不同,GPU具有大量并行计算单元(如CUDA核心或AMD的CU),能够同时执行多个计算任务。GPU的设计使其非常适合处理大规模数据并行计算任务,例如图形渲染、机器学习和科学计算。
(2)Kernel:GPU上执行的程序代码,通常是一个函数或一段代码。Kernel是并行计算的核心,它定义了要执行的操作。当一个Kernel被调用时,它会生成大量的Work-item来执行具体的计算任务。Kernel的执行是通过Work-group进行组织和调度的。
(3)工作组(Work-group):GPU上的一个逻辑单位,由多个Work-item组成。Work-group的主要作用是将Kernel的执行任务划分为更小的单元,以便更好地利用GPU的并行计算能力。
(4)线程束(Wave):Wave是GPU上线程调度的基本单位,通常由32或64个Work-item组成(取决于GPU架构)。Wave是硬件层面的执行单元,多个Wave可以同时在不同的计算单元上执行。
(5)线程(Work-item):GPU上执行任务的最小单位,通常对应于单个线程或SIMD中的一个元素。每个Work-item都有一个独立的ID,并执行Kernel中定义的计算任务。
本申请提供的矩阵乘法任务通过图形处理器实现。在一些实施例中,参考图1A中图形处理器为例。图形处理器100包括多个处理器集群(Processor Cluster,PC)101(如4个),每个处理器集群101可以包括多个处理器执行引擎(Processor Execution Engine,PX)102(如4个),每个处理器执行引擎102又可以包括多个处理器单元(Processor,P)103(如2个)。
每个处理器集群101中的多个处理器执行引擎102共享一个L2缓存104。图形处理器100的主内存实现为L3缓存105。
参考图1B,每个处理器单元103可以包括:张量计算引擎1031、张量存储引擎1032、L1缓存1033和寄存器1034。
请参阅图1C,其示出了一种矩阵乘法的示意图。记矩阵A维度为M*K,矩阵B维度为N*K在GPU等并行加速结构中,通常矩阵乘法会拆分成小块,每个C_tile会放在一个Processor(P0)中计算结果,计算过程需要累加C_tile0=A0*B0+A1*B1+A2*B2+…+An-1*Bn-1。
在执行累加过程中通常每个循环(K loop)是加载AK(load AK)->加载BK(loadBK)->累加(AK*BK)(calculate AK*BK+ACC)。在原始的实现中,数据加载的过程会暴露出来,如图1D中的数据加载延迟。
相关技术中,针对GPU矩阵乘法优化思路,通常为多级buffer预取,通过软流水来隐藏延迟,如图1E中以double buffer为例的优化方案。
理想状态下,double buffer的编程模型中,同一个线程束(wave)在第K次循环开始先发出数据加载指令,加载K+1次循环的数据,然后再等待上次循环中发送的数据ready,开始计算,累加(AK*BK)(calculate AK*BK+ACC)。计算完成后再进入下次循环,发出加载K+2次循环所用数据的指令,依次循环。
然而,相关技术中多级buffer的软件流水方案至少存在以下问题:
(1)虽然通过流水方式把下次循环的数据预加载到片上buffer中,但是在热循环(HOTLOOP)中LOAD指令和计算指令存在明显的同步关系,下次数据的加载需要等本次计算指令完成,如图2中的等待间隔时间。同时因为同一个线程束(wave)需要发射load指令和计算指令,load指令的发射可能也会影响计算指令的开始时间。
(2)在热循环的结尾,通常会对累加和做后处理,然后写出。同一个Processor会开始后续tile的执行,对每个tile重复预加载(prolog)->热循环->后处理(epilog)的过程。在两个tile之间会暴露出后处理(epilog)和预加载(prolog)的时间,如图2中的两个tile之间的间隔时间,随着处理器算力密度的增加,热循环执行会越来越快,前后两端的暴露时间会变得更严重。处理器整体算力效率会降低的比较明显。
为了解决上述技术问题,本申请实施例提供一种新的编程模式让同一个kernel的多个线程束(wave)异步执行不同的数据加载,计算,后处理及写出过程,消除因为各个阶段(stage)假依赖造成的时间浪费,尽可能使各个阶段的时间重叠以达到最高的计算效率。
在一些实施例中,执行同一个kernel(代码段)多个线程束(wave)拥有相同的配置(主要是寄存器堆大小),并且多个线程束(wave)的私有寄存器互相隔离,只有共享的片上buffer可见。但是在异步编程模型中,加载线程束(Load wave)只需要进行数据加载计算地址并发射LOAD指令;计算线程束(Math wave)需要进行计算并把乘累加结果存储在寄存器堆中;存储线程束(Store wave)从乘累加结果在寄存器堆中处理并写出。
如图3所示,在加载任务完成A0和B0加载之后,表示第0次循环的数据已经准备好,计算任务可以进行第0次循环的累加过程(ACC+=A0*B0),相应地,在加载任务完成A1和B1加载之后,表示第1次循环的数据已经准备好,计算任务可以进行第1次循环的累加过程(ACC+=A1*B1),以此类推,在计算任务完成第K次循环的累加过程之后,tile0的热循环结束,由存储任务完成后续的后处理(epilog),如图3中的后处理和量化,D = ACC *缩放+偏移。
其中,如果乘累加结果存在片上共享buffer中,不可避免的存在计算任务(Mathwave)和存储任务(Store wave)中需要将乘累加结果在片上共享buffer和寄存器堆中来回搬移,浪费带宽。
考虑到三种不同类型的线程束(wave)执行不同业务,所需的寄存器资源也不相同,如果按照三种业务中最大的寄存器需求来分配,会浪费寄存器资源。
本申请实施例提供一种矩阵乘法任务执行方法,该方法可以由计算机设备的处理器执行。其中,计算机设备指的可以是服务器、笔记本电脑、平板电脑、台式计算机、智能电视、机顶盒、移动设备(例如移动电话、便携式视频播放器、个人数字助理、专用消息设备、便携式游戏设备)等具备数据处理能力的设备。
图4为本申请实施例提供的一种矩阵乘法任务执行方法的实现流程示意图一,如图4所示,该方法包括如下步骤S401和步骤S402,将结合图4示出的步骤进行说明。
步骤S401、在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器。
步骤S402、生成用于执行所述矩阵乘法任务的至少两类第二线程束;所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
这里,所述至少两类第二线程束异步执行所述矩阵乘法任务;所述目标寄存器包括共用寄存器,所述共用寄存器对所述至少两类第二线程束可见,所述共用寄存器用于存储在执行所述矩阵乘法任务中的中间结果;在一些实施例中,该中间结果为执行矩阵乘法任务的过程中,得到的但不作为最后输出的结果,示例性地,该中间结果可以为乘累加结果。
在一些实施例中,请参阅图1B,处理器单元103中可以设置有寄存器1034,在处理器单元执行矩阵乘法任务的过程中,可以从该寄存器1034中为矩阵乘法任务分配对应的目标寄存器。
其中,该矩阵乘法任务为在图形处理器上对两个输入矩阵(例如后续实施例中的第一矩阵和第二矩阵,示例性地,维度可以分别为M×K和N×K)执行乘法运算,以得到目标矩阵的操作。在一些实施例中,上述两个输入矩阵的乘法任务可以以目标矩阵为基础进行拆分,得到多个子任务,每个子任务处理目标矩阵中的矩阵块。可以理解的是,这里的矩阵乘法任务可以为得到目标矩阵的乘法任务,也可以为得到目标矩阵中矩阵块的乘法任务。
在一些实施例中,一类第二线程束中的线程束数量可以为一个,也可以为多个,不同类别的第二线程束的数量可以相同,也可以不同。示例性地,若存在A类别的第二线程束和B类别的第二线程束,A类别的第二线程束数量可以为1个,B类别的线程束的数量可以为5个。可以理解的是,线程束中可以包括多个线程。
在一些实施例中,上述至少两类第二线程束用于异步执行所述矩阵乘法任务。其中,一类第二线程束中的各个线程束可以实现相同的功能,不同类别的第二线程束之间可以实现不同的功能。
为了理解各个第二线程束之间的关系,以下以存在三类第二线程束为例进行说明:
示例性地,上述至少两类第二线程束可以包括加载线程束、计算线程束和存储线程束。其中,加载线程束用于执行数据预加载(如从系统内存加载矩阵块到共享内存);计算线程束用于执行乘累加(MAC)操作;存储线程束用于将负责结果写回系统内存。
在当前场景中,上述矩阵乘法任务被解耦为三个阶段,分别为加载阶段、计算阶段和存储阶段。通过并行执行上述三个阶段,以实现执行矩阵乘法任务的并行执行。例如,请参阅图3,以下过程可以并行执行:加载线程束处理tile1的A1B1的加载、计算线程束处理tile1的A0B0的乘累加、存储线程束处理tile0的后处理及存储。
考虑到在线程束之间的寄存器隔离时,需要将矩阵乘法计算过程中的中间结果(如乘累加结果)在片上共享缓冲和线程束的私有寄存器之间来回搬移的情况,为了节省片上带宽,在本申请实施例中,可以在处理器单元的寄存器中为各个第二线程束分配一个目标寄存器,并且,该目标寄存器中包括共用寄存器。通过将上述中间结果存储于该共用寄存器,由于该共用寄存器对所述至少两类第二线程束可见,因此,不存在将矩阵乘法计算过程中的中间结果在片上共享缓冲和线程束的私有寄存器之间来回搬移的情况,节省了片上带宽。
本申请实施例中,在处理器单元执行矩阵乘法任务时,通过为矩阵乘法任务分配目标寄存器,并生成至少两类第二线程束,可以实现对任务资源的有效管理和任务的并行化处理;同时,通过使至少两类第二线程束异步执行矩阵乘法任务,并利用包括共用寄存器的目标寄存器存储执行过程中的中间结果,可以使得不同功能的线程束能够协同工作,且共用寄存器对各类线程束可见,避免了中间结果在片上共享缓冲和线程束私有寄存器之间的频繁搬移,从而节省了片上带宽。基于本申请提供的实施例,可以显著提高矩阵乘法任务的执行效率,减少资源开销,并通过任务的异步并行执行提升处理器单元的整体处理能力。
在一些实施例中,所述方法还包括:响应于所述矩阵乘法任务被分配至所述处理器单元,生成第一线程束;所述第一线程束执行的任务为执行所述第二线程束的任务做准备。
在一些实施例中,所述第一线程束用于执行第一阶段指令;至少两类第二线程束用于执行第二阶段指令;所述矩阵乘法任务通过所述第一阶段指令和所述第二阶段指令实现。其中,所述共用寄存器对所述第一线程束可见;所述第一阶段指令被所述第二阶段指令依赖。
在本申请实施例中,该矩阵乘法任务对应的指令可以包括所述第一阶段指令和所述第二阶段指令,其中,通过第一阶段指令可以至少完成资源初始化;通过第二阶段指令可以至少完成异步并行计算。由于在执行第二阶段指令的过程中,至少需要访问第一阶段指令初始化的寄存器,因此,第一阶段指令的完成是后续第二阶段指令启动的必要条件,所述第一线程束执行的任务为执行所述第二线程束的任务做准备,也就是说,所述第一阶段指令和所述第二阶段指令之间存在依赖关系,且所述第一阶段指令被所述第二阶段指令依赖。
其中,该第一阶段指令还用于生成各所述第二线程束均需要使用的共用数据。
考虑到不同类的第二线程束在执行矩阵乘法任务的过程中,需要使用相同的共用数据,为了避免每一类第二线程束均需要生成该共用数据的资源消耗,本申请实施例通过设置第一线程束,并通过该第一线程束先统一生成该共用数据,并存储于共用寄存器中,这样,后续生成的各类第二线程束就可以直接从该共用寄存器中读取该共用数据。
在一些实施例中,在当前矩阵乘法任务用于计算目标矩阵中的矩阵块的情况下,该共用数据至少包括该矩阵块在目标矩阵中的位置范围。
可以理解的是,该共用寄存器对该第一线程束和第二线程束可见。
在一些实施例中,在处理器单元同时处理两个矩阵乘法任务的情况下,不同的矩阵乘法任务对应的目标寄存器相互独立/隔离。
在一些实施例中,所述目标寄存器为所述第一线程束在处理器单元中为所述矩阵乘法任务分配的,所述共用寄存器对所述第一线程束可见。
这里,矩阵乘法任务被分配至处理器单元,处理器单元响应任务分配,生成第一线程束,并且为矩阵乘法任务分配目标寄存器,目标寄存器对第一线程束可见(此时,还不存在该矩阵乘法任务对应的第二线程束)。
在一些实施例中,在分配该目标寄存器的过程中,还对该目标寄存器进行划分,至少划分出共用寄存器和该第一线程束对应的私有寄存器。该第一线程束可以同时访问该共用寄存器和该第一线程束对应的私有寄存器。
在一些实施例中,当第一线程束完成所有第一阶段指令的执行后,处理器单元会生成至少两类第二线程束,用于执行第二阶段指令。至少两类第二线程束通过异步并行执行第二阶段指令,可以提高计算效率。
其中,上述第二线程束的数量可以在第一阶段指令和第二阶段指令中定义,各个第二线程束的功能或类别可以在第二阶段指令中定义。
在一些实施例中,可以通过获取该矩阵乘法任务对应的指令地址来获取该第一阶段指令;相应地,可以基于该指令地址和指令偏移,确定该第二阶段指令的地址,进而获取该第二阶段指令。这里,该指令偏移可以基于第一阶段指令的地址和第二阶段指令的地址之间的地址差异确定。
本申请实施例中,通过响应于矩阵乘法任务被分配至处理器单元,并在处理器单元中为矩阵乘法任务分配目标寄存器,不仅可以实现寄存器资源的初始化,还可以生成不同类的第二线程束在执行矩阵乘法任务过程中需要使用相同的共用数据并存储于共用寄存器中,有效避免了每一类第二线程束均需要生成该共用数据所带来的资源消耗。
在一些实施例中,所述目标寄存器包括私有寄存器,所述私有寄存器包括第一线程束对应第一子寄存器,或,所述每一第二线程束对应的第二子寄存器;各所述第二子寄存器对其他线程束不可见所述目标寄存器包括每一线程束对应的私有寄存器;一个线程束对应的私有寄存器对其他线程束不可见。
在一些实施例中,该目标寄存器中可以包括第一线程束对应第一子寄存器,也可以包括每一个第二线程束对应的第二子寄存器。其中,不同的线程束之间私有寄存器互不可见,例如,第一线程束无法访问第二线程束对应的第二子寄存器,第二线程束也无法访问第一线程束对应的第一子寄存器;对于不同类的第二线程束,A类别的第二线程束无法访问B类别的第二线程束对应的第二子寄存器,同时,B类别的第二线程束无法访问A类别的第二线程束对应的第二子寄存器。
在一些实施例中,在同一个类别的不同第二线程束之间,第二子寄存器可以相互可见。在当前实施例中,同一个类别的不同线程束之间,可以通过同步机制(如屏障指令等方式)来对相同的寄存器进行操作。
在另一些实施例中,在同一个类别的不同第二线程束之间,第二子寄存器可以互不可见。
示例性地,为了提高矩阵乘法任务的计算效率,针对实现计算过程的第二线程束,可以设置两个或两个以上的数量,进而实现了至少两个线程束并行执行计算阶段的效果。
在本申请实施例中,通过在目标寄存器中设置共用寄存器和私有寄存器,其中,共用寄存器对各类线程束可见,避免了乘累加结果在片上共享缓冲和线程束私有寄存器之间的频繁搬移,从而节省了片上带宽;而私有寄存器可以使得每个线程束拥有独立的存储空间,用于存放各自的私有数据和临时变量,减少了数据竞争和冲突,使得线程束之间的计算互不影响,提高程序的稳定性和可靠性。
在一些实施例中,所述矩阵乘法任务分块执行,计算第一矩阵中的第一部分矩阵和第二矩阵中的第二部分矩阵之间的乘积以得到目标矩阵块;所述第一线程束用于计算所述目标矩阵块在第三矩阵中的位置,并存储于所述共用寄存器;所述第三矩阵为所述第一矩阵和第二矩阵的乘积。
其中,矩阵乘法任务是指将两个矩阵的对应元素通过线性组合生成第三个矩阵的运算过程。上述第一线程束可以通过第一阶段指令计算所述目标矩阵块在第三矩阵中的位置。
上述矩阵乘法任务分块执行指的是,在执行第一矩阵和第二矩阵之间的矩阵乘法的过程中,以分块的方式计算第三矩阵中的各个部分,进而可以得到最终的第三矩阵;这里第三矩阵的部分即为目标矩阵块。相应地,在计算目标矩阵快的过程中,也是通过计算第一矩阵中的第一部分矩阵和第二矩阵中的第二部分矩阵之间的乘积得到的;这里的第一矩阵中的第一部分矩阵也是第一矩阵中的部分,第二矩阵中的第二部分矩阵也是第二矩阵中的部分。
请参阅图1C,第一矩阵(A)和第二矩阵(B)可以进行矩阵乘法得到第三矩阵(C)。为了提高计算效率,可以将第三矩阵C划分为多个子块,其中,目标矩阵块为图1C中的C_tile,记为;相应地,在分块矩阵乘法策略下,第一部分矩阵可以为将原第一矩阵划分出的子块,例如,若第一矩阵为A(维度M×K),其第一部分矩阵可以为(维度n×k,n<N,k<K);第二部分矩阵是第二矩阵划分的子块,例如,若第二矩阵为B(维度K×N),其第二部分矩阵可以为(维度k×m,m<M),如此,可以将多个子块乘积累加得到。
在一些实施例中,目标矩阵块在第三矩阵中的位置,至少用于确定目标矩阵块在第三矩阵中的矩阵元素。示例性地,若按照分块策略将第三矩阵划分为多个子块,每一个子块均存在一个位置索引,以图1C中的为例,该目标矩阵块的位置索引可以包括i和j;若m×n为分块大小,则目标矩阵块在第三矩阵中的起始位置可以为(i×m,j×n)。
在一些实施例中,可以将上述目标矩阵块的位置索引存储于目标寄存器,也可以将目标矩阵块在第三矩阵中的起始位置存储于目标寄存器。后续的第二线程束可以基于该目标矩阵块在第三矩阵中的位置,确定需要读取的第一部分矩阵、第二部分矩阵,或者,在进行分块乘累加的过程中,确定每一次乘累加过程中的需要读取第一部分矩阵和从第二部分矩阵;还可以确定乘累加过程中,乘累加结果在目标寄存器中的位置;还可以确定目标矩阵块在系统内存中的内存地址。
在本申请实施例中,通过第一线程束计算目标矩阵块在第三矩阵中的位置,并将该位置信息存储于目标寄存器,可以为后续的计算过程提供准确的位置参考;同时,可以是后续的至少两类第二线程束能够基于共同的位置信息来正确地读取、处理和存储数据。
在一些实施例中,所述矩阵乘法任务至少包括以下子任务:加载任务、累加任务和存储任务;一类第二线程束用于执行所述子任务中的至少之一,不同的第二线程束对应的子任务不同。
在本申请实施例中,可以将矩阵乘法任务划分为多个任务阶段,一个任务阶段作为一个子任务,通过将至少一个子任务分配给一类第二线程束,这样,通过将得到的多个子任务分配给不同的第二线程束来进行异步并行执行,可以充分利用并行计算资源的计算能力。
其中,上述加载任务是指在矩阵乘法过程中,至少用于从系统内存中读取矩阵元素到计算单元的任务,可以理解为数据准备阶段;累加任务用于执行乘法运算后的累加操作,以得到结果矩阵的一个元素值;存储任务是指在矩阵乘法完成后,用于将计算得到的结果矩阵元素写回系统内存的任务。
在一些实施例中,上述加载任务用于从系统内存中读取第一矩阵和第二矩阵的元素;累加任务用于执行矩阵元素的乘法运算和累加操作,以得到第三矩阵的元素;存储任务用于将计算得到的第三矩阵的元素写回内存。
在一些实施例中,一类第二线程束用于执行所述子任务中的至少之一。也就是说,各第二线程束均可以用于执行一个子任务,或者,一类第二线程束用于执行两个子任务,另一类第二线程束用于执行一个子任务。
示例性地,可以分配一个第二线程束负责加载任务,分配第二个第二线程束负责累加任务,分配第三个第二线程束负责存储任务。
又示例性地,一个第二线程束负责加载任务,分配第二个第二线程束负责累加任务和存储任务;或者,分配一个第二线程束负责加载任务和累加任务,分配第二个第二线程束负责存储任务;或者,分配一个第二线程束负责加载任务和存储任务,分配第二个第二线程束负责累加任务。
在本申请实施例中,通过将矩阵乘法任务分解为更小的子任务并分配给不同的第二线程束来并行执行,可以减少任务执行的总时间,提高计算吞吐量。
在一些实施例中,执行加载任务的第二线程束用于从系统内存中加载第一部分矩阵和第二部分矩阵至片上缓存;其中,所述执行加载任务的第二线程束对应的私有寄存器用于存储所述第一部分矩阵的第一内存地址和所述第二部分矩阵的第二内存地址。
其中,上述片上缓存是集成在处理器单元内部的高速存储单元,其访问速度远高于系统内存(System Memory),示例性地,可以为处理器单元内的共享寄存器或L1缓存。系统内存是计算机的主存储器(如动态随机存取存储器,Dynamic Random Access Memory,DRAM),用于存储矩阵乘法的输入矩阵(第一矩阵、第二矩阵)和输出矩阵(第三矩阵)。
在一些实施例中,执行加载任务的第二线程束可以基于第一部分矩阵的第一内存地址从系统内存中读取第一部分矩阵,并将其加载到片上缓存中;并且,可以基于第二部分矩阵的第二内存地址从系统内存中读取第二部分矩阵,并将其加载到片上缓存中。
需要说明的是,执行加载任务的第二线程束还可以获取上述第一内存地址和第二内存地址,并存储于执行加载任务的第二线程束对应的私有寄存器中。
在一些实施例中,在每次加载完成后,执行加载任务的第二线程束可以更新私有寄存器中的内存地址(例如递增偏移量);还可以通过屏障指令/同步指令通知执行累加任务的第二线程束数据已就绪。
在一些实施例中,第一部分矩阵和第二部分矩阵分别在片上缓存中的片上地址可以是基于预设规则预先设定好的。
上述实施例中,利用线程束的并行处理能力和私有寄存器存储内存地址的方式,可以高效地实现矩阵数据从系统内存到片上缓存的传输。
在一些实施例中,执行累加任务的第二线程束用于从片上缓存中加载第一部分矩阵和第二部分矩阵,以进行矩阵元素的乘法及累加过程;其中,所述执行累加任务的第二线程束对应的私有寄存器用于存储所述第一部分矩阵的第一片上地址和所述第二部分矩阵的第二片上地址。
在一些实施例中,执行累加任务的第二线程束可以基于第一部分矩阵的第一片上地址从片上缓存中读取第一部分矩阵,基于第二部分矩阵的第二片上地址从片上缓存中读取第二部分矩阵,进而进行矩阵元素的乘法及累加过程,得到当前循环(第k次)的乘累加结果,并将该乘累加结果存储于共用寄存器中。
需要说明的是,执行累加任务的第二线程束还可以获取上述第一片上地址和第二片上地址,并存储于执行累加任务的第二线程束对应的私有寄存器中,如前所述,第一部分矩阵的第一片上地址和第二部分矩阵的第二片上地址可以是基于预设规则预先设定好的,因此,加载任务在将这两个部分矩阵存储于片上缓存之后,累加任务可以基于相同的片上地址找到这两个部分矩阵。
在一些实施例中,在每次乘累加完成后,执行累加任务的第二线程束可以更新私有寄存器中的片上地址(例如递增偏移量),进而可以在片上缓冲上找到加载的下一次循环对应的第一部分矩阵和第二部分矩阵。
在一些实施例中,在完成第K次循环后,已经完成了目标矩阵块的计算,可以通过屏障指令/同步指令通知执行存储任务的第二线程束,数据已就绪。
在一些实施例中,上述乘累加结果在共用寄存器中的位置是基于预设规则预先设定好的。
在一些实施例中,所述中间结果包括乘累加结果,所述共用寄存器包括累加寄存器;所述累加寄存器用于存储执行累加任务的第二线程束产生的乘累加结果,所述第一线程束还用于对所述目标寄存器中的累加寄存器进行初始化。
其中,第一线程束还可以通过第一阶段指令初始化累加寄存器,将其设置为一个已知的初始值(如0)。之后,当执行累加任务的第二线程束执行累加任务时,将计算结果累加到累加寄存器中。这样,累加寄存器能够持续存储和更新乘累加结果,直到完成第K次循环。
上述实施例中,通过共用寄存器的设计,可以提高寄存器的利用率和计算效率,降低并行计算的开销。
在一些实施例中,执行存储任务的第二线程束用于从将共用寄存器中的乘累加结果写出至系统内存;其中,所述执行存储任务的第二线程束对应的私有寄存器用于存储所述目标矩阵块的第三内存地址。
在一些实施例中,执行存储任务的第二线程束可以累加寄存器在共用寄存器中的位置从共用寄存器中读取已经完成乘累加计算的乘累加结果,并写出到系统内存中。
进一步的,上述执行存储任务的第二线程束还可以再得到该乘累加结果之后,对该乘累加结果进行后处理,包括以下至少之一:缩放、偏移等。缩放是指将乘累加结果乘以一个缩放因子,以调整其数值范围。偏移是指在缩放后的结果上加上一个偏移量,以进一步调整结果值。这两个步骤可以合并为一个线性变换公式:D = ACC * 缩放 + 偏移,其中D是后处理得到的结果(即目标矩阵块),ACC是乘累加结果,缩放是缩放因子,偏移是偏移量。最后,执行存储任务的第二线程束可以将该后处理得到的结果写出至系统内存。
需要说明的是,执行存储任务的第二线程束还可以获取上述第三内存地址,并存储于执行存储任务的第二线程束对应的私有寄存器中。在一些实施例中,上述执行存储任务的第二线程束对应的私有寄存器还可以用于存储后处理过程中使用的参数,如缩放因子和偏移量等。
在一些实施例中,该第三内存地址可以是基于预设规则预先设定好的,与目标矩阵块在第三矩阵中的位置、以及第三矩阵在系统内存中的内存地址相关。
上述实施例中,可以实现乘累加结果从共用寄存器到系统内存的高效写入。
需要说明的是,上述执行加载任务的第二线程束、执行计算任务的第二线程束、执行存储任务的第二线程束可以为不同的第二线程束,也可以为相同的第二线程束。在为相同的第二线程束的情况下,表示该第二线程束可以同时执行至少两个子任务,例如,执行加载任务的第二线程束和执行计算任务的第二线程束是相同的第二线程束,则说明该第二线程束可以同时执行加载任务和计算任务。
在一些实施例中,所述目标寄存器为预设大小的物理空间;所述预设大小基于所述共用寄存器的第一大小和各所述线程束对应的私有寄存器的第二大小确定。
在一些实施例中,该目标寄存器可以同时包括第一线程束对应的私有寄存器和第二线程束对应的私有寄存器,也就是说,在第二线程束开始执行的时候,虽然此时不存在第一线程束,目标寄存器中仍存在该第一线程束的私有寄存器。因此,所述预设大小基于所述共用寄存器的第一大小、第一线程束的私有寄存器的第二大小、以及各所述第二线程束对应的私有寄存器的第二大小确定。示例性地,可以为上述所述共用寄存器的第一大小、第一线程束的私有寄存器的第二大小、以及各所述第二线程束对应的私有寄存器的第二大小之和。
在一些实施例中,所述目标寄存器为预设大小的物理空间;所述预设大小基于所述共用寄存器的第一大小和各所述第二线程束对应的私有寄存器的第二大小确定。
在一些实施例中,所述预设大小基于所述共用寄存器的第一大小和各所述第二线程束对应的第二子寄存器的第二大小确定。
其中,预设大小可以为在设计或配置阶段,为目标寄存器预先设定的大小。该预设大小是基于共用寄存器的第一大小和各所述第二线程束的私有寄存器(第二子寄存器)的第二大小来确定的,以确保目标寄存器能够容纳所有必要的数据。
在本申请实施例中,由于第一线程束和第二线程束属于先后执行的两个阶段的线程束,考虑到所有第二线程束的第二大小大于该第一线程束的私有寄存器的大小,可以在设计目标寄存器的预设大小时,仅考虑第二线程束对应的私有寄存器的第二大小。也就是说,目标寄存器中的非共用寄存器的一部分寄存器在第一线程束的执行过程中,作为第一线程束的私有寄存器,在第二线程束的执行过程中,这一部分寄存器作为第二线程束对应的私有寄存器。也就是说,在目标寄存器中,存在一个私有寄存器被第一线程束和第二线程束复用,在第一线程束生成时,该私有寄存器为第一线程束的第一子寄存器;在第二线程束生成时,该私有寄存器为第二线程束的第二子寄存器。
在一些实施例中,所述第一线程束的逻辑地址范围为所述共用寄存器的逻辑地址范围和所述第一子寄存器的逻辑地址范围之和;所述第一线程束的逻辑地址范围为所述共用寄存器的逻辑地址范围和对应的所述第二子寄存器的逻辑地址范围之和。
其中,线程束的逻辑地址范围由两部分组成:共用寄存器(公共空间)的第一大小和私有寄存器(私有空间)的第二大小。相应地,一个线程束的逻辑地址范围可以通过以下方式确定:逻辑地址范围=共用寄存器起始地址至共用寄存器结束地址+私有寄存器起始地址至私有寄存器结束地址。
示例性地,若公共寄存器占0x0000-0x0FFF(4KB),第一线程束或第二线程束私有寄存器占0x1400-0x17FF(1KB),则该第一线程束或第二线程束的逻辑地址范围为0x0000-0x13FF(5KB),该寄存器的空间大小只是示例性的说明逻辑地址范围的计算方法,并非对本申请实施例的限定。
在一些实施例中,不同线程束的私有寄存器的第二大小可以是相同的,也可以是不同的。在另一些实施例中,第一线程束和第二线程束分别对应的私有寄存器的第二大小可以是相同的,也可以是不同的。在另一些实施例中,第二线程束之间,私有寄存器分别对应的第二大小可以是相同的,也可以是不同的。
在一些实施例中,各所述第二线程束对应的第二子寄存器的第二大小相同;和/或,任一所述第二子寄存器的第二大小与所述第一子寄存器的第三大小相同。
在一些可能的实现方式中,各所述第二线程束对应的第二子寄存器的第二大小相同。也就是说,不同的第二线程束各自对应的第二子寄存器在大小上是一致的。例如有多个第二线程束(比如线程束A、线程束B、线程束C )同时参与运算,每个线程束都有对应的第二子寄存器来存储数据。假设线程束A对应的第二子寄存器大小为128字节,线程束B对应的第二子寄存器大小同样为128字节,线程束C对应的第二子寄存器大小还是128字节,即各第二线程束对应的第二子寄存器大小相同。
在另一些可能的实现方式中,任一所述第二子寄存器的第二大小与所述第一子寄存器的第三大小相同。也就是说,所有第二子寄存器的大小都和第一子寄存器的大小一样。假如存在一个第一子寄存器,其第三大小设定为256字节,同时有多个第二子寄存器(如第二子寄存器X、第二子寄存器Y、第二子寄存器Z ),其中第二子寄存器X大小为256字节,第二子寄存器Y大小也是256字节,第二子寄存器Z大小同样为256字节,也就是任一第二子寄存器的大小都与第一子寄存器的大小相同。
可以理解的是,上述两种可能的实现方式可以同时满足,即各第二线程束对应的第二子寄存器大小相同,并且任一第二子寄存器的大小又和第一子寄存器的大小相同;也可以只满足其中一种情况。
在另一些实施例中,存在一个所述第二子寄存器的第二大小与所述第一子寄存器的第三大小相同。
这里,与第一子寄存器的第三大小相同的第二子寄存器,就是第一线程束和第二线程束复用的一个私有寄存器。假如存在一个第一子寄存器,其第三大小设定为256字节,多个第二子寄存器中至少存在一个大小为256字节的第二子寄存器。例如,同时有多个第二子寄存器(如第二子寄存器X、第二子寄存器Y、第二子寄存器Z ),其中第二子寄存器X大小为256字节,第二子寄存器Y大小可以是512字节,第二子寄存器Z大小可以为128字节,不同第二子寄存器的大小可以与对应的第二线程束的功能相关。
在一些实施例中,各所述线程束的逻辑地址范围均为所述共用寄存器的逻辑地址范围和对应的私有寄存器的逻辑地址范围之和。
其中,第一线程束对应的私有寄存器的第二大小、以及各个第二线程束对应的私有寄存器的第二大小均相同。
在本申请实施例中,所有线程束的逻辑地址范围完全一致。尽管物理上每个线程束的私有寄存器独立(如线程束A的私有寄存器在0x1000-0x13FF,线程束B在0x1400-0x17FF),但逻辑地址通过以下方式统一映射:共用寄存器:所有线程束的逻辑地址0x0000-0x0FFF映射到同一物理共用寄存器;私有寄存器:每个线程束的逻辑地址0x1000-0x13FF映射到其专属的物理私有寄存器(如线程束A映射到0x1000-0x13FF,线程束B映射到0x1400-0x17FF)。这种设计使得线程束无需感知物理地址差异,仅通过相同的逻辑地址范围访问数据。
示例性地,线程束A的逻辑地址0x0000-0x13FF对应物理地址0x0000(共用寄存器)和0x1000(Wave0私有寄存器);线程束B的逻辑地址0x0000-0x13FF对应物理地址0x0000(共用寄存器)和0x1400(Wave1私有寄存器)。上述线程束A、线程束B即可以理解为上述第一线程束,也可以理解为上述第二线程束。
在本申请实施例中,通过设定各线程束对应的私有寄存器的第二大小相同,可以确保每个线程束都拥有相同容量的私有存储空间,便于统一管理和分配;同时,通过将所有线程束的逻辑地址范围设定为共用寄存器的逻辑地址范围和对应的私有寄存器的逻辑地址范围之和,并在逻辑上统一映射,使得不同线程束在访问数据时无需关心底层的物理地址差异,仅通过相同的逻辑地址范围即可访问到所需数据,编程模型无需针对不同线程束调整地址偏移,降低代码复杂度。
在第一线程束访问目标寄存器的过程中,可以通过逻辑地址转换过程,将第一线程束请求的逻辑地址映射为实际物理地址。在一些实施例中,所述方法还包括:基于所述共用寄存器的物理基地址和逻辑地址偏移,确定第一线程束请求的逻辑地址对应的目标物理地址。
在一些实施例中,针对第一线程束,目标寄存器中包括共用寄存器和该第一线程束对应的私有寄存器。其中,第一线程束的私有寄存器的物理基地址紧邻共用寄存器的结束地址(例如共用寄存器结束于0x0FFF,第一线程束的私有寄存器起始于0x1000)。
在一些实施例中,该逻辑地址偏移为逻辑地址相对于逻辑基地址的偏移量。在进行地址转换的过程中,逻辑地址偏移实际上与物理地址偏移相同,因此,在第一线程束的私有寄存器的物理基地址紧邻共用寄存器的结束地址的情况下,可以直接基于该共用寄存器的物理基地址和逻辑地址偏移的和,确定目标物理地址。
示例性地,假设共用寄存器的物理基地址固定为0x0000,第一线程束的私有寄存器的物理基地址紧随其后(0x1000),与共用寄存器连续。第一线程束的逻辑地址范围定义为0x0000-0x13FF,覆盖共用寄存器(0x0000-0x0FFF)与第一线程束的私有寄存器(0x1000-0x13FF)。在进行地址转换时,逻辑地址0x0000-0x0FFF直接映射至共用寄存器的物理地址0x0000-0x0FFF;逻辑地址0x1000-0x13FF映射至第一线程束的私有寄存器的物理地址0x1000-0x13FF。相应地,目标物理地址=共用寄存器的物理基地址+逻辑地址偏移,无需查表或动态计算。
在本申请实施例中,通过基于共用寄存器的物理基地址和逻辑地址偏移来确定第一线程束请求的逻辑地址对应的目标物理地址,可以实现逻辑地址到物理地址的快速映射,提高地址转换的效率;同时,这种映射方式简化了地址管理的复杂性,使得系统能够更灵活地处理线程束对寄存器的访问请求。
与第一线程束类似,在第二线程束访问目标寄存器的过程中,可以通过逻辑地址转换过程,将第二线程束请求的逻辑地址映射为实际物理地址。在一些实施例中,所述目标寄存器为连续的物理空间,所述方法还包括:在第二线程束请求的逻辑地址小于所述共用寄存器的最大逻辑地址的情况下,基于所述共用寄存器的物理基地址和逻辑地址偏移,确定所述第二线程束请求的逻辑地址对应的目标物理地址。在第二线程束请求的逻辑地址大于或等于所述共用寄存器的最大逻辑地址的情况下,基于所述共用寄存器的物理基地址、所述线程束的标识、所述第二子寄存器的逻辑地址范围和地址偏移,确定所述第二线程束请求的逻辑地址对应的目标物理地址。
在一些实施例中,各所述第二线程束对应的私有寄存器(即第二子寄存器)在物理上连续排列,即,第二子寄存器按照第二线程束的标识连续排列,第n个第二子寄存器的结束地址紧邻第n+1个第二子寄存器的起始地址,第n个第二子寄存器对应的第二线程束是第n+1个第二子寄存器对应的第二线程束的前一个第二线程束。
在一些实施例中,当第二线程束请求的逻辑地址小于共用寄存器的最大逻辑地址时,表示此时该第二线程束需要访问的是共用寄存器;当第二线程束请求的逻辑地址大于或等于共用寄存器的第一大小时,表示此时该第二线程束需要访问的是私有寄存器。
示例性地,假设共用寄存器的物理基地址为0x0000,最大逻辑地址为0x1000(即4KB),私有寄存器的逻辑地址范围从0x1000开始,且每个第二线程束有独立的私有寄存器范围。若第二线程束请求的逻辑地址为0x0500,则直接基于共用寄存器的物理基地址和逻辑地址偏移(0x0500)计算目标物理地址(0x0000+0x0500=0x0500)。
示例性地,若第二线程束请求的逻辑地址为0x1200,说明其期望访问私有寄存器,因此,可以先读取第二线程束的标识,并计算私有寄存器的物理基地址,物理基地址=共用寄存器基地址+最大逻辑地址+(线程束标识1)×私有寄存器的第二大小。例如,最大逻辑地址为4KB(0x1000),私有寄存器第二大小为1KB(0x400),则第1个第二线程束对应的私有寄存器的物理基地址=0x0000+0x1000+(1-1)*0x400=0x1000;同时,逻辑地址偏移=逻辑地址-最大逻辑地址,例如,如逻辑地址0x1200,逻辑地址偏移=0x1200-0x1000=0x0200;目标物理地址=第1个第二线程束对应的私有寄存器的物理基地址(0x1000)+逻辑地址偏移(0x0200)=0x1200。
在本申请实施例中,可以实现第二线程束请求的逻辑地址到物理地址的高效映射。当逻辑地址位于共用寄存器范围内时,直接通过物理基地址和逻辑地址偏移进行映射,简化了地址计算过程;当逻辑地址超出共用寄存器范围时,结合第二线程束标识和私有寄存器范围进行映射,确保了地址映射的准确性和灵活性。
在一些实施例中,所述方法还包括:响应于所述第一线程束完成所有指令执行,保留所述共用寄存器。
其中,在第一线程束执行第一阶段指令的过程中,可以通过该第一线程束对应的私有寄存器实现自身的任务功能,并通过共用寄存器来传递各所述第二线程束在执行第二阶段指令时需要的公共数据(例如,目标矩阵块在第三矩阵中的位置)。
在一些实施例中,由于该共用寄存器对所有线程束(第一线程束和至少两类第二线程束)可见,因此,即使第一线程束完成所有第一阶段指令执行,也需要保留该共用寄存器。
在一些实施例中,该第一线程束对应的私有寄存器,可以直接被分配给后续的第二线程束;在另一些实施例中,该第一线程束对应的私有寄存器,可以先进行初始化,之后被分配给后续的第二线程束。可以理解的是,由于目标寄存器被分配给矩阵乘法任务,因此,在第一线程束完成所有第一阶段指令执行时,即使不需要第一线程束对应的私有寄存器中存储的数据,也不要释放该私有寄存器。
上述实施例中,通过响应于第一线程束完成所有指令执行后保留共用寄存器,可以维持公共数据的持续可用性,使后续依赖该数据的第二线程束能够正常运行,减少因数据提前释放导致的计算错误风险,同时降低重复分配和加载公共数据的开销,提升并行任务执行效率。
在一些实施例中,所述方法还包括:在所述第一线程束的任务执行完成的情况下,释放所述第一子寄存器。
这里,在第一线程束完成相应的任务之后,在生成第二线程束之前,需要释放第一线程束的第一子寄存器。可以理解的是,第一线程束对应的共用寄存器保持不变,且共用寄存器内存储的数据也保持不变,这样,之后生成的第二线程束可以使用该第一线程束生成的数据。
在本申请实施例中,释放后的所述目标寄存器包括所述每一第二线程束对应的第二子寄存器。
在一些实施例中,所述方法还包括:响应于各所述第二线程束均完成所有指令执行,释放所述目标寄存器。
在一些实施例中,处理器单元可以持续监控所有第二线程束的执行状态。当确认所有第二线程束都已完成所有指令执行时,将目标寄存器标记为可用状态,以便后续线程束可以重新分配和使用这些寄存器。
上述实施例中,通过响应于所有第二线程束完成指令执行后释放目标寄存器,能够及时回收物理存储资源,减少空闲资源占用,提高寄存器的利用率,并通过依赖指令提交状态的检测机制降低因未完成操作导致的数据覆盖可能性,增强资源管理的动态适应性。
在多任务并行场景下,新任务的第一线程束可能抢占计算资源,导致已启动任务的第二线程束因资源不足而阻塞,降低系统吞吐量。因此,本申请通过赋予第二线程束生成优先级最高,确保已启动任务的计算操作优先获得资源;新任务的第一线程束生成需等待当前任务的第二线程束结束(第二阶段完成),从而保证已启动任务的高效执行。请参阅图5,图5是本申请实施例提供的一种矩阵乘法任务执行方法的实现流程示意图二,该方法可以由计算机设备的处理器执行。所述至少两类第二线程束的生成优先级高于所述第一线程束的生成优先级,所述方法还可以包括步骤S501至步骤S502,将结合图5示出的步骤进行说明。
步骤S501、响应于新的矩阵乘法任务被分配至所述处理器单元,且所述矩阵乘法任务的第一线程束完成所有指令执行,生成矩阵乘法任务的至少两类第二线程束。
其中,在新的矩阵乘法任务被分配至处理器单元,且其第一线程束已完成指令执行的情况下,优先为已启动任务的第二阶段生成高优先级的第二线程束(如数据加载、乘加计算)。在一些实施例中,新的矩阵乘法任务的第一线程束生成需等待空闲资源或低优先级时段。
步骤S502、在完成生成所述至少两类第二线程束之后,生成新的第一线程束;所述新的第一线程束至少用于在处理器单元中为所述新的矩阵乘法任务分配新的目标寄存器。
其中,在当前任务的第二线程束完成后,生成新的矩阵乘法任务的第一线程束。该第一线程束可以用于回收之前的目标寄存器,并为新的矩阵乘法任务分配新的目标寄存器。
基于本申请提供的实施例,基于本申请提供的实施例,可以有效提升多任务并行场景下的系统吞吐量,确保已启动任务的高效执行,同时支持新任务的顺利启动,增强了处理器单元对复杂计算任务的处理能力和整体计算性能。
下面说明本申请实施例提供的矩阵乘法任务执行方法在实际场景中的应用。
本申请实提出了一种多线程束(wave)的异步编程模型及架构,允许多个线程束(wave)执行不同的代码片段,各自拥有独立空间的同时共享部分寄存器堆的数据,可以节省总资源的消耗并避免数据的搬移。
在本申请实施例中,当一个task launch到Processor上时,可以分为多个阶段(stage),包括:第一阶段,第二阶段。
其中,第一阶段用于执行公共部分指令,例如获取全局块标识(global tile id),并初始化累加寄存器等;第一阶段结束时回到调度器并重新产生N个新的线程束(wave),同时保留一部分共用寄存器(commonregister)堆,做为第一阶段和第二阶段的公用寄存器,该共用寄存器堆对于N个线程束(wave)同时可见。
第二阶段的每个线程束(wave)拥有额外的私有寄存器(private register),每个第二阶段线程束(wave)能使用的总寄存器范围为共用寄存器的范围+私有寄存器的范围(common register size + private register size)。其中,共用寄存器为多个线程束(wave)同时可见,并且由编程人员保证同步性(即生产者消费者的依赖关系,并避免多个线程束同时更新共用寄存器)。
其中,上述第一阶段用于计算tile的全局块标识,初始化累加寄存器,定义后续wave的数量。
其中,在第二阶段,可以通过定义stage2_spawn_id来区分不同线程束的功能。
在stage2_spawn_id为0的情况下,表示执行加载任务,将矩阵A和B的分块到共享内存,在完成加载之后,触发计算任务;在执行加载任务的过程中,需要从系统内存中加载待计算的块,因此需要该待计算的块的块信息,块信息可以包括矩阵A中的分块在系统内存(global memory)中的地址和尺寸、以及矩阵B中的分块在系统内存中的地址和尺寸。这里,上述块信息可以存储于加载任务对应的私有寄存器。
在stage2_spawn_id为1的情况下,表示执行计算任务,在计算完累加过程之后,触发存储任务;在执行计算任务的过程中,需要从片上缓存中加载待计算的块,因此需要该待计算的块的块信息,块信息可以包括矩阵A中的分块在片上缓存中的地址、以及矩阵B在片上缓存中的地址。这里,上述块信息可以存储于计算任务对应的私有寄存器。
在stage2_spawn_id为2的情况下,表示执行存储任务。在执行存储任务的过程中,需要将寄存器中存储的最终的乘累加结果存储到系统内存中,因此需要该乘累加结果在系统内存中的地址,该地址可以存储于存储任务对应的私有寄存器。
请参阅图6,其示出了线程束的执行流程示意图。
步骤S61、任务启动。
步骤S62、线程束生成。
其中,在任务执行的不同阶段,需要生成不同的线程束。该步骤S62可以包括:
步骤S621、在任务启动即处于第一阶段的情况下,生成一个线程束。
这里的一个线程束可以理解为上述实施例中的第一线程束。
步骤S622、在处于第二阶段的情况下,生成N个线程束
这里的N个线程束可以理解为上述实施例中的至少两类第二线程束。
在一些实施例中,生成的线程束可以基于以下地址开始执行:新的任务指令基地址(第一线程束)、指令基地址+第二阶段的偏移量(第二线程束)。
步骤S63、线程束执行。
步骤S64、是否处于第二阶段。
其中,在处于第二阶段的情况下,执行步骤S65,在未处于第二阶段的情况下,执行步骤S66。
步骤S65、继续执行。
其中,考虑到第二阶段下的第二线程束为N个,因此,需要等待各所述第二线程束均执行结束。
步骤S66、当前线程束结束,但不释放寄存器。
其中,考虑到第一阶段下的第一线程束为1个,因此,在当前第一线程束执行结束之后,之前申请的目标寄存器不需要释放,继续为后续的第二线程束提供寄存器资源。
在一些实施例中,在第一线程束结束之后,会产生新的线程束,执行的指令地址为(指令基地址+第二阶段的偏移量)。
步骤S67、线程束结束,在所有生成的线程束结束后进行释放。
其中,需要等到所有线程束均结束,表示这一个矩阵块才计算完成,并已经写入到系统内存中,此时才能释放之前申请的目标寄存器。
在一些实施例中,可以通过设置于处理器单元中的调度器完成上述过程,该调度器可以包括任务管理单元(task manager)和线程束生成单元(wave generator)。其中,需要支持新任务的线程束启动(wave launch),及已经执行至第二阶段的任务(2nd stagetask)的线程束启动。为保证已经执行过的任务的优先级,已经执行至第二阶段的任务永远拥有最高线程束生成(wave generate)的优先级。
其中,第二线程束生成的需要根据第二阶段指令指定的线程束数量,将原来的一个任务分出N个线程束启动,并同步更新线程束的指令地址为base_pc + stage2_pc_offset。
在一些实施例中,上述处理器单元还可以包括任务结束模块,在等到第二阶段的全部的第二线程束均结束执行后,统一释放寄存资源。其中,可以通过对象计数器(spawncounter)统计已经结束执行的第二线程束的数量。
请参阅图7,其示出了一种寄存器分配器架构。在新的任务(task)第一阶段申请时,统一分配common_size+private_size*N的连续空间。其中,common_size为共用寄存器的大小,private_size为私有寄存器的大小,N为私有寄存器的数量,或第二线程束的数量。
针对第一阶段,第一阶段的父线程束(parent wave),即上述实施例中的第一线程束,可以使用的逻辑空间范围是common_size+private_size,物理空间映射为第一阶段第一线程束空间范围;
针对第二阶段,第二阶段的子线程束(child wave)可以使用的逻辑空间范围是common_size+private_size,物理空间分为两段,第一段为共用寄存器(common space),第二段为每个子线程束(child wave)的私有寄存器(private space)。
在一些实施例,硬件地址计算单元需要负责逻辑地址与物理地址的转换。当逻辑地址(VA)小于预设的共用寄存器的大小(common_size)时,判定该地址位于共用寄存器。此时物理地址(PA)通过以下公式计算:PA=共用寄存器基地址(common_base)+逻辑地址偏移量(va_offset)。若逻辑地址超出共用寄存器的大小,此时物理地址计算需引入子线程束的标识符(n)和私有寄存器的大小(private_size),计算公式为:PA=共用寄存器基地址(common_base)+私有寄存器总容量(private_size×(n-1))+逻辑地址偏移量(va_offset)。
在第二阶段的判断中,会根据访问寄存器逻辑地址来判断是处于共享区间还是各个子wave的私有区间,然后映射到物理地址上。
在一些实施例中,针对一个workgroup(多个wave共同工作的一个逻辑层级,opencl中的workgroup和CUDA的block),不同wave之间有着生产者消费者关系,需要wave之间进行同步,比如计算wave需要等待数据加载的load wave把数据都搬到片上缓存中,后处理的store wave需要等待计算wave完成计算。
在一些实施例中,可以使用屏障指令(work-group barrier)来实现同一work-group内部的work-item之间的进程间同步;屏障指令被拆分为到达指令和等待指令两条指令。
在本申请实施例中,在本申请实施例中,上述wave之间可以利用到达指令/等待指令(async arrive/wait bar)来同步。
当线程执行到到达指令后,只对到达计数缓存里当前工作组以及当前屏障指令所在的到达计数值做原子减一操作,随后可以接着执行没有数据依赖的指令,当线程执行到等待指令,将当前线程的id存储在休眠控制缓存中,线程随后休眠。当到达计数值减到0,使用休眠控制参数来对已经执行等待指令的线程做唤醒操作,同时将休眠控制参数清0。与相关方案相比,等待状态是异步的,无需所有的线程都执行到等待状态再做唤醒。
请参阅图8,图8为本申请实施例提供的一种基于到达指令和等待指令的线程异步等待方案示意图。当前工作组包括线程0至线程8共九个线程,其中,线程0至线程4为当前工作组支持的第一个屏障指令bar0,线程5至线程7为当前工作组支持的第二个屏障指令bar1,线程8不参与任何屏障指令(除了用于初始化的屏障指令)。
在执行指令之前,需要通过任意一个线程来初始化各个屏障指令对应的到达计数值和休眠控制参数。示例性地,针对上述第一个屏障指令bar0,可以通过图中的线程0调用第一个初始化指令“初始化0”,将第一个屏障指令bar0的到达计数值61和休眠控制参数62分别设置为“5,0b”;针对第二个屏障指令bar1,可以通过图中的线程0调用第二个初始化指令“初始化1”,将第二个屏障指令bar1的到达计数值66和休眠控制参数67分别设置为“3,0b”。需要说明的是,在当前工作组中所有的屏障指令的初始化指令之后,需要一个初始化屏障指令65,用来保证当前工作组的所有线程在初始化到达计数值之后再执行指令。
在各个线程均执行到该初始化屏障指令65之后,需要执行后续指令,不同的屏障指令对应的线程执行到当前屏障指令对应的到达指令后,会对当前屏障指令对应的到达计数值做原子减一操作;同时,会基于当前指令是否为producer,进而确定是否执行等待指令。
以下实施例将以第一个屏障指令bar0为例进行说明。如图8所示,按照时间顺序,第一个屏障指令bar0对应的各个线程的执行过程包括:
(1)线程3先执行到到达指令63,对到达计数值61做减一操作,此时,到达计数值61为4。
(2)线程0执行到到达指令63,对到达计数值61做减一操作,此时,到达计数值61为3。
针对上述线程0和线程3,由于线程0和线程3为producer,无需执行等待指令64,休眠控制参数62不变。
(3)线程2执行到到达指令63,对到达计数值61做减一操作,此时,到达计数值61为2。
(4)线程1执行到到达指令63,对到达计数值61做减一操作,此时,到达计数值61为1。
(5)由于线程2不是producer,需要执行等待指令64,因此在线程2执行到等待指令64的情况下,休眠控制参数62更新为100b,并进入休眠状态。
(6)由于线程1不是producer,需要执行等待指令64,因此在线程1执行到等待指令64的情况下,休眠控制参数62更新为110b,并进入休眠状态。
(7)线程4执行到到达指令63,对到达计数值61做减一操作,此时,到达计数值61为0,需要注意的是,由于到达计数值61为0,则需要唤醒处于休眠状态的线程,即需要唤醒处于休眠状态的线程1和线程2,线程1和线程2继续执行后续指令。
(8)由于线程4不是producer,需要执行等待指令64,因此在线程4执行到等待指令64的情况下,休眠控制参数62更新为10000b,并进入休眠状态,由于到达计数值61为0,所以线程4会被立即唤醒,并执行后续指令。
以下实施例将以第二个屏障指令bar1为例进行说明。如图8所示,按照时间顺序,第二个屏障指令bar1对应的各个线程的执行过程包括:
(1)线程7先执行到到达指令68,对到达计数值66做减一操作,此时,到达计数值66为2,并且由于线程7为producer,无需执行等待指令69,因此,休眠控制参数67不变。
(2)线程5执行到到达指令68,对到达计数值66做减一操作,此时,到达计数值66为1。
(3)线程6执行到到达指令68,对到达计数值66做减一操作,此时,到达计数值66为0。
(4)由于线程5不是producer,需要执行等待指令69,线程5执行到等待指令69,休眠控制参数67更新为100000b,并进入休眠状态,同时,由于到达计数值66为0,所以线程5会被立即唤醒,并执行后续指令。可以理解的是,在线程5被唤醒之后,休眠控制参数67更新为0b(图中未示出)。
(5)由于线程6不是producer,需要执行等待指令69,线程6执行到等待指令69,休眠控制参数67更新为1000000b,并进入休眠状态,同时,由于到达计数值66为0,所以线程6会被立即唤醒,并执行后续指令。可以理解的是,在线程6被唤醒之后,休眠控制参数67更新为0b(图中未示出)。
基于上述实施例,通过将屏障指令拆分为到达阶段和等待阶段,即拆分为到达指令和等待指令,其中,到达指令仅对到达计数值做原子减一操作,而通过等待指令来控制线程执行休眠操作,以进入休眠状态。当到达计数值减到0之后即可唤醒已经执行过休眠操作的线程,无需等待所有的线程都执行到wait指令,从而实现了异步的屏障指令;同时,通过新增初始化到达指令支持用户指定参与屏障指令的线程数量。没有数据依赖的线程不会被阻塞,提升程序执行效率;同时,还使用休眠控制缓存存储需要等待的线程id,用于后续唤醒正确的线程;同一工作组支持多个屏障指令,具体数量由用户指定,可以大大提升了多路数据场景的并行度。
基于前述的实施例,本申请实施例提供一种矩阵乘法任务执行装置,该装置包括所包括的各单元、以及各单元所包括的各模块,可以通过计算机设备中的处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为中央处理器(CentralProcessing Unit,CPU)、微处理器(Microprocessor Unit,MPU)、数字信号处理器(DigitalSignal Processor,DSP)或现场可编程门阵列(Field Programmable Gate Array,FPGA)等。
图9为本申请实施例提供的一种矩阵乘法任务执行装置的组成结构示意图,如图9所示,矩阵乘法任务执行装置900包括:执行模块910和生成模块920,其中:
执行模块910,用于在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器;
生成模块920,用于生成用于执行所述矩阵乘法任务的至少两类第二线程束;所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
在一些实施例中,所述执行模块910,用于响应于所述矩阵乘法任务被分配至所述处理器单元,生成第一线程束;所述第一线程束执行的任务为执行所述第二线程束的任务做准备。
在一些实施例中,所述目标寄存器为所述第一线程束在处理器单元中为所述矩阵乘法任务分配的,所述共用寄存器对所述第一线程束可见。
在一些实施例中,所述目标寄存器包括私有寄存器,所述私有寄存器包括第一线程束对应第一子寄存器,或,所述每一第二线程束对应的第二子寄存器;各所述第二子寄存器对其他线程束不可见。
在一些实施例中,所述矩阵乘法任务分块执行,计算第一矩阵中的第一部分矩阵和第二矩阵中的第二部分矩阵之间的乘积以得到目标矩阵块;所述第一线程束用于计算所述目标矩阵块在第三矩阵中的位置,并存储于所述共用寄存器;所述第三矩阵为所述第一矩阵和第二矩阵的乘积。
在一些实施例中,所述矩阵乘法任务至少包括以下子任务:加载任务、累加任务和存储任务;一类第二线程束用于执行所述子任务中的至少之一,不同的第二线程束对应的子任务不同。
在一些实施例中,执行加载任务的第二线程束用于从系统内存中加载第一部分矩阵和第二部分矩阵至片上缓存;其中,所述执行加载任务的第二线程束对应的私有寄存器用于存储所述第一部分矩阵的第一内存地址和所述第二部分矩阵的第二内存地址。
在一些实施例中,执行累加任务的第二线程束用于从片上缓存中加载第一部分矩阵和第二部分矩阵,以进行矩阵元素的乘法及累加过程;其中,所述执行累加任务的第二线程束对应的私有寄存器用于存储所述第一部分矩阵的第一片上地址和所述第二部分矩阵的第二片上地址。
在一些实施例中,所述中间结果包括乘累加结果,所述共用寄存器包括累加寄存器;所述累加寄存器用于存储执行累加任务的第二线程束产生的乘累加结果,所述第一线程束还用于对所述目标寄存器中的累加寄存器进行初始化。
在一些实施例中,在所述执行累加任务的第二线程束执行完成的情况下,执行存储任务的第二线程束用于将共用寄存器中的中间结果写出至系统内存;其中,所述执行存储任务的第二线程束对应的私有寄存器第二子寄存器用于存储所述目标矩阵块的第三内存地址。
在一些实施例中,在所述第一线程束的任务执行完成的情况下,释放所述第一子寄存器。
在一些实施例中,所述目标寄存器为预设大小的物理空间;所述预设大小基于所述共用寄存器的第一大小和各所述第二线程束对应的第二子寄存器的第二大小确定。
在一些实施例中,各所述第二线程束对应的第二子寄存器的第二大小相同;和/或,任一所述第二子寄存器的第二大小与所述第一子寄存器的第三大小相同。
在一些实施例中,所述第一线程束的逻辑地址范围为所述共用寄存器的逻辑地址范围和所述第一子寄存器的逻辑地址范围之和;所述第一线程束的逻辑地址范围为所述共用寄存器的逻辑地址范围和对应的所述第二子寄存器的逻辑地址范围之和。
在一些实施例中,所述执行模块910,用于基于所述共用寄存器的物理基地址和逻辑地址偏移,确定第一线程束请求的逻辑地址对应的目标物理地址。
在一些实施例中,所述目标寄存器为连续的物理空间,所述执行模块910,用于在第二线程束请求的逻辑地址小于所述共用寄存器的最大逻辑地址的情况下,基于所述共用寄存器的物理基地址和逻辑地址偏移,确定所述第二线程束请求的逻辑地址对应的目标物理地址;在第二线程束请求的逻辑地址大于或等于所述共用寄存器的最大逻辑地址的情况下,基于所述共用寄存器的物理基地址、所述线程束的标识、所述第二子寄存器的逻辑地址范围和地址偏移,确定所述第二线程束请求的逻辑地址对应的目标物理地址。
在一些实施例中,所述执行模块910,用于响应于所述第一线程束完成所有指令执行,保留所述共用寄存器。
在一些实施例中,所述执行模块910,用于响应于各所述第二线程束均完成所有指令执行,释放所述目标寄存器。
在一些实施例中,所述至少两类第二线程束的生成优先级高于所述第一线程束的生成优先级,所述执行模块910,用于响应于新的矩阵乘法任务被分配至所述处理器单元,且所述矩阵乘法任务的第一线程束完成所有指令执行,生成矩阵乘法任务的至少两类第二线程束;在完成生成所述至少两类第二线程束之后,生成新的第一线程束;所述新的第一线程束至少用于在处理器单元中为所述新的矩阵乘法任务分配新的目标寄存器。
以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。在一些实施例中,本申请实施例提供的装置具有的功能或包含的模块可以用于执行上述方法实施例描述的方法,对于本申请装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,本申请实施例中,如果以软件功能模块的形式实现上述的矩阵乘法任务执行方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ReadOnly Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件、软件或固件,或者硬件、软件、固件三者之间的任意结合。
本申请实施例提供一种计算机设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法中的部分或全部步骤。
本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法中的部分或全部步骤。所述计算机可读存储介质可以是瞬时性的,也可以是非瞬时性的。
本申请实施例提供一种计算机程序,包括计算机可读代码,在所述计算机可读代码在计算机设备中运行的情况下,所述计算机设备中的处理器执行用于实现上述方法中的部分或全部步骤。
本申请实施例提供一种计算机程序产品,所述计算机程序产品包括存储了计算机程序的非瞬时性计算机可读存储介质,所述计算机程序被计算机读取并执行时,实现上述方法中的部分或全部步骤。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一些实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一些实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
这里需要指出的是:上文对各个实施例的描述倾向于强调各个实施例之间的不同之处,其相同或相似之处可以互相参考。以上设备、存储介质、计算机程序及计算机程序产品实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请设备、存储介质、计算机程序及计算机程序产品实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
图10为本申请实施例提供的一种计算机设备的硬件实体示意图,如图10所示,该计算机设备1000的硬件实体包括:处理器1001和存储器1002,其中,存储器1002存储有可在处理器1001上运行的计算机程序,处理器1001执行程序时实现上述任一实施例的方法中的步骤。
存储器1002存储有可在处理器上运行的计算机程序,存储器1002配置为存储由处理器1001可执行的指令和应用,还可以缓存待处理器1001以及计算机设备1000中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(FLASH)或随机访问存储器(Random Access Memory,RAM)实现。
处理器1001执行程序时实现上述任一项的矩阵乘法任务执行方法的步骤。处理器1001通常控制计算机设备1000的总体操作。
本申请实施例提供一种计算机存储介质,计算机存储介质存储有一个或者多个程序,该一个或者多个程序可被一个或者多个处理器执行,以实现如上任一实施例的矩阵乘法任务执行方法的步骤。
这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请存储介质和设备实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
上述处理器可以为目标用途集成电路(Application Specific IntegratedCircuit,ASIC)、数字信号处理器(Digital Signal Processor,DSP)、数字信号处理装置(Digital Signal Processing Device,DSPD)、可编程逻辑装置(Programmable LogicDevice,PLD)、现场可编程门阵列(Field Programmable Gate Array,FPGA)、中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器中的至少一种。可以理解地,实现上述处理器功能的电子器件还可以为其它,本申请实施例不作具体限定。
上述计算机存储介质/存储器可以是只读存储器(Read Only Memory,ROM)、可编程只读存储器(Programmable Read-Only Memory,PROM)、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性随机存取存储器(Ferromagnetic Random Access Memory,FRAM)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(Compact Disc Read-Only Memory,CD-ROM)等存储器;也可以是包括上述存储器之一或任意组合的各种终端,如移动电话、计算机、平板设备、个人数字助理等。
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本申请的各种实施例中,上述各步骤/过程的序号的大小并不意味着执行顺序的先后,各步骤/过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本申请各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(ReadOnly Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本申请上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。
Claims (23)
1.一种矩阵乘法任务执行方法,其特征在于,应用于图形处理器中的处理器单元,所述方法包括:
在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器;
生成用于执行所述矩阵乘法任务的至少两类第二线程束;
所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
响应于所述矩阵乘法任务被分配至所述处理器单元,生成第一线程束;所述第一线程束执行的任务为执行所述第二线程束的任务做准备。
3.根据权利要求2所述的方法,其特征在于,所述目标寄存器为所述第一线程束在处理器单元中为所述矩阵乘法任务分配的,所述共用寄存器对所述第一线程束可见。
4.根据权利要求2所述的方法,其特征在于,所述目标寄存器包括私有寄存器,所述私有寄存器包括第一线程束对应第一子寄存器,或,所述每一第二线程束对应的第二子寄存器;各所述第二子寄存器对其他线程束不可见。
5.根据权利要求1所述的方法,其特征在于,所述矩阵乘法任务分块执行,计算第一矩阵中的第一部分矩阵和第二矩阵中的第二部分矩阵之间的乘积以得到目标矩阵块;
所述第一线程束用于计算所述目标矩阵块在第三矩阵中的位置,并存储于所述共用寄存器;所述第三矩阵为所述第一矩阵和第二矩阵的乘积。
6.根据权利要求1所述的方法,其特征在于,所述矩阵乘法任务至少包括以下子任务:加载任务、累加任务和存储任务;一类第二线程束用于执行所述子任务中的至少之一,不同的第二线程束对应的子任务不同。
7.根据权利要求6所述的方法,其特征在于,执行加载任务的第二线程束用于从系统内存中加载第一部分矩阵和第二部分矩阵至片上缓存;
其中,所述执行加载任务的第二线程束对应的私有寄存器用于存储所述第一部分矩阵的第一内存地址和所述第二部分矩阵的第二内存地址。
8.根据权利要求6所述的方法,其特征在于,执行累加任务的第二线程束用于从片上缓存中加载第一部分矩阵和第二部分矩阵,以进行矩阵元素的乘法及累加过程;其中,所述执行累加任务的第二线程束对应的私有寄存器用于存储所述第一部分矩阵的第一片上地址和所述第二部分矩阵的第二片上地址。
9.根据权利要求8所述的方法,其特征在于,所述中间结果包括乘累加结果,所述共用寄存器包括累加寄存器;所述累加寄存器用于存储执行累加任务的第二线程束产生的乘累加结果,所述第一线程束还用于对所述目标寄存器中的累加寄存器进行初始化。
10.根据权利要求6所述的方法,其特征在于,在所述执行累加任务的第二线程束执行完成的情况下,执行存储任务的第二线程束用于将共用寄存器中的中间结果写出至系统内存;其中,所述执行存储任务的第二线程束对应的私有寄存器第二子寄存器用于存储所述目标矩阵块的第三内存地址。
11.根据权利要求4至10任一项所述的方法,其特征在于,在所述第一线程束的任务执行完成的情况下,释放所述第一子寄存器。
12.根据权利要求4至10任一项所述的方法,其特征在于,所述目标寄存器为预设大小的物理空间;所述预设大小基于所述共用寄存器的第一大小和各所述第二线程束对应的第二子寄存器的第二大小确定。
13.根据权利要求4至10任一项所述的方法,其特征在于,各所述第二线程束对应的第二子寄存器的第二大小相同;和/或,任一所述第二子寄存器的第二大小与所述第一子寄存器的第三大小相同。
14.根据权利要求4至10任一项所述的方法,其特征在于,所述第一线程束的逻辑地址范围为所述共用寄存器的逻辑地址范围和所述第一子寄存器的逻辑地址范围之和;所述第一线程束的逻辑地址范围为所述共用寄存器的逻辑地址范围和对应的所述第二子寄存器的逻辑地址范围之和。
15.根据权利要求14所述的方法,其特征在于,所述方法还包括:
基于所述共用寄存器的物理基地址和逻辑地址偏移,确定第一线程束请求的逻辑地址对应的目标物理地址。
16.根据权利要求14所述的方法,其特征在于,所述目标寄存器为连续的物理空间,所述方法还包括:
在第二线程束请求的逻辑地址小于所述共用寄存器的最大逻辑地址的情况下,基于所述共用寄存器的物理基地址和逻辑地址偏移,确定所述第二线程束请求的逻辑地址对应的目标物理地址;
在第二线程束请求的逻辑地址大于或等于所述共用寄存器的最大逻辑地址的情况下,基于所述共用寄存器的物理基地址、所述线程束的标识、所述第二子寄存器的逻辑地址范围和地址偏移,确定所述第二线程束请求的逻辑地址对应的目标物理地址。
17.根据权利要求4至10任一项所述的方法,其特征在于,所述方法还包括:
响应于所述第一线程束完成所有指令执行,保留所述共用寄存器。
18.根据权利要求4至10任一项所述的方法,其特征在于,所述方法还包括:
响应于各所述第二线程束均完成所有指令执行,释放所述目标寄存器。
19.根据权利要求4至10任一项所述的方法,其特征在于,所述至少两类第二线程束的生成优先级高于所述第一线程束的生成优先级,所述方法还包括:
响应于新的矩阵乘法任务被分配至所述处理器单元,且所述矩阵乘法任务的第一线程束完成所有指令执行,生成矩阵乘法任务的至少两类第二线程束;
在完成生成所述至少两类第二线程束之后,生成新的第一线程束;所述新的第一线程束至少用于在处理器单元中为所述新的矩阵乘法任务分配新的目标寄存器。
20.一种矩阵乘法任务执行装置,其特征在于,应用于图形处理器中的处理器单元,所述装置包括:
执行模块,用于在所述处理器单元执行矩阵乘法任务的过程中,在所述处理器单元中为所述矩阵乘法任务分配目标寄存器,所述目标寄存器包括共用寄存器;
生成模块,用于生成用于执行所述矩阵乘法任务的至少两类第二线程束;所述至少两类第二线程束基于所述共用寄存器异步执行所述矩阵乘法任务;所述共用寄存器用于存储所述矩阵乘法任务的中间结果。
21.一种计算机设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至19任一项所述方法中的步骤。
22.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至19任一项所述方法中的步骤。
23.一种计算机程序产品,包括计算机程序或指令,其特征在于,所述计算机程序或指令被处理器执行时,实现权利要求1至19中任一项所述方法中的步骤。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202511700346.7A CN121167101A (zh) | 2025-11-19 | 2025-11-19 | 矩阵乘法任务执行方法、装置、设备、介质及程序产品 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202511700346.7A CN121167101A (zh) | 2025-11-19 | 2025-11-19 | 矩阵乘法任务执行方法、装置、设备、介质及程序产品 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| CN121167101A true CN121167101A (zh) | 2025-12-19 |
Family
ID=98047613
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202511700346.7A Pending CN121167101A (zh) | 2025-11-19 | 2025-11-19 | 矩阵乘法任务执行方法、装置、设备、介质及程序产品 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN121167101A (zh) |
Citations (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN115880132A (zh) * | 2023-02-06 | 2023-03-31 | 南京砺算科技有限公司 | 图形处理器、矩阵乘法任务处理方法、装置及存储介质 |
| US20230140934A1 (en) * | 2021-11-05 | 2023-05-11 | Nvidia Corporation | Thread specialization for collaborative data transfer and computation |
| CN116755778A (zh) * | 2016-12-31 | 2023-09-15 | 英特尔公司 | 用于异构计算的系统、方法和装置 |
| CN116774968A (zh) * | 2022-03-10 | 2023-09-19 | 辉达公司 | 具有一组线程束的高效矩阵乘法和加法 |
-
2025
- 2025-11-19 CN CN202511700346.7A patent/CN121167101A/zh active Pending
Patent Citations (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN116755778A (zh) * | 2016-12-31 | 2023-09-15 | 英特尔公司 | 用于异构计算的系统、方法和装置 |
| US20230140934A1 (en) * | 2021-11-05 | 2023-05-11 | Nvidia Corporation | Thread specialization for collaborative data transfer and computation |
| WO2023077436A1 (en) * | 2021-11-05 | 2023-05-11 | Nvidia Corporation | Thread specialization for collaborative data transfer and computation |
| CN116774968A (zh) * | 2022-03-10 | 2023-09-19 | 辉达公司 | 具有一组线程束的高效矩阵乘法和加法 |
| CN115880132A (zh) * | 2023-02-06 | 2023-03-31 | 南京砺算科技有限公司 | 图形处理器、矩阵乘法任务处理方法、装置及存储介质 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US11625885B2 (en) | Graphics processor with non-blocking concurrent architecture | |
| CA3107337C (en) | Accelerating dataflow signal processing applications across heterogeneous cpu/gpu systems | |
| US9354944B2 (en) | Mapping processing logic having data-parallel threads across processors | |
| US9477465B2 (en) | Arithmetic processing apparatus, control method of arithmetic processing apparatus, and a computer-readable storage medium storing a control program for controlling an arithmetic processing apparatus | |
| US9152462B2 (en) | Parallel processing device, parallel processing method, optimization device, optimization method and computer program | |
| TWI498819B (zh) | 執行成型記憶體存取作業的系統和方法 | |
| US8949841B2 (en) | Approach for a configurable phase-based priority scheduler | |
| TWI754310B (zh) | 純函數語言神經網路加速器系統及電路 | |
| TW201413456A (zh) | 處理巢狀串流事件的方法和系統 | |
| CN118069379B (zh) | 一种基于gpu资源的调度实现方法 | |
| CN1983196B (zh) | 用于将执行线程分组的系统和方法 | |
| US20240311204A1 (en) | Techniques for balancing workloads when parallelizing multiply-accumulate computations | |
| CN116775266A (zh) | 用于处理器中的线程组的可扩展负载均衡的技术 | |
| CN120216039B (zh) | 同步方法、同步装置、电子设备和存储介质 | |
| US9286114B2 (en) | System and method for launching data parallel and task parallel application threads and graphics processing unit incorporating the same | |
| US20250200859A1 (en) | Software-directed divergent branch target prioritization | |
| CN120950263B (zh) | 数据处理方法、处理器、芯片、显卡及电子设备 | |
| Zheng et al. | Hiwaylib: A software framework for enabling high performance communications for heterogeneous pipeline computations | |
| CN121167101A (zh) | 矩阵乘法任务执行方法、装置、设备、介质及程序产品 | |
| CN116954850A (zh) | 计算任务调度方法、装置、片上系统和存储介质 | |
| F Rahman | Exploring Parallel Merging In GPU Based System |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination |