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

协作式工作窃取调度器的制作方法

2022-08-21 20:22:20 来源:中国专利 TAG:

协作式工作窃取调度器


背景技术:

1.gpu设备针对计算吞吐量而不是响应时间(即,延时)进行了优化。gpu架构和相关联软件中的传统设计选择面向高持续吞吐量的算术运算。特别是,gpu具有相对较小且简单的高速缓存和软件管理的暂存存储器,其最大化了大量算术逻辑单元(alu)的芯片空间,以用于并行处理海量数据集。但是,当前gpu的批量同步编程模型限制了它们在托管需要一定级别任务调度的灵活应用方面的适用性。已知的gpu调度策略是在硬件中定义的,并且不允许在gpu多处理器上的手动算法放置。例如,在相同的多处理器上运行需要多处理器同步的应用(例如,生产者-消费者模式)可能会导致死锁。在传统系统中,也很难为处理任务提供这样的环境:其中,类似的任务可以在同一多处理器上共同调度以从局部性中受益,例如更好地利用本地gpu高速缓存。
2.来自nvidia公司的计算统一设备架构(compute unified device architecture,cuda)框架提供了在gpu上启动协作线程网格的能力,其可以通过gpu本身上的全局屏障进行同步(不必与cpu上的屏障同步)。此功能允许用户将内核流水线(即,gpu程序)调度到gpu。然而,现成的gpu调度器仍然以未定义的方式在整个gpu设备上调度线程块,这阻止了在gpu多处理器上手动放置线程块。此限制可能未充分利用gpu资源。


技术实现要素:

