1.本公开的实施例涉及一种指令调度方法、指令调度装置、处理器及存储介质。
背景技术:
2.通用计算图形处理器(gpgpu,general-purpose graphics processing unit)属于一种类型的gpu,更加倾向于通用计算而非图形的渲染,内部同样拥有大量的可以独立运行的计算单元,例如,流多处理器(sm,streaming multiprocessor),因此,gpgpu的并行程度很高。
3.图1示出一种通用图形处理器(gpgpu)的一种结构示意图。在并行计算中,计算任务一般通过多个线程(thread)执行,多个线程(thread warp)共享一个指令流。这些线程在通用图形处理器(或称为并行计算处理器)中执行前,在线程块调度装置中被划分成多个线程块(thread block),不同的计算任务对应不同的线程块,且同一个计算任务对应的线程块执行的kernel(gpgpu可执行的程序代码)是相同的,区别是同一线程块中每个线程所操作的数据不同。然后经由线程块分发装置,将多个线程块分发到各个计算单元(cu)(例如,流多处理器(sm)),多个线程块可以在同一个计算单元中执行,或者在不同计算单元中执行。一个线程块中的所有线程必须要分配到同一个计算单元上执行。同时,线程块会被拆分成最小执行线程束(或简称线程束,thread warp),每个线程束包含了固定数量(或小于这个固定数量)的线程,例如,32个线程。当多个线程块在同一计算单元中执行时,该计算单元中的线程束可以来自于同一个线程块或不同的线程块,且同一线程束中所有线程可以按照simd(single instruction multiple data,单指令多数据流)的方式执行。
4.例如,图1所示每个计算单元包括指令调度装置(instruction scheduler)(或称为线程束调度/分发模块,warp scheduler)和多个计算核心,其中,指令调度装置中可以包括指令数据存取区,指令数据存取区例如为用于临时存储指令数据的随机存取存储器(ram),每个计算核心中包括寄存器堆。每个计算单元各自对应的指令缓存(instruction cache)和数据缓存(data cache)可以是计算单元之外的l1缓存,例如,少量计算单元也可以共享同一个指令缓存和同一个数据缓存,不同计算单元的指令缓存和数据缓存也可以共享下一级缓存。指令调度装置对运行在计算单元上的线程束进行取指、译码、调度、分配等一系列功能,以便该计算单元的多个计算核心(例如,流处理器(sp))运行线程束。例如,每个计算核心包括算数逻辑单元(alu)、浮点计算单元等。根据计算单元中计算核心的个数,一个线程块中的多个线程束可以同时执行或分时执行。每个线程束中的多个线程会执行相同的指令,指令执行完得到的结果更新到每个线程束对应的寄存器中。
5.例如,如图2所示,gpgpu的流水线运行方式包括:取指(if,instruction fetch)、译码(id,instruction dispatch/decode)、执行(ex,executed)、访存(mem,memory)和写回(wb,write back,特指将指令执行完得出的结果更新到寄存器中)五个阶段。每一个线程束都有一个程序计数器(pc,program counter)记录着线程束中下一条将要被执行的指令的地址,即取指地址。程序计数器中的数值用来指示下一条指令在主存中的位置。当一条指令
被取出后,程序计数器中的数值自动递增,在指令执行完毕、指令数据写回之后,计算机就接着从程序计数器中取得下一条指令地址。取指是流水线中最先开始的阶段,取回的指令数据输入给后续的阶段进行处理,从而实现整个计算单元的运行过程。
6.例如,如图3所示,gpgpu中包含计算单元0~计算单元n时,每个计算单元中的指令调度装置将某线程束的取指请求(包含指令地址)发射到指令缓存中,如果指令缓存中存在指令地址对应的指令数据,则无需访问共享缓存,如果指令缓存中不存在指令地址对应的指令数据,则访问共享缓存或进一步发射到统一缓存中以进行取指操作等。指令执行计算所需要的数据首先会从数据缓存中获取,如果数据缓存中不存在,则访问共享缓存或进一步在统一缓存。因此,线程束的取指操作和取数据操作是会存在访问共享缓存时形成带宽竞争。
技术实现要素:
7.本公开至少一实施例提供一种指令调度方法,包括:选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于所述第一指令地址取指操作;接收从所述第一指令地址返回的对应于所述第一取指请求的第一指令数据;响应于第二线程束发起的对所述第一指令地址进行取指的第二取指请求,将所述第一指令数据在第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。
8.例如,本公开一些实施例提供的指令调度方法还包括:
9.取消所述第二取指请求。
10.例如,本公开一些实施例提供的指令调度方法中,在所述第二取指请求在所述第一时钟周期中处于候选且被选出的情况下,取消所述第二取指请求对应的取指操作。
11.例如,本公开一些实施例提供的指令调度方法中,所述第二取指请求在所述第一时钟周期中处于候选且被忽略。
12.例如,本公开一些实施例提供的指令调度方法中,所述第一取指请求和所述第二取指请求在第二时钟周期中处于候选,所述第一取指请求被选出,所述第二取指请求被忽略,其中,所述第一时钟周期位于所述第二时钟周期之后。
13.例如,本公开一些实施例提供的指令调度方法中,在所述第二时钟周期到所述第一时钟周期之间的一个或多个中间操作周期中,所述第二取指请求都被忽略。
14.例如,本公开一些实施例提供的指令调度方法中,在所述第二时钟周期中,第三线程束发起的对于所述第一指令地址进行取指的第三取指请求处于候选,但被忽略;在所述第二时钟周期到所述第一时钟周期之间的第三时钟周期中,所述第三取指请求处于候选且被选出,以进行对于所述第一指令地址的取指操作。
15.例如,本公开一些实施例提供的指令调度方法中,所述第一线程束和所述第二线程束属于同一线程块或属于不同的线程块。
16.例如,本公开一些实施例提供的指令调度方法还包括:
17.记录每个取指请求的属性信息,其中,所述属性信息包括发起所述取指请求的线程束所属的线程块的线程块号以及发起所述取指请求的线程束在所属线程块中的线程束号。
18.例如,本公开一些实施例提供的指令调度方法还包括:响应于返回所述第一指令数据,根据所述第一取指请求的属性信息,获取所述第一线程束对应的线程块号和所述第一线程束对应的线程束号;基于所述第一线程束对应的线程块号和所述第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定所述第二取指请求。
19.例如,本公开一些实施例提供的指令调度方法中,基于所述第一线程束对应的线程块号和所述第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定所述第二取指请求,包括:产生广播掩码,其中,所述广播掩码包括对应于所述第二取指请求的信息位;其中,使用所述广播掩码将所述第一指令数据在所述第一时钟周期中广播发送至所述第二线程束的指令数据存取区的写地址。
20.例如,本公开一些实施例提供的指令调度方法中,所述广播掩码还包括对应于所述第一取指请求的信息位,使用所述广播掩码将所述第一指令数据在所述第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。
21.例如,本公开一些实施例提供的指令调度方法中,每个取指请求的属性信息还包括指令数据存取区的写地址,通过所述第一取指请求的属性信息获取所述第一取指请求的指令数据存取区的写地址;通过所述第二取指请求的属性信息获取所述第二取指请求的指令数据存取区的写地址。
22.例如,本公开一些实施例提供的指令调度方法中,每个取指请求的属性信息还包括程序计数器,通过所述第一取指请求的属性信息的程序计数器获取所述第一取指请求对应的第一取指地址。
23.例如,本公开一些实施例提供的指令调度方法中,每个取指请求的属性信息还包括指令数据存取区的状态,所述指令数据存取区的状态包括发起所述取指请求的线程束的指令数据存取区是否为未满。
24.本公开至少一些实施例还提供一种指令调度装置,包括:取指仲裁单元,被配置为选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于所述第一指令地址取指操作;指令预处理单元,被配置为接收从所述第一指令地址返回的对应于所述第一取指请求的第一指令数据;以及响应于第二线程束发起的对所述第一指令地址进行取指的第二取指请求,将所述第一指令数据在第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。
25.例如,在本公开一些实施例提供的指令调度装置中,所述指令预处理单元还被配置为取消所述第二取指请求。
26.例如,在本公开一些实施例提供的指令调度装置中,所述指令预处理单元还被配置为在所述第二取指请求在所述第一时钟周期中处于候选且被选出的情况下,取消所述第二取指请求对应的取指操作。
27.例如,在本公开一些实施例提供的指令调度装置中,所述指令预处理单元还被配置为,对所述第二取指请求在所述第一时钟周期中处于候选的情形下,忽略所述第二取指请求。
28.例如,在本公开一些实施例提供的指令调度装置中,所述指令预处理单元还被配
置为所述第一取指请求和所述第二取指请求在第二时钟周期中处于候选的情形下,选出所述第一取指请求,忽略所述第二取指请求,其中,所述第一时钟周期位于所述第二时钟周期之后。
29.例如,在本公开一些实施例提供的指令调度装置中,所述指令预处理单元还被配置为,在所述第二时钟周期到所述第一时钟周期之间的一个或多个中间操作周期中,都忽略所述第二取指请求。
30.例如,在本公开一些实施例提供的指令调度装置中,所述取指仲裁单元还被配置为,
31.在所述第二时钟周期中,对于第三线程束发起的对于所述第一指令地址进行取指的第三取指请求处于候选的情形下,忽略所述第三取指请求;
32.在所述第二时钟周期到所述第一时钟周期之间的第三时钟周期中,对于所述第三取指请求处于候选的情形下,选出所述第三取指请求,以进行对于所述第一指令地址的取指操作。
33.例如,在本公开一些实施例提供的指令调度装置中,所述第一线程束和所述第二线程束属于同一线程块或属于不同的线程块。
34.例如,在本公开一些实施例提供的指令调度装置中,还包括指令广播判定单元,所述指令广播判定单元被配置为记录每个取指请求的属性信息,
35.其中,所述属性信息包括发起所述取指请求的线程束所属的线程块的线程块号以及发起所述取指请求的线程束在所属线程块中的线程束号。
36.例如,在本公开一些实施例提供的指令调度装置中,所述指令广播判定单元还被配置为:
37.从所述指令预处理单元获取返回的所述第一指令数据,根据所述第一取指请求的属性信息,获取所述第一线程束对应的线程块号和所述第一线程束对应的线程束号;以及
38.基于所述第一线程束对应的线程块号和所述第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定所述第二取指请求。
39.例如,在本公开一些实施例提供的指令调度装置中,所述指令广播判定单元还被配置为,基于所述第一线程束对应的程块号和所述第一线程束对应的程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,产生广播掩码,其中,所述广播掩码包括对应于所述第二取指请求的信息位;
40.所述指令预处理单元使用所述广播掩码将所述第一指令数据在第一时钟周期中广播发送至所述第二线程束的指令数据存取区的写地址。
41.例如,在本公开一些实施例提供的指令调度装置中,所述广播掩码还包括对应于所述第一取指请求的信息位,所述指令预处理单元还被配置为使用所述广播掩码将所述第一指令数据在第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。
42.例如,在本公开一些实施例提供的指令调度装置中,每个取指请求的属性信息还包括指令数据存取区的写地址,
43.所述指令预处理单元还被配置为:
44.通过所述第一取指请求的属性信息获取所述第一线程束的指令数据存取区的写
地址,以及
45.通过所述第二取指请求的属性信息获取所述第二线程束的指令数据存取区的写地址。
46.例如,在本公开一些实施例提供的指令调度装置中,每个取指请求的属性信息还包括程序计数器,
47.所述指令预处理单元还被配置为,通过所述第一取指请求的属性信息的程序计数器获取所述第一取指请求对应的第一取指地址。
48.例如,在本公开一些实施例提供的指令调度装置中,每个取指请求的属性信息还包括指令数据存取区的状态,
49.所述指令缓存区状态包括发起所述取指请求的线程束的指令数据存取区是否为未满。
50.本公开至少一实施例还提供一种处理器,包括至少一个计算单元,其中,所述计算单元包括上述任一实施例提供的所述指令调度装置。
51.本公开至少一实施例还提供一种指令调度装置,该指令调度装置包括:存储器,用于非暂时性存储计算机可执行指令;以及处理器,用于运行所述计算机可执行指令,其中,所述计算机可执行指令被所述处理器运行时,执行本公开任一实施例提供的指令调度方法。
52.本公开至少一实施例还提供一种非暂时性存储介质,非暂时性地存储计算机可执行指令,其中,当所述计算机可执行指令由计算机执行时,执行本公开任一实施例提供的指令调度方法。
附图说明
53.为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
54.图1为一种通用图形处理器(gpgpu)的结构示意图;
55.图2为一种通用图形处理器(gpgpu)的流水线运行流程图;
56.图3为一种计算单元的取指流程示意图;
57.图4为一种指令调度装置执行取指操作的示意图;
58.图5为同一线程块中不同线程束在计算单元上的运行周期示意图;
59.图6为本公开一实施例提供的一种指令调度方法的流程图;
60.图7为本公开一实施例提供的一种指令调度方法应用于一种计算单元中指令调度装置的流程示意图;
61.图8为本公开一实施例工作过程中一种指令广播模式示意图;
62.图9为本公开一实施例工作过程中另一种指令广播模式示意图;
63.图10本公开一实施例提供的一种指令调度装置的示意性框图;
64.图11为本公开一实施例提供的另一种指令调度装置的示意性框图;
65.图12为本公开一实施例提供的一种非暂时性存储介质的示意图。
具体实施方式
66.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
67.除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“一个”、“一”或者“该”等类似词语也不表示数量限制,而是表示存在至少一个。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
68.下面通过几个具体的实施例对本公开进行说明。为了保持本公开实施例的以下说明清楚且简明,本公开省略了已知功能和已知部件的详细说明。当本公开实施例的任一部件在一个以上的附图中出现时,该部件在每个附图中由相同或类似的参考标号表示。
69.例如,gpgpu中的指令调度装置进行取指的时候,由于指令执行的太快,数据更新跟不上指令执行的速率,一旦指令执行所需要的数据在数据缓存中不存在,就需要从共享缓存中获取,甚至指令执行所需要的数据在所有层级的数据缓存中都不存在,那么将从外部的存储空间(例如,主存)中获取,导致获取该指令执行所需要的数据所经历的路径较长,延时较高。因此,计算单元对数据带宽的需求远远大于其对指令带宽的需求,导致较大的数据带宽压力。
70.例如,由于计算核心与指令缓存只存在一个接口,所以在一个时钟周期,指令调度装置只能为一个线程束取指,以便多个计算核心同时或分时运行该线程束。如图4所示,指令调度装置包括:取指仲裁单元和指令预处理单元。计算单元上待运行的或正在运行的一个或多个线程束(这些线程束可以属于同一个线程块,也可以分属于不同的线程块)将发起的取指请求发送给取指仲裁单元。取指仲裁单元在一个时钟周期根据选取规则挑选出一个线程束来为其进行取指操作,而其它线程束的取指请求将会被阻塞,直到被取指仲裁单元选中为止。例如,取指仲裁单元选出对指令需求最为迫切的线程块1中的线程束1的取指请求。取指仲裁单元将挑选出来的某线程束(例如,线程块1中的线程束1)发起的取指请求发送至指令缓存(或者,共享缓存区等其它层级缓存区)中,从指令地址进行取指操作。然后,指令预处理单元接收指令缓存返回的指令数据(例如,线程块1中的线程束1的指令数据)并判断返回的指令数据的有效部分,例如,该指令数据是为线程块1中的线程束1进行取指,该指令数据的指令数据存取区的状态和指令数据存取区的写地址等。最后将指令数据写入该线程束的指令数据存取区的写地址,完成该线程束(例如,线程块1中的线程束1)的取指,以便于进行后续的译码、执行、访存和写回,完成该线程束在对应计算单元上的运行。
71.例如,图5示出同属一个线程块中的4个线程束(线程束0~线程束4)在计算单元上从开始到结束运行的周期示意图。这4个线程束虽然是流水线连续运行的,但是由于各个线
程束所需要的数据更新的速度不同,导致最先开始运行的线程束不一定会最先结束,即各个线程束的整体运行时间不一定相同。因此,不同的线程束在同一时钟周期可能会访问指令缓存的同一指令地址,或者不同的线程束在不同时钟周期访问指令缓存的同一指令地址时,这两个不同时钟周期的差距较小。由于同属一个线程块的4个线程束所执行的核心指令代码(kernel)相同,那么可以将其中一个线程束所取回的指令数据广播给其余正在取或者将要取这笔指令数据的线程束。
72.另外,cpu端的一个可并行计算任务可能会分成多个线程块共同完成,只是因为分属不同线程块的线程束之间的整体运行时间差相较于同属一个线程块的线程束之间的整体运行时间差更大,所以属于不同线程块中的两个线程束在同一时钟周期访问指令缓存中同一指令地址可能性相对较低,而且分属不同线程块中的线程束达到同步运行概率较低,但是,实现分属不同线程块的线程束同样具有取指广播的可能性。
73.本公开至少一些实施例提供一种指令调度方法,包括:选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于第一指令地址取指操作;接收从第一指令地址返回的对应于第一取指请求的第一指令数据;响应于第二线程束发起的对第一指令地址进行取指的第二取指请求,将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。
74.本公开的一些实施例还提供对应于指令调度方法的指令调度装置,该指令调度装置,包括:取指仲裁单元,被配置为选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于第一指令地址取指操作;指令预处理单元,被配置为接收从第一指令地址返回的对应于第一取指请求的第一指令数据,以及被配置为响应于第二线程束发起的对第一指令地址进行取指的第二取指请求,将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。
75.本公开的一些实施例还提供对应于上述指令调度方法的非暂时性存储介质,该存储介质非暂时性地存储计算机可读指令,其中,当计算机可读指令由计算机执行时,执行上述本公开的实施例提供的指令调度方法。
76.本公开的上述实施例提供的指令调度方法,当接收从第一指令地址返回的第一指令数据时,将第一指令数据广播发送至对第一指令地址有取指请求的各个线程束的指令数据存取区的写地址,有效减少计算单元进行取指操作时对指令缓存或其他若干级缓存等缓存系统的访问,即减少指令缓存或其他若干级缓存等缓存系统的访问带宽,进而减少执行指令所需数据的数据缓存或其他若干级缓存等缓存系统的访问带宽。
77.下面结合附图对本公开的一些实施例及其示例进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本公开,并不用于限制本公开。
78.图6为本公开一些实施例提供的一种指令调度方法的流程图。图7为本公开一实施例提供的一种指令调度方法应用于一种计算单元中指令调度装置的示意图。
79.如图7所示,指令调度装置包括取指仲裁单元、指令预处理单元和指令广播判定单元。取指仲裁单元用于在各个时钟周期内对计算单元上需要运行的各个线程束发起的取指请求进行仲裁,选择出一个线程束的取指请求以进行取指操作。指令预处理单元用于在各个时钟周期内接收并分析返回由取指操作返回的对应于线程束的取指请求的指令数据,例如,指令数据包括多条可执行指令,多条可执行指令的大小可以为8双字(dword,32bit,4字
节),并在接收返回的指令数据的时钟周期内,将该指令数据广播发送至一个或多个线程束的指令数据存取区的写地址。指令广播判定单元用于确定需要被广播该指令数据的一个或多个线程束。
80.例如,如图6所示,该指令调度方法包括以下步骤s100至步骤s300,下面将结合图7所示的指令调度装置来对本公开实施例的指令调度方法进行介绍。
81.步骤s100:选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于第一指令地址取指操作。
82.例如,图7示出计算单元上运行的线程块0~线程块m,其中,每个线程块包括线程束0~线程束n(n和m均为大于等于0的正整数);计算单元上可以运行一个或多个线程块,每个线程块可以包括一个或多个线程束。在各个时钟周期,多个线程束发起对应的多个取指请求处于候选状态,等待取指仲裁单元的选择。例如,每个取指请求的属性信息包括:发起该取指请求的线程束所属的线程块的线程块号(例如线程块0)、发起该取指请求的线程束在所属线程块中的线程束号(例如线程束0)、指令数据存取区的状态、指令数据存取区的写地址、程序计数器等,例如,每个取指请求的属性信息还可以包括单一线程束标识。其中,指令数据存取区通常为ram(随机存取存储器),用于临时存取指令数据,例如,返回的指令数据可能混合地包括多个双字指令(dword,32bit,4字节)和四字指令(qword,64bit,8字节)。多个双字指令并不是即刻被发射至计算核心进行执行,而是按照顺序连续被发射执行,因此需要指令数据存取区缓存返回的一个或多个指令数据。指令数据存取区的状态包括发起该取指请求的线程束对应的指令数据存取区是否为未满。单一线程束标识表明发起该取指请求的线程束所属的线程块中只有一个线程束,即发起该取指请求的线程束,例如,对于这种状态可以确定为不需要对该取指请求返回的指令数据进行广播。
83.需要指出的是,前述,选出的“第一线程束”可以是线程块0~线程块m中作为描述对象的任一线程束;“第一取指请求”可以是该作为描述对象的线程束发起的取指请求;“第一指令地址”可以是该取指请求对应的指令地址。
84.例如,取指仲裁单元挑选出第一线程束为线程块1中线程束1发起的第一取指请求。第一取指请求的属性信息包括:第一线程块号(例如,线程块号1)、第一线程束号(例如,线程束号1)、程序计数器记录的第一指令地址、第一线程束的指令数据存取区的状态和指令数据存取区的写地址等。在处于候选状态的多个线程束的取指请求中,取指仲裁单元进行仲裁之后选择了该第一线程束的第一取指请求,将第一取指请求发送至指令缓存,判断第一指令地址中是否存在第一线程束的第一取指请求所针对的指令数据,如果存在,则指示对于第一指令地址进行取指操作,如果不存在,则将第一取指请求发送至共享缓存或更多级缓存中,并对于第一指令地址进行取指操作。
85.步骤s200:接收从第一指令地址返回的对应于第一取指请求的第一指令数据。
86.例如,经过若干时钟周期后,在作为描述对象的第一时钟周期内,指令预处理单元接收从第一指令地址返回的对应于第一取指请求的第一指令数据,对接收的第一指令数据进行分析,得到分析结果信息。例如,分析结果信息可以包括该第一指令数据的第一取指请求的属性信息:发起该第一取指请求的线程束所属的线程块的线程块号以及发起该第一取指请求的线程束在所属线程块中的线程束号,以及该第一指令数据是否需要开启广播功能的信息。
87.然后,指令预处理单元将上述分析结果信息发送至指令广播判定单元。在各个时钟周期,候选的线程束发起的取指请求被更新至指令广播判定单元,指令广播判定单元记录每个候选的取指请求的属性信息,这些属性信息被保存至例如取指请求对应的指令数据被发送至相应线程束的指令数据存取区之后,或者被保存至例如取指请求对应的指令数据被执行或退休(retire)之后。指令广播判定单元根据分析结果信息和当前记录候选的取指请求的属性信息,确定该第一指令数据需要广播发送至哪些发起候选的取指请求的线程束的指令数据存取区,这些候选的取指请求都对应于第一取指地址(即对应于第一指令数据)。
88.在至少一些示例中,如何确定该第一指令数据需要广播发送至哪些候选的线程束的指令数据存取区的示例性过程,本公开的方法可以包括如下步骤:
89.步骤s210,根据第一指令数据对应的第一取指请求的属性信息获取第一线程束对应的线程块号(例如,线程块1)和第一线程束对应的线程束号(例如,线程块1中的线程束1)。需要注意的是,如果第一指令数据对应的第一取指请求的属性信息中包括单一线程束标识,即第一线程束所属的线程块中只有第一线程束一个,那么第一指令数据无需开启广播功能;如果不包括单一线程束标识,那么相应地第一指令数据需开启广播功能。然后,将获取的第一线程束对应的线程块号和第一线程束对应的线程束号,以及第一数据是否需要开启广播功能发送至指令广播判定单元中。
90.步骤s220,指令广播判定单元基于第一线程束对应的线程块号(例如,线程块1)和第一线程束对应的线程束号(例如,线程块1中的线程束1)以及第一时钟周期内候选的多个取指请求的属性信息包括的线程块号和线程束号(例如,线程块1中的线程束2~n),确定将第一指令数据广播至第二线程束(例如,线程块1中的线程束2~n的一个或多个线程束)的指令数据存取区的写地址。指令广播判定单元将第一指令数据需要广播发送至哪些候选的线程束的指令数据存取区的信息,例如包括第一线程束的第一取指请求的属性信息和第二线程束的第二取指请求的属性信息,发送给指令预处理单元,以指示指令预处理单元在第一时钟周期内将第一指令数据广播发送至第一线程束对应的指令数据存取区的写地址和第二线程束对应的指令数据存取区的写地址。
91.需要指出的是,在本公开中,“第二线程束”可以包括线程块0~线程块m中的除了“第一线程束”之外的其它线程束中的一个,在某些示例中,第二线程束的数量可以为一个或多个(例如,以其中之一作为描述对象)。
92.例如,在不同的示例中,第一线程束和第二线程束属于同一线程块或属于不同的线程块。如上所述,因为同属一个线程块的多个线程束所执行的核心指令代码(kernel)相同,因此它们在相近的时间段内的取指请求针对的取指地址相同;此外,在一些较少见的情形中,不同的线程块的线程束也可能具有相同的取指地址。
93.步骤s300:响应于第二线程束发起的对第一指令地址进行取指的第二取指请求,将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。
94.例如,指令预处理单元从指令广播判定单元获取第一指令数据的广播对象(例如,第一线程束以及第二线程束,在其他示例中,还可以包括与第二线程同样发起对第一指令地址进行取指的一个或多个其他线程束),通过第一取指请求的属性信息获取第一线程束
的指令数据存取区的写地址,通过第二取指请求的属性信息获取第二线程束的指令数据存取区的写地址,同时通过第一取指请求的属性信息获取第一线程束的指令数据存取区的状态,通过第一取指请求的属性信息获取第二线程束的指令数据存取区的状态,确定第一线程束的指令数据存取区的状态和第二线程束的指令数据存取区的状态是被占用还是空闲,如果均为空闲状态,那么,在第一时钟周期,将接收的第一指令数据广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。
95.如果在第一时钟周期,第二线程束已经被指令仲裁单元选出但尚未发出,那么本公开实施例的指令调度方法还可以包括如下步骤s400:
96.步骤s400:取消第二取指请求。
97.例如,由于在第一时钟周期,指令预处理单元将从第一指令地址返回的第一指令数据已经广播发送至第二线程束的指令数据存取区的写地址中,那么无需再对第二线程束发起的对第一指令地址的取值请求响应以进行取指操作,所以,指令预处理单元取消该第二取指请求。
98.例如,在至少一个示例中,指令广播判定单元基于第一线程束对应的线程块号和第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,产生广播掩码。例如,广播掩码包括对应于第二取指请求的信息位和对应于第一取指请求的信息位。指令广播判定单元将广播掩码和广播掩码对应的指令数据存取区的写地址发送至指令预处理单元。指令预处理单元使用广播掩码将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。
99.例如,运行在计算单元上的m个线程束可以虚拟记录为线程束掩模(thread warp slot),例如,该m个线程束可以属于同一线程块或不同线程块。例如,线程束掩模(thread warp slot)为一维数组,共有m个比特位,每个比特位表示一个属于某线程块的某线程束。例如,运行在计算单元上的线程束个数的最大值可以是10,那么m=10。由于指令广播判定单元基于第一线程束对应的线程块号和第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号确定第二取指请求,即确定了需要被指令数据广播的第二线程束(例如,还可以包括更多的满足指令数据广播条件的其他线程束),同时第一线程束也需要被指令数据广播。使用广播掩码表示需要被指令数据广播的第二线程束和第一线程束(以及可能的更多的满足指令数据广播条件的其他线程束)。
100.例如,广播掩码为一个一维数组,共有m个比特位,与线程束掩模的m个比特位一一对应。例如,广播掩码可以表示为inst_broadcast_mask[m],m最大值应为线程束掩模的最大值。广播掩码中某比特位是否置1表示该比特位对应的线程束是否需要被指令数据广播,即置1的比特位包括第一取指请求的信息位和第二取指请求的信息位。例如,广播掩码为0011000000,置1的第三比特位为第一取指请求的信息位,例如,第三比特位表示第一线程束为线程块1中的线程束1;置1的第四比特位为第二取指请求的信息位,例如,第四比特位表示第二线程束为线程块1中的线程束2。
[0101]
例如,在至少一些示例中,将从第一指令地址返回的第一指令数据在第一时钟周期广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址的广播模式可以有如下两种。
[0102]
例如,指令预处理单元在第一时钟周期接收从第一指令地址返回的对应于第一取指请求的第一指令数据,并确定第二线程束发起的对第一指令地址进行取指的第二取指请求之后,在第二取指请求在第一时钟周期中处于候选且被选出的情况下,指令预处理单元取消第二取指请求对应的取指操作,同时将第一指令数据广播发送至第二线程束的指令数据存取区的写地址。
[0103]
或者,第二线程束发起的第二取指请求在第一时钟周期中处于候选且被忽略的情况下,指令预处理单元取消第二取指请求对应的取指操作,同时将所述第一指令数据广播发送至第二线程束的指令数据存取区的写地址。
[0104]
例如,在至少一些示例中,基于上述两种广播模式,在不同的情形中,第一取指请求和第二取指请求在第二时钟周期中处于候选(第一时钟周期位于第二时钟周期之后),第一取指请求被选出,第二取指请求被忽略,或第二时钟周期到第一时钟周期之间的一个或多个中间操作周期中,第二取指请求都被忽略,或在第二时钟周期中,第三线程束发起的对于第一指令地址进行取指的第三取指请求处于候选,但被忽略;以及,在第二时钟周期到第一时钟周期之间的第三时钟周期中,第三取指请求处于候选且被选出,以进行对于第一指令地址的取指操作。
[0105]
如图8所示的广播模式的示例性情形中,同一个线程块中的线程束0~线程束3在t*n时钟周期内都对指令地址0(if,pc=0,第一指令地址的示例)有取指请求,此时线程束0~线程束3的取指请求都处于候选状态。
[0106]
在t*n时钟周期内,线程束0的取指请求被取指仲裁单元选出(以加粗显示,以下相同),进行对于指令地址0取指操作,同时其他的线程束的取指请求都被忽略(以浅色显示,以下相同),例如,线程束3的取指请求处于候选但被忽略,同样,线程束1和线程束2的取指请求处于候选但被忽略。
[0107]
在t*n+1时钟周期内,线程束1的取指请求被取指仲裁单元选出,进行对于指令地址0取指操作,同时其他的线程束的取指请求处于候选状态但都被忽略,例如,线程束3的取指请求被忽略,同样,线程束2的取指请求处于候选状态但被忽略。
[0108]
在t*n+2时钟周期内,线程束2的取指请求被取指仲裁单元选出,进行对于指令地址0取指操作,同时线程束3的取指请求处于候选状态但被忽略。
[0109]
在t*n+3时钟周期内,线程束0的指令数据从指令地址0返回(inst rtn,pc=0),此时同样要对指令地址0取指的线程束3的取指请求仍然处于候选状态,那么将线程束0的指令数据同时广播给在先前t*n~t*n+2时钟周期均处于候选且被忽略的线程束3的取指请求的指令数据存取区的写地址,这相当于已经响应了要对指令地址0取指的线程束3的取指请求(因此图中对于线程束3同时还标注了inst rtn,pc=0),同时取消线程束3的取指请求的取值操作。
[0110]
另一方面,在t*n~t*n+2时钟周期已经进行了取指操作的线程束1和线程束2,将等待针对它们的取指操作取回的指令数据。
[0111]
例如,在t*n+4时钟周期内,线程束1的指令数据从指令地址0返回,而此时,线程束5对指令地址0的取指请求处于候选且被取指仲裁单元选出,那么线程束1的指令数据可以广播给线程束5,同时取消线程束5的取指请求的取值操作。
[0112]
同理,在t*n+5时钟周期内,线程束2的指令数据从指令地址0返回,而此时线程束4
对指令地址0的取指请求处于候选且被取指仲裁模块选出,那么线程束2的指令数据可以广播给线程束4,同时取消线程束4的取指请求的取值操作。
[0113]
需要指出的是,在上面所示出的情形中,第一时钟周期的示例包括t*n+3时钟周期、t*n+5时钟周期,对应地,第二时钟周期的示例包括t*n时钟周期,中间操作周期的示例包括t*n+1时钟周期和t*n+2时钟周期,例如,第三时钟周期的示例包括t*n+1时钟周期。在上述情形中,第一取指请求的示例可以包括线程束0对指令地址0的取指请求、线程束2对指令地址0的取指请求;对应地,第二取指请求的示例可以包括线程束3对指令地址0的发起的取指请求、线程束4对指令地址0的取指请求、线程束5对指令地址0的取指请求;第三取指请求的示例可以包括线程束1对指令地址0的取指请求。
[0114]
另外,在图8所示的广播模式的示例性情形中,还示出了线程束0~线程束5对于指令地址32(if,pc=32,第一指令地址的示例)在不同指令周期中的多个取指请求的处理过程,这与上述对于对指令地址0的取指请求类似,这里不再赘述。
[0115]
如图9所示的广播模式的示例性情形中,同一个线程块中的线程束0~线程束3在t*n时钟周期内都对指令地址0(if,pc=0,第一指令地址的示例)有取指请求,此时线程束0~线程束3的取指请求都处于候选状态。
[0116]
在t*n时钟周期内,线程束0的取指请求被取指仲裁单元选出,进行对于指令地址0取指操作,同时处于候选状态的其他的线程束的取指请求例如,线程束1~线程束3的取指请求,都被忽略。
[0117]
在t*n+1时钟周期和t*n+2时钟周期,处于候选状态的线程束1~线程束3的取指请求也都被忽略。
[0118]
直到在t*n+3时钟周期内,线程束0的指令数据从指令地址0返回,那么将线程束0的指令数据同时广播给之前一直等待的线程束1~线程束3的指令缓存区写地址,实质上响应了线程束1~线程束3的取值请求。
[0119]
在t*n+4时钟周期,线程束5也发起了对指令地址0的取指请求,由于线程束0的指令数据已经被广播,那么此刻线程束5对地址0的取指请求不会被忽略,而是再次去指令地址0去取指令数据,重复之前线程束0取指广播的流程。
[0120]
在t*n+5和t*n+6时钟周期,线程束4也发起了对指令地址0的取指请求,但是都被忽略。
[0121]
在t*n+7时钟周期,线程束5的指令数据从指令地址0返回,那么将线程5的指令数据广播给之前一直在等待的线程束4的指令缓存区写地址,实质上响应了线程束4的取值请求。
[0122]
需要指出的是,在所示出的情形中,第一时钟周期的示例包括t*n+3时钟周期、t*n+4时钟周期、t*n+7时钟周期,对应地,第二时钟周期的示例包括t*n时钟周期,中间操作周期的示例包括t*n+1时钟周期和t*n+2时钟周期。第一取指请求可以的示例包括线程束0对指令地址0的取指请求线程束5对指令地址0的取指请求;对应地,第二取指请求的示例包括线程束1~线程束3对指令地址0的取指请求以及线程束4对指令地址0的取指请求。
[0123]
另外,在图9所示的广播模式的示例性情形中,还示出了线程束0~线程束5对于指令地址32在不同指令周期中的多个取指请求的处理过程,这与上述对于对指令地址0的取指请求类似,这里不再赘述。
[0124]
本公开至少一些实施例还提供一种指令调度装置,该装置例如用于并行处理器。该并行处理器例如为通用图形处理器(gpgpu),本公开的实施例对此不作限制。
[0125]
图10为本公开一些实施例提供的一种指令调度装置的示意性框图。如图10所示,该指令调度装置100包括取指仲裁单元110、指令预处理单元120和指令广播判定单元130。
[0126]
取指仲裁单元110被配置为选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于第一指令地址取指操作。
[0127]
指令预处理单元120被配置为接收从第一指令地址返回的对应于第一取指请求的第一指令数据,以及被配置为响应于第二线程束发起的对第一指令地址进行取指的第二取指请求,将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。
[0128]
例如,指令预处理单元120还被配置为取消第二取指请求。
[0129]
例如,指令预处理单元120还被配置为,在第二取指请求在第一时钟周期中处于候选且被选出的情况下,取消第二取指请求对应的取指操作。
[0130]
例如,指令预处理单元120还被配置为,对第二取指请求在第一时钟周期中处于候选的情形下,忽略第二取指请求。
[0131]
例如,指令预处理单元120还被配置为,对于第一取指请求和第二取指请求在第二时钟周期中处于候选的情形下,选出第一取指请求,忽略第二取指请求,其中,第一时钟周期位于第二时钟周期之后。
[0132]
例如,指令预处理单元120还被配置为,在第二时钟周期到第一时钟周期之间的一个或多个中间操作周期中,都忽略第二取指请求。
[0133]
例如,指令预处理单元120还被配置为,在第二时钟周期中,对于第三线程束发起的对于第一指令地址进行取指的第三取指请求处于候选的情形下,忽略第三取指请求;在第二时钟周期到第一时钟周期之间的第三时钟周期中,对于第三取指请求处于候选的情形下,选出第三取指请求,以进行对于第一指令地址的取指操作。
[0134]
例如,第一线程束和第二线程束属于同一线程块或属于不同的线程块。
[0135]
例如,指令广播判定单元130,被配置为记录每个取指请求的属性信息,其中,属性信息包括发起取指请求的线程束所属的线程块的线程块号以及发起取指请求的线程束在所属线程块中的线程束号。
[0136]
例如,指令广播判定单元130还被配置为:从指令预处理单元110获取返回的第一指令数据,根据第一取指请求的属性信息,获取第一线程束对应的线程块号和第一线程束对应的线程束号;以及基于第一线程束对应的线程块号和第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定第二取指请求。
[0137]
例如,指令广播判定单元130还被配置为,基于第一线程束对应的程块号和第一线程束对应的程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,产生广播掩码,其中,广播掩码包括对应于第二取指请求的信息位;指令预处理单元120还被配置为,使用广播掩码将第一指令数据在第一时钟周期中广播发送至第二线程束的指令数据存取区的写地址。
[0138]
例如,广播掩码还包括对应于第一取指请求的信息位,指令预处理单元120还被配置为,使用广播掩码将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据
存取区的写地址和第二线程束的指令数据存取区的写地址。
[0139]
例如,每个取指请求的属性信息还包括指令数据存取区的写地址,指令预处理单元120还被配置为,通过第一取指请求的属性信息获取第一取指请求的指令数据存取区的写地址,以及通过第二取指请求的属性信息获取第二取指请求的指令数据存取区的写地址。
[0140]
例如,每个取指请求的属性信息还包括程序计数器,指令预处理单元120还被配置为通过第一取指请求的属性信息的程序计数器获取第一取指请求对应的第一取指地址。
[0141]
例如,每个取指请求的属性信息还包括指令数据存取区的状态,指令数据存取区的状态包括发起取指请求的线程束的指令数据存取区是否为未满。
[0142]
例如,取指仲裁单元110、指令预处理单元120以及指令广播判定单元130中的各个单元可以通过硬件、固件或软件实现。
[0143]
因此,例如,处理器可以执行代码和程序以实现如上的各个模块的部分或全部功能。又例如,取指仲裁单元110、指令预处理单元120以及指令广播判定单元130中的各个单元可以是硬件器件,用来实现如上的各个模块的部分或全部功能。
[0144]
需要说明的是,指令调度装置100可以用于实现前述指令调度方法。例如,取指仲裁单元110可以用于实现前述指令调度方法中的步骤s100,具体实现过程和细节可以参考前述步骤s100的相关描述,在此不再重复赘述。例如,指令预处理单元120可以用于实现前述指令调度方法中的步骤s200和步骤s300,具体实现过程和细节可以参考前述步骤s200和s300的相关描述,在此不再重复赘述。例如,指令预处理单元120还可以用于实现前述指令调度方法中的步骤s400,具体实现过程和细节可以参考前述步骤s400的相关描述,在此不再重复赘述。例如,指令广播判定单元130还可以用于实现前述指令调度方法中的步骤s210和步骤s220,具体实现过程和细节可以参考前述步骤s210和s220的相关描述,在此不再重复赘述。
[0145]
图11为本公开一些实施例提供的另一种指令调度装置的示意性框图。例如,如图11所示,该指令调度装置500包括存储器510和处理器520。该指令调度装置例如可以用于并行处理器,该并行处理器例如为通用图形处理器(gpgpu),本公开的实施例对此不作限制。
[0146]
例如,存储器510用于非暂时性存储计算机可执行指令,处理器520用于运行该计算机可执行指令,该计算机可执行指令被处理器520运行时执行本公开任一实施例提供的指令调度方法。
[0147]
例如,存储器510和处理器520之间可以直接或间接地互相通信。例如,在一些示例中,如图11所示,该指令调度装置500还可以包括系统总线530,存储器510和处理器520之间可以通过系统总线530互相通信,例如,处理器520可以通过系统总线1006访问存储器510。例如,在另一些示例中,存储器510和处理器520等组件之间可以通过片上网络(noc)连接进行通信。
[0148]
例如,处理器520可以控制指令调度装置中的其它组件以执行期望的功能。处理器520可以是中央处理单元(cpu)、张量处理器(tpu)、网络处理器(np)或者图形处理器(gpu)等具有数据处理能力和/或程序执行能力的器件,还可以是数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。
[0149]
例如,存储器510可以包括一个或多个计算机程序产品的任意组合,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(ram)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(rom)、硬盘、可擦除可编程只读存储器(eprom)、便携式紧致盘只读存储器(cd-rom)、usb存储器、闪存等。
[0150]
例如,在存储器510上可以存储一个或多个计算机指令,处理器520可以运行该计算机指令,以实现各种功能。在计算机可读存储介质中还可以存储各种应用程序和各种数据,例如指令调度代码以及应用程序使用和/或产生的各种数据等。
[0151]
例如,存储器510存储的一些计算机指令被处理器520执行时可以执行根据上文所述的指令调度方法中的一个或多个步骤。
[0152]
例如,如图11所示,指令调度装置500还可以包括允许外部设备与指令调度装置500进行通信的输入接口540。例如,输入接口540可被用于从外部计算机设备、从用户等处接收指令。指令调度装置500还可以包括使指令调度装置500和一个或多个外部设备相互连接的输出接口550。例如,指令调度装置500可以通过输出接口550显示图像等。
[0153]
例如,关于本公开上述实施例的指令调度方法的处理过程的详细说明可以参考上述指令调度方法的实施例中的相关描述,重复之处不再赘述。
[0154]
需要说明的是,本公开的实施例提供的指令调度装置是示例性的,而非限制性的,根据实际应用需要,该指令调度装置还可以包括其他常规部件或结构,例如,为实现指令调度装置的必要功能,本领域技术人员可以根据具体应用场景设置其他的常规部件或结构,本公开的实施例对此不作限制。
[0155]
本公开的实施例提供的指令调度装置的技术效果可以参考上述实施例中关于指令调度方法的相应描述,在此不再赘述。
[0156]
本公开至少一些实施例还提供一种处理器,包括至少一个计算单元,其中,计算单元包括如前述任一实施例提供的指令调度装置。例如,该处理器为通用图形处理器,该通用图形处理器包括多个计算单元,每个计算单元包括指令调度装置,还可以包括多个计算核心、寄存器堆、指令缓存、数据缓存等。每个计算核心包括算数逻辑单元(alu)、浮点计算单元等。例如,当多个线程块在同一计算单元中执行时,该计算单元中的线程束可以来自于同一个线程块或不同的线程块,且同一线程束中所有线程可以按照simd方式执行。
[0157]
本公开至少一些实施例还提供一种非暂时性存储介质。图12为本公开一些实施例提供的一种非暂时性存储介质的示意图。例如,如图12所示,该存储介质600非暂时性地存储计算机可执行指令601,当非暂时性计算机可执行指令601由计算机(包括处理器)执行时可以执行本公开任一实施例提供的指令调度方法。
[0158]
例如,在存储介质600上可以存储一个或多个计算机指令。存储介质600上存储的一些计算机指令可以是例如用于实现上述指令调度方法中的一个或多个步骤的指令。
[0159]
例如,存储介质可以包括平板电脑的存储部件、个人计算机的硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom)、光盘只读存储器(cd-rom)、闪存、或者上述存储介质的任意组合,也可以为其他适用的存储介质。例如,存储介质600可以包括前述指令调度装置500中的存储器510。
[0160]
本公开的实施例提供的存储介质的技术效果可以参考上述实施例中关于指令调
度方法的相应描述,在此不再赘述。
[0161]
对于本公开,有以下几点需要说明:
[0162]
(1)本公开实施例附图中,只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
[0163]
(2)在不冲突的情况下,本公开同一实施例及不同实施例中的特征可以相互组合。
[0164]
以上,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以权利要求的保护范围为准。
技术特征:
1.一种指令调度方法,包括:选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于所述第一指令地址取指操作;接收从所述第一指令地址返回的对应于所述第一取指请求的第一指令数据;响应于第二线程束发起的对所述第一指令地址进行取指的第二取指请求,将所述第一指令数据在第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。2.根据权利要求1所述的方法,还包括:取消所述第二取指请求。3.根据权利要求1所述的方法,其中,在所述第二取指请求在所述第一时钟周期中处于候选且被选出的情况下,取消所述第二取指请求对应的取指操作。4.根据权利要求3所述的方法,其中,所述第二取指请求在所述第一时钟周期中处于候选且被忽略。5.根据权利要求1所述的方法,其中,所述第一取指请求和所述第二取指请求在第二时钟周期中处于候选,所述第一取指请求被选出,所述第二取指请求被忽略,其中,所述第一时钟周期位于所述第二时钟周期之后。6.根据权利要求5所述的方法,其中,在所述第二时钟周期到所述第一时钟周期之间的一个或多个中间操作周期中,所述第二取指请求都被忽略。7.根据权利要求5所述的方法,其中,在所述第二时钟周期中,第三线程束发起的对于所述第一指令地址进行取指的第三取指请求处于候选,但被忽略;在所述第二时钟周期到所述第一时钟周期之间的第三时钟周期中,所述第三取指请求处于候选且被选出,以进行对于所述第一指令地址的取指操作。8.根据权利要求1所述的方法,其中,所述第一线程束和所述第二线程束属于同一线程块或属于不同的线程块。9.根据权利要求1所述的方法,还包括:记录每个取指请求的属性信息,其中,所述属性信息包括发起所述取指请求的线程束所属的线程块的线程块号以及发起所述取指请求的线程束在所属线程块中的线程束号。10.根据权利要求9所述的方法,还包括:响应于返回所述第一指令数据,根据所述第一取指请求的属性信息,获取所述第一线程束对应的线程块号和所述第一线程束对应的线程束号;基于所述第一线程束对应的线程块号和所述第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定所述第二取指请求。11.根据权利要求10所述的方法,其中,基于所述第一线程束对应的线程块号和所述第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定所述第二取指请求,包括:产生广播掩码,其中,所述广播掩码包括对应于所述第二取指请求的信息位;其中,使用所述广播掩码将所述第一指令数据在所述第一时钟周期中广播发送至所述第二线程束的指令数据存取区的写地址。12.根据权利要求11所述的方法,其中,所述广播掩码还包括对应于所述第一取指请求
的信息位,使用所述广播掩码将所述第一指令数据在所述第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。13.根据权利要求10所述的方法,其中,每个取指请求的属性信息还包括指令数据存取区的写地址,通过所述第一取指请求的属性信息获取所述第一取指请求的指令数据存取区的写地址;通过所述第二取指请求的属性信息获取所述第二取指请求的指令数据存取区的写地址。14.根据权利要求10所述的方法,其中,每个取指请求的所述属性信息还包括程序计数器,通过所述第一取指请求的属性信息的程序计数器获取所述第一取指请求对应的第一取指地址。15.根据权利要求10所述的方法,其中,每个取指请求的所述属性信息还包括指令数据存取区的状态,所述指令数据存取区的状态包括发起所述取指请求的线程束的指令数据存取区是否为未满。16.一种指令调度装置,包括:取指仲裁单元,被配置为选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于所述第一指令地址取指操作;指令预处理单元,被配置为接收从所述第一指令地址返回的对应于所述第一取指请求的第一指令数据,以及配置为响应于第二线程束发起的对所述第一指令地址进行取指的第二取指请求,将所述第一指令数据在第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。17.根据权利要求16所述的指令调度装置,其中,所述指令预处理单元还被配置为取消所述第二取指请求。18.根据权利要求16所述的指令调度装置,其中,所述指令预处理单元还被配置为,在所述第二取指请求在所述第一时钟周期中处于候选且被选出的情况下,取消所述第二取指请求对应的取指操作。19.根据权利要求18所述的指令调度装置,其中,所述指令预处理单元还被配置为,对所述第二取指请求在所述第一时钟周期中处于候选的情形下,忽略所述第二取指请求。20.根据权利要求16所述的指令调度装置,其中,所述指令预处理单元还被配置为,对于所述第一取指请求和所述第二取指请求在第二时钟周期中处于候选的情形下,选出所述第一取指请求,忽略所述第二取指请求,其中,所述第一时钟周期位于所述第二时钟周期之后。21.根据权利要求20所述的指令调度装置,其中,所述指令预处理单元还被配置为,在所述第二时钟周期到所述第一时钟周期之间的一个或多个中间操作周期中,都忽略所述第二取指请求。22.根据权利要求20所述的装置,其中,所述指令预处理单元还被配置为,在所述第二时钟周期中,对于第三线程束发起的对于所述第一指令地址进行取指的第
三取指请求处于候选的情形下,忽略所述第三取指请求;在所述第二时钟周期到所述第一时钟周期之间的第三时钟周期中,对于所述第三取指请求处于候选的情形下,选出所述第三取指请求,以进行对于所述第一指令地址的取指操作。23.根据权利要求16所述的指令调度装置,还包括指令广播判定单元,其中,所述指令广播判定单元被配置为记录每个取指请求的属性信息,其中,所述属性信息包括发起所述取指请求的线程束所属的线程块的线程块号以及发起所述取指请求的线程束在所属线程块中的线程束号。24.根据权利要求23所述的指令调度装置,其中,所述指令广播判定单元还被配置为:从所述指令预处理单元获取返回的所述第一指令数据,根据所述第一取指请求的属性信息,获取所述第一线程束对应的线程块号和所述第一线程束对应的线程束号;以及基于所述第一线程束对应的线程块号和所述第一线程束对应的线程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,确定所述第二取指请求。25.根据权利要求24所述的指令调度装置,其中,所述指令广播判定单元还被配置为,基于所述第一线程束对应的程块号和所述第一线程束对应的程束号以及候选的多个取指请求各自的属性信息包括的线程块号和线程束号,产生广播掩码,其中,所述广播掩码包括对应于所述第二取指请求的信息位;所述指令预处理单元还被配置为使用所述广播掩码将所述第一指令数据在第一时钟周期中广播发送至所述第二线程束的指令数据存取区的写地址。26.根据权利要求25所述的指令调度装置,其中,所述广播掩码还包括对应于所述第一取指请求的信息位,所述指令预处理单元还被配置为使用所述广播掩码将所述第一指令数据在第一时钟周期中广播发送至所述第一线程束的指令数据存取区的写地址和所述第二线程束的指令数据存取区的写地址。27.根据权利要求24所述的指令调度装置,其中,每个取指请求的所述属性信息还包括指令数据存取区的写地址,所述指令预处理单元还被配置为:通过所述第一取指请求的属性信息获取所述第一线程束的指令数据存取区的写地址,以及通过所述第二取指请求的属性信息获取所述第二线程束的指令数据存取区的写地址。28.一种处理器,包括至少一个计算单元,其中,所述计算单元包括如权利要求16-27任一所述的指令调度装置。29.一种指令调度装置,包括:存储器,用于非暂时性存储计算机可执行指令;以及处理器,用于运行所述计算机可执行指令,其中,所述计算机可执行指令被所述处理器运行时执行根据权利要求1-15任一项所述的指令调度方法。30.一种非暂时性存储介质,非暂时性地存储计算机可执行指令,其中,当所述计算机可执行指令由计算机执行时,执行根据权利要求1-15任一项所述的指令调度方法。
技术总结
一种指令调度方法、指令调度装置、处理器及存储介质,该指令调度方法包括:选出第一线程束发起的对于第一指令地址的第一取指请求,并进行对于第一指令地址取指操作;接收从第一指令地址返回的对应于第一取指请求的第一指令数据;响应于第二线程束发起的对第一指令地址进行取指的第二取指请求,将第一指令数据在第一时钟周期中广播发送至第一线程束的指令数据存取区的写地址和第二线程束的指令数据存取区的写地址。该指令调度方法能够减少计算单元由于取指操作对指令缓存或其他若干级缓存等缓存系统的访问,减少指令缓存或其他若干级缓存等缓存系统的访问带宽,进而减少执行指令所需数据的数据缓存或其他若干级缓存等缓存系统的访问带宽。存系统的访问带宽。存系统的访问带宽。
技术研发人员:喻琛 左航 潘于
受保护的技术使用者:海光信息技术股份有限公司
技术研发日:2021.12.01
技术公布日:2022/3/8