3.在一个实施例中,提供了一种在具有中央处理单元(cpu)和图形处理单元(gpu)的计算系统中使用的方法,该方法包括:将第一存储器部分和第二存储器部分指派给:(i)在所述cpu上执行的工作窃取调度器的工作者线程和(ii)作为所述gpu的部分的执行单元;从与所述工作者线程相关联的队列取回任务;由所述工作者线程检测是否满足所述任务的截止条件(cutoff condition);当不满足所述截止条件时,将任务划分成两个或更多个附加任务,并将两个或更多个附加任务添加到所述队列中。
4.在一个实施例中,第一存储器部分包括门铃寄存器,并且第二存储器部分包括任务寄存器。
5.在一个实施例中,执行单元包括多个gpu核心和在多个gpu核心之间共享的同步机制。
6.在一个实施例中,第一数据包括与所述任务相对应的操作码和用于执行所述任务的实参(argument)中的一个或多个。
7.在一个实施例中,该方法还包括:当由执行单元将第二值存储在所述第一存储器部分中时,检测到所述任务已完成,所述检测由所述工作者线程执行。
8.在一个实施例中,该方法还包括:从所述第二存储器部分取回由所述执行单元作为执行所述任务的结果而生成的第二数据,所述第二数据由所述工作者线程响应于检测到第二值已被所述执行单元存储在所述第一存储器部分中而被取回。
9.在一个实施例中,该方法还包括:从所述第二存储器部分取回所述第一数据,所述第一数据由所述执行单元响应于检测到所述第一值已被所述工作者线程存储在所述第一
存储器部分中而由执行单元取回;以及执行所述任务,所述任务由所述执行单元基于所述第一数据而执行。
10.在一个实施例中,该方法还包括:在所述第二存储器部分中存储由所述执行单元作为执行任务的结果而生成的第二数据;在所述第二数据存储在所述第二存储器部分后发出存储器栅栏释放指令(memory fence release instruction);以及在所述第一存储器部分中存储指示所述任务完成的第二值,所述第二值由所述执行单元在所述存储器栅栏释放指令被发出后存储。
11.在一个实施例中,提供了一种系统,包括:具有执行单元的图形处理单元(gpu);具有第一存储器部分和第二存储器部分的随机存取存储器;中央处理单元(cpu),被配置为执行工作窃取调度器,所述工作窃取调度器具有被配置为执行以下操作的工作者线程:从与所述工作者线程相关联的队列取回任务;检测是否满足所述任务的截止条件;当不满足所述截止条件时,将所述任务划分成两个或更多个附加任务,并将两个或更多个附加任务添加到所述队列中。
12.在一个实施例中,第一存储器部分包括门铃寄存器,并且第二存储器部分包括任务寄存器。
13.在一个实施例中,执行单元包括多个gpu核心和在多个gpu核心之间共享的同步机制。
14.在一个实施例中,第一数据包括与所述任务相对应的操作码和用于执行所述任务的实参中的一个或多个。
15.在一个实施例中,工作者线程还被配置为在由所述执行单元将第二值存储在所述第一存储器部分中时执行检测所述任务完成的操作。
16.在一个实施例中,工作者线程还被配置为执行从所述第二存储器部分取回作为执行任务的结果而生成的第二数据的操作,第二数据响应于检测到执行单元已将第二值存储在第一存储器部分中而被取回。
17.在一个实施例中,执行单元被配置为执行以下操作:从所述第二存储器部分取回所述第一数据,所述第一数据响应于由工作者线程检测到所述第一值已存储在所述第一存储器部分中而被取回;以及基于所述第一数据执行所述任务。
18.在一个实施例中,执行单元还被配置为执行以下操作:在所述第二存储器部分中存储由执行单元作为执行任务的结果而生成的第二数据;在所述第二数据存储在所述第二存储器部分后发出存储器栅栏释放指令;以及将指示所述任务完成的第二值存储在所述第一存储器部分中,在发出所述释放存储器栅栏指令之后所述第二值被存储。
19.根据本公开的方面,提供了一种非暂时性计算机可读介质,被配置为存储一个或多个处理器可执行指令,一个或多个处理器可执行指令在由至少一个处理器处理时,使处理器执行具有工作者线程的工作窃取调度器,所述工作者线程被布置成与作为图形处理单元(gpu)的一部分的执行单元共享第一存储器部分和第二存储器部分,所述工作者线程被布置成执行以下操作:从与所述工作者线程相关联的队列取回任务;检测是否满足所述任务的截止条件。
20.在一个实施例中,第一存储器部分包括门铃寄存器,并且第二存储器部分包括任务寄存器。
21.在一个实施例中,执行单元包括多个gpu核心和在所述多个gpu核心之间共享的同步机制。
22.在一个实施例中,第一数据包括与任务相对应的操作码和用于执行所述任务的实参中的一个或多个。
附图说明
23.从以下附图的描述中可以更充分地理解上述特征,其中:
24.图1是根据本公开的方面的计算系统的示例的图;
25.图2a是根据本公开的方面的工作窃取调度器的示例的图;
26.图2b是由根据本公开的方面的图2a的工作窃取调度器使用的队列的示例的图;
27.图3a是根据本公开的方面的图形处理单元(gpu)的示例的图;
28.图3b是根据本公开的方面的作为图3a的gpu的一部分的执行单元的示例的图;
29.图4a是根据本公开的方面的说明图2a的工作窃取调度器的操作的图;
30.图4b是根据本公开的方面的共享存储器部分的示例的图;
31.图5a是根据本公开的方面的过程的示例的流程图;
32.图5b是根据本公开的方面的过程的示例的流程图;
33.图6a是根据本公开的方面的过程的示例的流程图;
34.图6b是根据本公开的方面的过程的示例的流程图;以及
35.图6c是根据本公开的方面的过程的示例的流程图。
具体实施方式
36.工作窃取(work-stealing)是一种高效的动态调度策略,其广泛在中央处理单元(cpu)上采用。工作窃取调度器通过在一组双端队列(以下简称“deque”)上分布任务来在并行处理器上执行负载平衡,每个双端队列与在处理核心上运行的工作者线程相关联。每个双端队列可以支持推送和弹出操作,其允许与该双端队列相关联的本地线程以与串行执行相同的顺序(即,堆栈顺序)调度和取消调度工作(即,任务)。每个双端队列还可以支持非本地线程(也称为窃贼线程(thief thread))在其本地双端队列上执行的任务已耗尽时采用的窃取操作。窃取操作可能会从受害者的双端队列的相对端(相对于本地线程)移除一个任务,以供窃贼线程执行。当一个任务被执行时,该任务的执行可能会频繁地生成附加的任务,这些任务然后被放置在本地双端队列上。
37.工作窃取调度器生成和处理在运行时形成有向无环图(dag)的任务。它们执行表示为分而治之递归的算法,其中,为每个父任务创建(即,分叉)一个或多个更细粒度的子任务。这些算法还指示线程必须在哪里等待(即,加入)分叉子任务才能完成执行。在递归的基本情况(称为顺序截止)中,要划分的任务太小而无法有收益地划分为子任务,此时执行顺序算法(即,叶任务)。收益性是对划分和调度子任务需要多少开销的度量。值得注意的是,所有算法工作都在叶任务中执行。
38.根据本公开,公开了一种改进的工作窃取调度器,其中,cpu执行工作窃取调度器的一部分,该部分递归地划分任务直到达到顺序截止,其中,调度器开销支配实际执行该任务的成本。此时,不是在cpu上执行顺序代码,而是改进的工作窃取调度器卸载任务以在可
用的图形处理单元(gpu)上执行。举例来说,在一些实施方式中,本公开可以通过呈现支持gpu并保持现有的通用工作窃取调度器的执行语义的异构、协作的工作窃取调度器设计来提供对现有工作窃取调度器(其仅利用cpu)的增强。
39.图1是根据本公开的方面的计算系统100的示例的图。计算系统100可以包括中央处理单元(cpu)109、图形处理单元(gpu)120、存储器130和共享存储器140。cpu 109可以包括任何合适类型的处理器,例如x86处理器、精简指令集计算机(risc)处理器、基于arm的处理器等。根据本示例,cpu 109包括多个cpu核心110a-110d,它们被布置为并行执行工作窃取调度器200的不同的工作者线程220(如图2所示)。尽管在图1的示例中,cpu 109具有四个cpu核心,但其中cpu具有任意数量的核心(例如,1、8等)的替代实施方式是可能的
40.gpu 120可以包括任何合适类型的图形处理单元,其具有以下能力:将存储器范围从cpu 109的地址空间直接映射到gpu 120的地址空间,从而共享单个虚拟地址空间。在一些实施方式中,gpu 120可以包括支持计算统一设备架构(cuda)框架的gpu。附加或可替代地,在一些实施方式中,gpu 120可以包括支持开放计算语言(opencl)框架的gpu。gpu 120可以包括多个gpu核心。根据本示例,gpu 120包括1024个gpu核心,然而应当理解,本公开不限于在gpu 120上提供任何特定数量的gpu核心132。
41.存储器130可以包括任何合适类型的随机存取存储器(ram),例如双倍数据速率同步动态随机存取存储器(ddr sdram)。共享存储器140可以包括分别映射到gpu 120的存储器空间的存储器130的一部分。因为共享存储器140被映射到gpu 120的存储器空间,所以cpu 109和gpu 120中的每一个都可以直接访问共享存储器140。例如,在一些实施方式中,共享存储器140可以通过使用cuda框架或opencl框架映射到gpu 120的存储器空间。在一些实施方式中,gpu 120可以被布置为接受指向共享存储器140的指针并且使用该指针从gpu内核内直接引用共享存储器140。类似地,至少一些cpu核心110也可以被布置为使用指针来直接引用共享存储器140。
42.图2a是在cpu 109上执行的工作窃取调度器200的示例的图。工作窃取调度器200可以是任何合适类型的并行计算软件和/或微代码的部分。工作窃取调度器200可以包括多个队列210和多个工作者线程220。工作者线程220中的每一个可以与不同的队列210相关联。根据本示例,工作者线程220a与队列210a相关联;工作者线程220b与队列210b相关联;工作者线程220c与队列210c相关联;并且工作者线程220d与队列210d相关联。如下面关于图2b进一步讨论的,线程220使用队列210来存储和取回任务。根据图2a的示例,每个队列210是一个双端队列。然而,替代实施方式是可能的,其中,另一种类型的队列和/或另一种类型的数据结构用于存储任务。尽管在本示例中,工作窃取调度器200以软件实现,但是其中工作窃取调度器200以硬件和/或作为软件(或微代码)或硬件的组合实现的替代实施方式也是可能的。
43.图2b是根据本公开的方面的队列210的图。如编号所示,队列210可以与作为工作窃取调度器200的一部分的队列210a-b中的任何一个相同或相似。如图所示,队列210可以被布置为存储一个或多个任务。每个任务可以表示被期望执行的特定操作。队列210中的任务一起可以是用于通过由工作窃取调度器200实现的并行计算算法执行的特定动作的有向无环图(dag)的一部分。如在整个公开中使用的,并且取决于上下文,术语“任务”可以指操作或对应于操作的描述符。例如,在一些实施方式中,术语“任务”可以指代对于执行操作必
要的任何合适类型的数据。举例来说,“任务”可以包括以下各项中的一个或多个:与操作相对应的操作码、用于执行操作的输入参数、与操作相关联的函数调用的实参、指向需要引用以便执行操作的其他数据的指针和/或执行操作所需的任何其他合适类型的数据。
44.图3a是根据本公开的方面的gpu 120的逻辑组织的示例的图。根据本示例,gpu 300被布置为执行执行单元(或分片(tile))310a、执行单元(或分片)310b、执行单元310c(或分片)和执行单元(或分片)310d。尽管在图3a的示例中,gpu 120被布置为实现四个执行单元,但应当理解,本公开不限于在gpu 120上实现任何特定数量的执行单元。在一些实施方式中,任何执行单元310可以包括在nvidia cuda(tm)框架中称为“块”或“束(wrap)”的事物。在一些实施方式中,每个执行单元310可以包括用于执行单元中的gpu核心的硬件屏障机制以用作同步点。可以根据本公开的原理和思想使用的执行单元的示例可以在标题为accelerating dataflow signal processing applications across heterogeneous cpu/gpu systems(跨异构cpu/gpu系统的加速数据流信号处理应用)的美国专利申请16/372,618中找到,该申请全部内容通过引用并入本文。
45.图3b是根据本公开的方面的执行单元310的示例的图。如编号所指示的,执行单元310可以与以上关于图3a讨论的任何执行单元310a-d相同或相似。如图3b所示,执行单元310可以包括一组gpu核心132,以及在该组中的所有gpu核心132之间共享的同步屏障320。根据本示例,执行单元310包括32个gpu核心132,但是其中执行单元310包括任意数量的gpu核心132(例如,1、4、8、16、64等)的替代实施方式是可能的。尽管在图3b的示例中,执行单元310包括同步屏障,但其中替代地使用另一种类型的同步机制的替代实施方式是可能的。简言之,本公开不限于任何特定类型的同步机制在执行单元310中。
46.执行单元310可以用于代表工作窃取调度器200中的工作者线程220执行任务。执行单元310中的gpu核心132之一可以被指派主要状态并且在本文中被称为作为“执行单元310的主要gpu核心”。例如,在一些实施方式中,具有等级(rank)“0”的gpu核心(在执行单元310中)可以被指定为执行单元310的主要gpu核心。执行单元310中的所有剩余gpu核心132可以被指派次要状态,并且在本文中被称为“执行单元310的次要gpu核心”。执行单元310的主要gpu核心132可以被布置为:(i)从工作者线程220中的给定的一个工作者线程获得任务,(ii)将任务划分为任务部分,(iii)执行任务部分之一并将剩余的任务部分提供给次要gpu核心,以及(iv)在任务完成时通知工作者线程。
47.在一个特定示例中,同步屏障320可以以硬件实现,并且它可以被布置为充当执行单元310中的gpu核心132之间的共享同步点。更具体地,同步屏障320可以导致每个gpu核心132(例如,主要gpu核心132和/或次要gpu核心320中的每一个)在其已完成执行其相应的任务部分并到达屏障320后进入等待状态。进入等待状态可以有效地防止gpu核心132立即开始执行下一个任务的一部分,并可能在当前任务的完成数据被工作者线程220之一取回之前盖写正在存储当前任务的完成数据的任务寄存器(例如,参见图4b中所示的任务寄存器430)。虽然在本示例中同步屏障320以硬件实现,但同步屏障320以软件或作为硬件和软件的组合实现的替代实施方式是可能的。简言之,本公开不限于同步屏障320的任何具体实施方式。
48.图4a是示出根据本公开的方面的计算系统100的操作的示意图。根据本公开的多个方面,共享存储器被划分为m个部分410,其中,m是等于已分配给工作窃取调度器200的执
行单元310的数量(即,在本示例中为四个)的正整数。共享存储器部分410可以用于在相应工作者线程220和相应执行单元310之间交换数据。如图4b所示,每个部分410包括门铃寄存器和任务寄存器430。门铃寄存器420可以是一个字宽,并且它可以用于在任务已经存储在任务寄存器430中时发出信号。任务寄存器430可以配置为存储特定任务。如上所述,贯穿本公开所使用的术语“任务”可以指代对于执行单元执行操作必要的任何数据。例如,存储在任务寄存器230中的“任务”可以包括以下各项中的一个或多个:与特定操作相关联的操作码、用于执行操作的输入参数、与操作相关联的函数调用的实参、指向为了执行操作而需要引用的其他数据的指针。
49.返回图4a,每个执行单元310可以被分配一个相应的共享存储器部分410。更具体地,执行单元310a可以被分配共享存储器部分410a,执行单元310a使用该共享存储器部分410a来发送和接收来自cpu核心110a(和/或工作者线程220a)的数据。执行单元310b可以被分配共享存储器部分410b,执行单元310b使用该共享存储器部分410b来发送和接收来自cpu核心110b(和/或工作者线程220b)的数据。执行单元310c可以被分配共享存储器部分410c,执行单元310c使用该共享存储器部分410c来发送和接收来自cpu核心110c(和/或工作者线程220c)的数据。并且执行单元310d可以被分配共享存储器部分410d,执行单元310使用该共享存储器部分410d来发送和接收来自cpu核心110d(和/或工作者线程220d)的数据。
50.此外,每个cpu核心110(和/或每个工作者线程220)可以被分配相应的一个共享存储器部分410。更具体地,cpu核心110a(和/或工作者线程220a)可以被分配共享存储器部分410a,cpu核心110a(和/或工作者线程220a)使用该共享存储器部分410a来发送或接收来自执行单元310a的数据。cpu核心110b(和/或工作者线程220b)可以被分配共享存储器部分410b,cpu核心110b(和/或工作者线程220b)使用该共享存储器部分410b来发送或接收来自执行单元310b的数据。cpu核心110c(和/或工作者线程220c)可以被分配共享存储器部分410c,cpu核心110c(和/或工作者线程220c)使用该共享存储器部分410c来发送或接收来自执行单元310c的数据。并且cpu核心110d(和/或工作者线程220d)可以被分配共享存储器部分410d,cpu核心110d(和/或工作者线程220d)使用该共享存储器部分410d来发送或接收来自执行单元310d的数据。
51.每个cpu核心110(和/或每个工作者线程220)可以映射到相应的执行单元310。根据图410a的示例,cpu核心110a(和/或工作者线程220a)被映射到执行单元310a;cpu核心110b(和/或工作者线程220b)被映射到执行单元310b;cpu核心110c(和/或工作者线程220c)被映射到执行单元310c;并且cpu核心110d(和/或工作者线程220a)被映射到执行单元310d。任何一个cpu核心110和对应的执行单元之间的映射可以通过将相同的共享存储器部分410分配给cpu核心和对应的执行单元310来实现。然而,应当理解,本公开不限于用于将cpu核心映射到相应执行单元的任何特定方法。
52.在一些实施方式中,每个cpu核心110(和/或工作者线程220)可以在映射到该cpu核心110和/或工作者线程220的执行单元310上执行任务。例如,cpu核心110a(和/或工作者线程220a)可以在执行单元310a上执行任务;cpu核心110b(和/或工作者线程220b)可以在执行单元310b上执行任务;cpu核心110c(和/或工作者线程220c)可以在执行单元310c上执行任务;并且cpu核心110d(和/或工作者线程220d)可以在执行单元310d上执行任务。例如,
当任何给定的工作者线程220检测到满足用于任务的顺序截止条件时,给定的工作者线程220可以识别映射到给定的工作者线程220的相应的执行单元310。接下来,给定的工作者线程220可以通过使用被分配给给定工作者线程220和相应的执行单元310两者的共享存储器部分410来将任务提供给相应执行单元310。接下来,相应的执行单元310从共享存储器部分410取回任务。接下来,相应的执行单元310可以执行任务并将作为执行任务的结果而生成的数据放回共享存储器部分410。并且最后,给定的工作者线程可以从共享存储器部分取回作为执行任务的结果而生成的数据。
53.虽然在图4a的示例中,每个cpu核心110(和/或工作者线程220)被分配单个共享存储器部分410,但是其中任何cpu核心110被分配多个共享存储器部分410的替代实施方式是可能的。虽然在图4b的示例中,每个cpu核心110(和/或工作者线程220)被映射到单个执行单元310,但其中任何cpu核心110(和/或工作者线程220)被映射到多个执行单元的替代实施方式是可能的。在这样的实施方式中,每个cpu核心110(和/或工作者线程)可以映射到相同数量的执行单元310。如果执行单元310的数量没有被cpu核心110(和/或工作者线程220)的数量整除,则cpu核心110(和/或工作者线程220)之一可以映射到更少的执行单元310。
54.图5a是根据本公开的方面的用于开始工作窃取调度器200的操作的过程500a的示例的流程图。根据本示例,过程500a由cpu核心110a执行。然而,其中过程500a由另一个cpu核心110执行的替代实施方式是可能的。
55.在步骤502,cpu核心110a实例化工作窃取调度器200的队列210和工作者线程220。在步骤504,cpu核心110a分配共享存储器140和共享存储器140内的多个共享存储器部分410。在步骤506,cpu核心110a将每个工作者线程220a指派给cpu 109的cpu核心110中的不同的一个。如上所述,作为执行步骤506的结果,工作者线程220a被指派给cpu核心110a,工作者线程220b被指派给cpu核心110b,工作者线程220c被指派给cpu核心110c,并且工作者线程220d被指派给cpu核心110d。在步骤508,核心110a将每个工作者线程220映射到相应的一个执行单元310。如上所述,作为执行步骤508的结果,工作者线程220a(和/或cpu核心110a)被映射到执行单元310a。工作者线程220b(和/或cpu核心110b)被映射到执行单元310b。工作者线程220c(和/或cpu核心110c)被映射到执行单元310c。并且工作者线程220d(和/或cpu核心110d)被映射到执行单元310d。在一些实施方式中,可以通过将相同的共享存储器部分410指派给工作者线程220和执行单元310来执行任何工作者线程220和任何执行单元310之间的映射。在步骤510,cpu核心110a开始执行工作者线程220。在一些实施方式中,可以根据过程500b来执行任何工作者线程220,这将在下文关于图5b进一步讨论。
56.图5b是根据本公开的方面的用于执行如过程500a的步骤510所指定的工作窃取调度器的工作者线程的过程500b的示例的流程图。根据图5b的示例,过程500b由工作者线程220a执行,然而可替代地,将理解的是过程500b可以由任何工作者线程220执行。在步骤522,工作者线程220a从队列210a取回(和/或移除)任务。在步骤524,工作者线程220a确定是否满足预定的截止条件。如果满足条件,则过程500b进行到步骤526。否则,如果不满足条件,则过程500b进行到步骤528。在步骤526,过程500b将任务划分为附加任务并将任务添加回到队列210a。在步骤528,工作者线程220a通过使用gpu 120的执行单元310a来执行任务。执行任务的方式将在下面关于图6a-6c进一步讨论。具体来说,图6a提供了由工作者线程220a出于在执行单元310a上执行任务的目的而执行的过程的示例。图6b提供了由执行单元
310a的主要gpu核心出于协调任务的不同部分的执行的目的而执行的过程600b的示例。并且图6c提供了由执行单元310a中的主要gpu核心和次要gpu核心中的任一个出于执行任务部分的目的而执行的过程600c的示例。
57.图6a是用于通过使用gpu执行如过程500b的步骤528所指定的任务的过程600a的流程图。在步骤602,工作者线程220a将任务(例如,在步骤522取回的任务)存储在共享存储器部分410a的任务寄存器430中。在步骤604,工作者线程220a发出存储器栅栏获取指令。在步骤606,工作者线程220a将第一值(例如,
‘1’
)存储在共享存储器部分410a的门铃寄存器420中。如下面关于图6b进一步讨论的,将第一值存储在门铃寄存器420中有效地通知执行单元310a:在任务寄存器430中存在等待执行的任务。在步骤608,工作者线程220a检测共享存储器部分410a的门铃寄存器420是否被设置为第二值(例如,
‘0’
)。如果门铃寄存器420被设置为第二值,则过程600a进行到步骤610。否则,如果门铃寄存器420没有被设置为第二值,则再次执行步骤608。换言之,在步骤606,工作者线程220a等待直到门铃寄存器420被设置为第二值(由执行单元310a),然后继续到步骤610。如下面关于图6b进一步讨论的,当门铃寄存器420被设置为第二值时,这有效地通知工作者线程220a:任务已被执行单元310a完成。在步骤610,工作者线程220a从共享存储器部分410a的任务寄存器430取回已经由执行单元310a中的一个或多个gpu核心存储在那里的完成状态字(和/或错误代码)。
58.图6b是用于执行如过程500b的步骤528所指定的任务的过程600b的示例的流程图。在步骤612,执行单元310a的主要gpu核心检测共享存储器部分410a的门铃寄存器420是否已被设置为第一值。如果门铃寄存器420被设置为第一值,则过程600b进行到步骤614。否则,再次重复步骤612。在步骤614,执行单元310a的主要gpu核心从共享存储器部分410a的任务寄存器430取回任务。在步骤616,执行单元310a的主要gpu核心将任务划分为多个任务部分。在步骤618,执行单元310a的主要gpu核心将多个任务部分中的每一个指派给执行单元310a中的gpu核心中的不同一个。例如,主要gpu核心可以将相应的任务部分指派给它自己和执行单元310a中的每个次要gpu核心。可替代地,当任务部分少于执行单元310a中的gpu核心时,主要gpu核心310a可以将相应的任务部分仅指派给执行单元310a中的一些gpu核心。在步骤620,执行单元310a的主要gpu核心132使执行单元310中的每个次要gpu核心132(其已被指派任务部分)开始执行其相应的任务部分。在步骤622,主要gpu核心132执行它已经指派给自己的任务部分。如可以容易地意识到的,在一些实施方式中,主要gpu核心132可以不向其自己指派任务部分,在这种情况下可以省略步骤622。在步骤622,执行单元310a的主要gpu核心检测执行单元310a中的每个gpu核心(其已被指派任务部分)是否已完成执行其相应任务部分。例如,检测每个gpu核心是否已经完成执行其相应的任务部分可以包括检测每个gpu核心是否已经到达执行单元310a的同步屏障320并且当前处于等待状态。如果每个gpu核心已经完成执行其相应的任务部分,则过程600b进行到步骤626。否则,重复步骤624。在步骤626,执行单元310a的主要gpu核心发出存储器栅栏释放指令。在步骤628,执行单元310a的主要gpu核心将共享存储器部分410a的门铃寄存器420设置为第二值(例如,
‘0’
)。
59.图6c是用于执行如过程500b的步骤506所指定的任务的过程600b的示例的流程图。在步骤642,执行单元310a的gpu核心132获得任务部分之一(在步骤618指派的)。在步骤644,gpu核心132执行任务部分。在步骤646,gpu核心132将完成指示符存储在共享存储器部
分410a的任务寄存器中。例如,如果gpu核心132已成功执行任务,则gpu核心132可以将存储器部分410部分的任务寄存器中的位之一设置为“1”。作为另一个示例,如果gpu核心132未能成功执行任务,则gpu核心132可以将相同的位设置为“0”。另外或可替代地,在一些实施方式中,当gpu核心132未能成功执行任务时,gpu核心132可以在任务寄存器中存储错误码,该错误码识别任务部分不能成功完成的原因。尽管在本示例中完成指示符是1位宽,但其中完成状态指示符具有更大大小的替代实施方式也是可能的。在任务648,gpu核心132作为到达执行单元310a的屏障同步屏障320的结果而进入等待状态。
60.在一些实施方式中,当任务完成时,字可以被存储在(共享存储器部分410a的)任务寄存器430中,其识别任务的完成状态。该字可以包括多个位。每个位可以由执行单元310中的不同gpu核心存储在任务寄存器中,并且它可以指示gpu核心是否已经成功地完成了已经被gpu核心执行的任务的一部分。如果该位等于“1”,则这可能表明gpu核心已成功完成其任务部分。否则,如果该位设置为“0”,则这可能表明gpu核心未能完成其任务部分。因此,当该字包含所有“1”时,则这可能表明该任务已被执行单元310成功完成。相比之下,当该字包含至少一个“0”时,则这可能表明该任务不能由执行单元310成功完成。尽管图1-图6c将共享存储器部分410a显示为在执行单元310a和工作者线程220a之间共享的唯一存储器,但是其中在执行单元310a和工作者线程220a之间共享附加存储器的替代实施方式是可能的,这用于向工作者线程220a提供结果数据。
61.根据本公开的方面,存储器栅栏获取和存储器栅栏释放指令可以是屏障指令,其使cpu 109(和/或在cpu 109上运行的编译器)强制执行数据存储在共享存储器410的门铃寄存器420和任务寄存器430中的顺序。具体地,在步骤604发出获取存储器栅栏指令确保:在第一值存储在共享存储器部分410a的门铃寄存器420中(在步骤606)之前,任务将被存储在共享存储器部分410a的任务寄存器430中(在步骤602)。类似地,在步骤626发出存储器栅栏释放指令确保:在共享存储器部分410a的门铃寄存器420被设置为第二值(在步骤632)之前,与任务相关联的所有完成数据将被复制到共享存储器部分410a的任务寄存器430中(在步骤624)。根据本公开,已经观察到使用存储器栅栏指令(与原子操作相对)来同步写入(共享存储器部分410的)门铃和任务寄存器可以大大减少协议的开销(参考图6a-6c描述)并提高执行任务(在步骤614获得)的效率。
62.在一些实施方式中,当存储器栅栏指令已经被发出时,看到共享存储器部分410a的门铃寄存器420中的第一值(例如,'1')可以向执行单元310a保证:有效任务存在于存储器部分410的任务寄存器430中。类似地,当发出存储器栅栏释放指令时,看到共享存储器部分410a的门铃寄存器420中的第二值(例如,'0')可以向cpu核心110a(和/或工作者线程220a)保证有效任务存在于存储器部分410的任务寄存器430中。在一些实施方式中,当cpu核心110a(和/或工作者线程220a)被映射到多个执行单元310时,cpu核心110a(和/或工作者线程220a)可以将任务(在步骤522获得的)划分为多个任务(例如,任务部分),并且用不同的一个执行单元310来执行每个任务部分(以关于图6a讨论的方式)。
63.根据图5b和图6a的示例,在步骤522,从队列210a取回任务,并且在步骤602,将任务存储在共享存储器部分410a的任务寄存器中。然而,步骤522和602不一定意味着:从队列210a取回的相同数据也存储在共享存储器部分410a的任务寄存器430中。例如,在一些实施方式中,可以从队列210a取回一个或多个第一数据项(在步骤522),并且可以将一个或多个
第二数据项存储在任务寄存器430中(在步骤602)。在这样的实施方式中,第二数据项可以与第一数据项相同或不同。另外或可替代地,在一些实施方式中,第二数据项中的至少一个可以至少部分是基于第一数据项而生成的。
64.在一些实施方式中,工作窃取调度器200可以断开一个或多个执行单元310(通过在该执行单元310的任务寄存器430中放置“断开”操作码)。在接收到“断开”操作码时,执行单元的主要gpu 132(和/或gpu 120中的其他硬件)可以将执行单元与工作窃取调度器200分离。
65.本公开不限于在工作窃取调度器200中使用任何特定的并行处理算法。在这方面,将理解本公开不限于评估任何特定的截止条件(在步骤524)。虽然图1-图6c的示例是在工作窃取调度器的上下文中呈现的,但是本公开不限于任何特定类型的调度器。
66.这里描述的过程不限于与图1的硬件和软件一起使用;它们可能适用于任何计算或处理环境以及任何类型的机器或能够运行计算机程序的机器组。这里描述的过程可以以硬件、软件或两者的组合来实现。此处描述的过程可以在可编程计算机/机器上执行的计算机程序中实现,每个可编程计算机/机器包括处理器、非暂时性机器可读介质或处理器可读的另一制品(包括易失性和非易失性存储器以及/或存储元件)、至少一个输入设备和一个或多个输出设备。程序代码可以应用于使用输入设备录入的数据以执行本文所述的任何过程并生成输出信息。
67.该系统可以至少部分地通过计算机程序产品来实现(例如,在非暂时性机器可读存储介质中,例如非暂时性计算机可读介质中),用于由数据处理装置(例如,可编程处理器、计算机或多台计算机)执行或用于控制它们的操作。每个这样的程序都可以用高级过程或面向对象的编程语言来实现,以与基于计算机的系统的其余部分一起工作。然而,程序可以用汇编、机器语言或硬件描述语言来实现。该语言可以是编译语言或解释语言,并且可以以任何形式部署,包括作为独立程序或作为模块、组件、子例程或适合在计算环境中使用的其他单元。计算机程序可以部署为在一个站点处的一台计算机或多台计算机上执行,或者跨多个站点分布并通过通信网络互连。计算机程序可以存储在可由通用或专用可编程计算机读取的非暂时性机器可读介质上,用于当计算机读取非暂时性机器可读介质以执行本文所描述的过程时配置和操作计算机。例如,本文描述的过程也可以实现为配置有计算机程序的非暂时性机器可读存储介质,其中在执行时,计算机程序中的指令使计算机根据过程进行操作。非暂时性机器可读介质可以包括但不限于硬盘驱动器、光盘、闪存、非易失性存储器、易失性存储器、磁盘等,但不包括瞬态信号本身。
68.已经描述了用于说明作为本专利的主题的各种概念、结构和技术的优选实施例,现在显而易见的是可以使用结合这些概念、结构和技术的其他实施例。因此,认为专利的范围不应限于所描述的实施例,而应仅受所附权利要求的精神和范围限制。
再多了解一些

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

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

相关文献