用于全面同步执行线程的技术的制作方法

文档序号:15964724发布日期:2018-11-16 23:06阅读:117来源:国知局

本发明的实施例总地涉及并行处理系统,并且更具体地,涉及用于全面同步执行线程的技术。

背景技术

图形处理单元(gpu)能够在专用可编程硬件处理单元上使用数量相对较多的小型并行执行线程来实现非常高的性能。在gpu中,“线程组(threadgroup)”或“线程束(warp)”是指对不同的输入数据大致同时执行相同指令的一组线程。然而,开发者可以编写代码,当其在gpu上执行时,使得线程束中的仅仅一部分线程执行指令。线程束中的线程在执行这类型指令期间被称为“分散的(diverged)”。引起这种分散的代码的示例是以c编程语言编写的代码,所述c编程语言包括导致两种或更多种指令序列的“if”语句,其中线程束中的不同线程集遵循序列中的每一个。

gpu的一个限制是,一些指令的合适行为假定每个线程束中的线程是聚合的(converged)。例如,gpu可以实现随机指令(shuffleinstruction),其允许线程束中的线程之间的直接寄存器到寄存器数据交换。当线程是分散的时,如果gpu试图对线程束执行随机指令,则结果是不可预期的。例如,在gpu上执行的代码可产生不正确的结果或意外终止。

尽管一些编译器和gpu实现了一些等级的同步功能,然而那些功能是有限的并且不能保证对所有情况都聚合。例如,许多gpu实现了意图同步线程束的屏障指令(barrierinstruction)。然而,屏障指令假定每个线程束中的线程已聚合并因此是不可靠的。在另一示例中,一些编译器分析代码以检测相对简单的分散模式。一旦检测到的分散模式,则编译器将两个指令之间的分散指令加上括号,所述两个指令分别指示重新聚合点以及在重新聚合点处继续执行。然而,编译器不能分析某些类型的复杂控制流,因此当需要用于正确执行代码时,编译器不能一直保证线程束中的线程是聚合的。

一般情况下,某些程序指令的实现可能需要跨线程束中的不同线程的聚合等级,线程束不能由包括在gpu中的编译器和硬件机制维护,所述编译器和硬件机制通常的任务是确保这种线程聚合。因此,确保代码正确执行的唯一方式是让程序员以不支持复杂控制流的编程语言编写代码,或者仅仅使用定义更丰富编程语言的有限的指令子集和操作子集来编写代码。采用这两种方法中的任何一种限制代码将大大减少程序员高效配置gpu的能力,这是不想要的。

如前面说明的,本领域需要更有效的技术以同步执行线程组或线程束中的线程。



技术实现要素:

本发明的一个实施例阐述了一种计算机实现的方法,用于同步包括在线程束中的多个线程,以同时执行单个后续指令。所述方法包括确定包括在多个线程中的第一线程已经到达指定所述多个线程的同步指令;确定包括在所述多个线程中的第二线程还没有到达所述同步指令;将所述第一线程配置为停止执行指令;针对所述第二线程发出至少一个指令;确定包括在所述多个线程中的所有线程已经到达所述同步指令;以及使得包括在所述多个线程中的所有线程执行单个后续指令。

所公开的技术的一个优点是所述技术使得处理器能够可靠且正确地执行代码和指令,其依赖于包括在线程束中的不同线程的聚合。相比之下,包括在传统处理器中的传统硬件机制不能一直确保在需要用于正确执行代码和指令时线程束中的线程是聚合的。

附图说明

为了可以详细理解本发明的上述特征,可通过参考实施例进行上面简要概括的本发明的更具体的描述,其中一些实施例在附图中示出。然而,需要注意的是,由于本发明可适用于其他相等效果的实施例,附图说明仅仅示出了本发明的典型实施例,因此不应认为是对其范围的限制。

图1是示出被配置成实现本发明的一个或更多个方面的计算机系统的框图;

图2是根据本发明的各种实施例的、包括在图1的并行处理子系统中的并行处理单元的框图;

图3是根据本发明的各种实施例的、包括在图2的并行处理单元中的通用处理集群的框图;

图4是根据本发明的各种实施例的、包括在图3的通用处理集群中的流式多处理器的框图;

图5是根据本发明的各种实施例的、在同时执行单个后续指令之前由图4的流式多处理器执行以同步包括在线程束中的不同线程的示例指令序列;以及

图6是根据本发明的各种实施例的、用于在同时执行单个后续指令之前同步包括在线程束中的不同线程的方法步骤的流程图。

具体实施方式

在下面的描述中,为了提供对本发明更彻底的理解,阐述了许多具体的细节。然而,对本领域技术人员显而易见的是,在不具有这些具体细节中的一个或更多个的情况也能实践本发明。

系统概述

图1是示出被配置成实现本发明的一个或更多个方面的计算机系统100的框图。如图所示,计算机系统100包括但不限于,中央处理单元(cpu)102和系统存储器104,其经由存储器桥105与通信路径113耦合至并行处理子系统112。存储器桥105经由通信路径106进一步耦合至i/o(输入/输出)桥107,而i/o桥107转而耦合至转换器(switch)116。

在操作中,i/o桥107被配置成从诸如键盘或鼠标之类的输入设备108接收用户输入信息,并经由通信路径106和存储器桥105将输入信息转发至cpu102用于处理。转换器116被配置成提供i/o桥107与计算机系统100的其他组件(诸如网络适配器118和各种附加卡120和121)之间的连接。

同样如图所示,i/o桥107耦合至系统盘114,系统盘114被配置成存储内容、应用程序和数据以由cpu102和并行处理子系统112使用。一般情况下,系统盘114提供用于应用程序和数据的非易失性存储,并且可以包括固定的或可移除的硬盘驱动器、闪存装置,以及cd-rom(光盘只读存储器),dvd-rom(数字通用盘-rom),蓝光光碟,hd-dvd(高清晰度dvd),或者其他磁、光或固态存储设备。最后,尽管没有明确示出,诸如通用串行总线或其他端口连接件、光盘驱动器、数字通用盘驱动器、胶片记录设备等之类的其他组件也可以连接到i/o桥107。

在不同的实施例中,存储器桥105可以是北桥(northbridge)芯片,以及i/o桥107可以是南桥(southbridge)芯片。此外,通信路径106和113以及计算机系统100内的其他通信路径可以采用任何技术上合适的协议(包括但不限于agp(加速图形端口)、超传输、或本领域已知的任何其他总线或点对点通信协议)来实现。

在一些实施例中,并行处理子系统112包括将像素传送给显示器设备110的图形子系统,所述显示器设备110可以是任何传统的阴极射线管、液晶显示器、发光二极管显示器以及诸如此类。在这种实施例中,并行处理子系统112合并最佳用于图形和视频处理的电路,包括例如视频输出电路。如下面在图2中更详细描述的,这样的电路可以跨越包括在并行处理子系统112内的一个或更多个并行处理单元(ppu)被合并。在其他实施例中,并行处理子系统112合并最佳用于通用处理和/或计算处理的电路。此外,这种电路可以跨越包括在并行处理子系统112内的一个或更多个ppu被合并,并行处理子系统112被配置成执行这种通用操作和/或计算操作。还在其他的实施例中,包括在并行处理子系统112内的一个或更多个ppu可以被配置成执行图形处理操作、通用处理操作和计算处理操作。系统存储器104包括被配置成管理并行处理子系统112内的一个或更多个ppu的处理操作的至少一个设备驱动程序103。

在不同的实施例中,并行处理子系统112可以与图1中的一个或更多个其他元件集成,以形成单个系统。例如,并行处理子系统112可以与cpu102和位于单个芯片上的其他连接电路集成,以形成片上系统(soc)。

将理解的是,在此示出的系统是示例性的,并且变形和变化是可能的。可以根据需要对包括桥的数量和布置、cpu102的数量以及并行处理子系统112的数量的连接拓扑进行修改。例如,在一些实施例中,系统存储器104可以直接地而不通过存储器桥105连接到cpu102,其他设备可以经由存储器桥105和cpu102与系统存储器104进行通信。在其他可选的拓扑中,并行处理子系统112可以连接到i/o桥107或直接连接到cpu102而不连接到存储器桥105。仍然在其他实施例中,i/o桥107和存储器桥105可以集成到单个芯片中而不是作为一个或更多个分立器件存在。最后,在某些实施例中,在图1中示出的一个或更多个组件可以不呈现。例如,可以去除转换器116,并且网络适配器118和附加卡120、121可以直接连接到i/o桥107。

图2是根据本发明的一个实施例的、包括在图1的并行处理子系统112中的并行处理单元(ppu)202的框图。尽管图2描述了一个ppu202,如上所表明的,并行处理子系统112可以包括任何数量的ppu202。如图所示,ppu202耦合到本地并行处理(pp)存储器204。ppu202和pp存储器204可以采用一个或更多个集成电路设备(诸如可编程处理器、专用集成电路(asic),或存储器设备)或者以任何其他技术上可行的方式实现。

在一些实施例中,ppu202包括图形处理单元(gpu),其可以被配置成基于由cpu102和/或系统存储器104提供的图形数据实现图形渲染管线,以执行有关生成像素数据的各种操作。当处理图形数据时,pp存储器204可用作图形存储器,图形存储器存储一个或更多个传统帧缓存,如有必要也存储一个或更多个其他渲染目标。除了别的以外,pp存储器204可以用于存储和更新像素数据并且将最终的像素数据或显示帧传送至显示器设备110用于显示。在一些实施例中,ppu202也可以被配置用于通用处理操作和计算操作。

在操作中,cpu102是计算机系统100的主处理器,控制和协调其他系统组件的操作。特别地,cpu102发出控制ppu202的操作的命令。在一些实施例中,cpu102将用于ppu202的命令流写入数据结构(在图1或图2中未明确示出),所述数据结构可位于系统存储器104、pp存储器204或cpu102和ppu202两者可访问的另一存储位置。指向数据结构的指针被写入入栈缓存(pushbuffer),以发起对数据结构中的命令流的处理。所述ppu202从入栈缓存中读取指令流,然后相对于cpu102的操作异步地执行命令。在生成多个入栈缓存的实施例中,通过应用程序经由设备驱动程序103控制不同入栈缓存的调度,可以指定每个入栈缓存的执行优先顺序。

还如图所示,ppu202包括经由通信路径113和存储器桥105与计算机系统100的其余部分进行通信的i/o(输入/输出)单元205。i/o单元205生成数据包(或其他信号)用于在通信路径113上传输,还从通信路径113接收所有进来的数据包(或其他信号),从而将进来的数据包引导到ppu202的合适的组件。例如,可以将与处理任务相关的命令引导到主机接口206,同时将与存储器操作(例如,从pp存储器204读取或写入pp存储器204)相关的命令引导到交叉开关单元(crossbarunit)210。主机接口206读取每个入栈缓存并将存储在入栈缓存中的命令流传送至前端212。

如上结合图1所述的,ppu202与计算机系统100的其余部件之间的连接可以是变化的。在一些实施例中,包括至少一个ppu202的并行处理子系统112被实现为可插入计算机系统100的扩展插槽中的附加卡。在其他实施例中,ppu202可以集成在具有诸如存储器桥105或i/o桥107之类的总线桥的单个芯片上。此外,仍然在其他实施例中,可以将ppu202的某些或所有元件连同cpu102包括在单个集成电路或片上系统(soc)中。

在操作中,前端212将从主机接口206接收到的处理任务发送至任务/工作单元207内的工作分配单元(未示出)。工作分配单元接收指向处理任务的指针,所述处理任务被编码为任务元数据(tmd)并存储在存储器中。将指向tmd的指针包括在命令流中,所述命令流被存储为入栈缓存并且由前端单元212从主机接口206接收。可被编码为tmd的处理任务包括,与要处理的数据相关联的索引以及定义怎样处理数据的状态参数和命令。例如,所述状态参数和命令可以定义要对所述数据执行的程序。任务/工作单元207从前端212接收任务,并且在发起由tmd中的每一个指定的处理任务之前,确保gpc208被配置成有效状态。针对每个tmd可以指定优先顺序,用于调度处理任务的执行。还可以从处理集群阵列230接收处理任务。可选地,tmd可以包括控制是否将tmd添加到处理任务列表(或指向处理任务的指针的列表)的头部或者尾部的参数,从而提供通过执行优先顺序的其他等级的控制。

基于包括一组c个通用处理集群(gpc)208(其中c≥1)的处理集群阵列230,ppu202有利地实现高度并行的处理架构。每个gpc208能够同时执行大量(例如,数百或数千个)线程,其中每个线程是程序的实例。在不同的应用中,可分配不同的gpc208用于处理不同类型的程序或者用于执行不同类型的计算。gpc208的分配可以根据每种类型的程序或计算产生的工作量而变化。

存储器接口214包括一组d个分区单元215,其中d≥1。每个分区单元215耦合至驻留在ppm存储器204中的一个或更多个动态随机存取存储器(dram)220。在一个实施例中,分区单元215的数量与dram220的数量相等,每个分区单元215耦合至不同的dram220。在其他实施例中,分区单元215的数量与dram220的数量不同。本领域普通技术人员将理解的是,dram220可以用任何其他技术上合适的存储设备代替。在操作过程中,可以将不同的渲染目标(诸如纹理贴图和帧缓存)跨dram220存储,允许分区单元215并行写入每个渲染目标的部分,以高效使用pp存储器204的可用宽带。

给定的gpc208可以处理将要被写入pp存储器204内的任何dram220的数据。交叉开关单元210被配置成将每个gpc208的输出路由至任何分区单元215的输入或路由至任何其他gpc208用于进一步处理。gpc208经由交叉开关单元210与存储器接口214进行通信,以从不同的dram220中读取或写入不同的dram220中。在一个实施例中,除了经由存储器接口214连接至pp存储器204以外,交叉开关单元210与i/o单元205连接,从而使得不同gpc208内的处理核能够与系统存储器104或其他ppu202的非本地存储器进行通信。在图2的实施例中,交叉开关单元210与i/o单元205直接连接。在不同的实施例中,交叉开关单元210可以采用虚拟通道分离gpc208和分区单元215之间的通信流。

此外,可以将gpc208编程以执行关于多种多样的应用(包括但不限于线性和非线性数据传输、视频和/或音频数据过滤、模型操作(例如,应用物理定律以确定对象的位置、速度和其他属性)、图像渲染操作(如,曲面细分着色器,顶点着色器、几何着色器和/或像素/片段着色器程序)、通用计算操作等)的处理任务。在操作中,ppu202被配置成将来自系统存储器104和/或pp存储器204的数据传送到一个或更多个芯片上存储器单元,处理所述数据,并将结果数据写回至系统存储器104和/或pp存储器204。然后,可以由其他系统组件(包括cpu102、并行处理子系统112内的另一ppu202或计算机系统100内的另一并行处理子系统112)访问结果数据。

如上所述,任何数量的ppu202可包括在并行处理子系统112中。例如,可在单个附加卡上提供多个ppu202,或者将多个附加卡连接到通信路径113,或将一个或更多个ppu202集成到桥芯片中。多ppu系统中的ppu202可以彼此完全相同或不同。例如,不同ppu202可以具有不同数量的处理核和/或不同数量的pp存储器204。在具有多个ppu202的实现方式中,可以并行操作那些ppu,从而以比采用单个ppu202所可能的更高的吞吐量来处理数据。合并了一个或更多个ppu202的系统可以以各种各样的配置和形状因子来实现,所述配置和形状因子包括但不限于桌上型电脑、膝上型电脑、手持式个人电脑或其他手持设备、服务器、工作站、游戏机、嵌入式系统,以及诸如此类。

图3是根据本发明的一个实施例的、包括在图2的ppu202中的gpc208的框图。在操作中,gpc208可以被配置成并行执行大量线程,以执行图形操作、通用处理操作和/或计算操作。如本文所使用的,“线程”是指在特定输入数据集上执行的特定程序的实例。在一些实施例中,单指令、多数据(simd)指令发出技术被用于支持大量线程的并行执行,而不用提供多个独立指令单元。在其他实施例中,单指令、多线程(simt)技术被用于采用被配置成发出指令至gpc208内的一组处理引擎的公共指令单元,来支持大量通常同步的线程的并行执行。与simd执行体制(其中所有的处理引擎通常执行完全相同的指令)不同,simt执行允许不同线程通过给定程序更容易跟随分散的执行路径。本领域普通技术人员将理解的是,simd处理体制代表simt处理体制的功能性子集。

经由管线管理器305控制gpc208的操作,管线管理器305将从任务/工作单元207中的工作分配单元(未示出)接收到的处理任务分配给一个或更多个流式多处理器(sm)310。管线管理器305还可以被配置成通过指定用于由sm310输出的经处理数据的目的地来控制工作分配交叉开关330。

在一个实施例中,gpc208包括一组m个sm310,其中m≥1。同样,每个sm310包括一组功能执行单元(未示出),诸如执行单元和负载-存储单元。可以管线化特定于任何功能执行单元的处理操作,其使得在之前的指令已完成执行之前能够发出新的指令用于执行。可以提供给定sm310内的功能执行单元的任何组合。在不同的实施例中,功能执行单元可以被配置成支持各种不同的操作,包括整数和浮点运算(例如加法和乘法)、比较运算、布尔运算(与、或、异或)、位偏移和不同代数函数的计算(如,平面插值和三角函数、指数以及对数函数等)。有利的是,相同的函数执行单元可以被配置成执行不同的操作。

在操作中,每个sm310被配置成处理一个或更多个线程组。如本文所使用的,“线程组”或“线程束”是指对不同的输入数据同时执行相同程序的一组线程,所述组中的一个线程被分配给sm310内的不同执行单元。线程组可以包括比sm310内的执行单元的数量更少的线程,在这种情况下,当正在处理那一线程组时,一些执行在循环过程中可能是空闲的。线程组还可以包括比sm310内的执行单元的数量更多的线程,在这种情况下,处理可能在连续的时钟周期上发生。由于每个sm310可以同时支持多达g个线程组,由此得出可以在任何给定时间在gpc208中正在执行多达g*m个线程组。

此外,在sm310内可以在相同的时间下(在不同的执行阶段)激活多个相关联的线程组。线程组的聚集在本文中是指“合作线程阵列”(“cta”)或“线程阵列”。特定cta的尺寸等于m*k,其中k为在一个线程组中同时执行线程的数量,其通常是在sm310中执行单元的数量的整数倍,以及m是在sm310中同时激活线程组的数量。

尽管在图3中没有示出,每个sm310包括一级(l1)高速缓存,或使用sm310外部的相应l1高速缓存中的空间,以支持(以及其他)由执行单元执行的加载操作和存储操作。每个sm310还可以访问在ppu202中的所有gpc208之间共享的二级(l2)高速缓存(未示出)。l2高速缓存可以用来在线程之间传输数据。最后,sm310还可以访问芯片外“全局”存储器,所述芯片外“全局”存储器可以包括pp存储器204和/或系统存储器104。将理解的是,在ppu202外部的任何存储器可以用作全局存储器。此外,如图3中所示,1.5级(l1.5)高速缓存335可以被包括在gpc208中,并被配置成接收和保持由sm310经由存储器接口214从存储器请求的数据。这种数据可以包括但不限于指令、统一数据和恒定数据。在gpc208中具有多个sm310的实施例中,sm310可以有益地共享公共指令和缓存在l1.5高速缓存335中的数据。

每个gpc208可以具有相关联的存储器管理单元(mmu)320,其被配置成将虚拟地址映射到物理地址。在不同的实施例中,mmu320可以驻留在gpc208或存储器接口214内。mmu320包括一组页表条目(pte)和可选的高速缓存线索引,所述页表条目用于将虚拟地址映射到瓦片(tile)或存储器页面的物理地址。mmu320可以包括可以驻留在sm310内、一个或更多个l1高速缓存内或gpc208内的地址转换后备缓冲器(tlb)或高速缓存。

在图形和计算应用程序中,gpc208可以被配置以使得每个sm310耦合至纹理单元315用于执行纹理映射操作,诸如确定纹理采样位置、读取纹理数据和过滤纹理数据。

在操作中,每个sm310将经处理的任务传送至工作分配交叉开关330,以便经由交叉单元210将经处理的任务提供给另一个gpc208用于进一步处理,或经由交叉单元210将经处理的任务存储在l2高速缓存(未示出)、并行处理存储器204或系统存储器104中。此外,预光栅操作(预rop)单元325被配置成从sm310接收数据,将数据导向到分区单元215内的一个或更多个光栅操作(rop)单元,执行用于颜色混合的优化、组织像素颜色数据、以及执行地址转换。

将理解的是,本文描述的核心架构是示例性的,其各种变化和修改都是可能的。在gpc208内可以包括任何数量的处理单元,诸如sm310、纹理单元315或预rop单元325等。进一步,如上结合图2所描述的,ppu202可以包括被配置成功能上彼此类似的任何数量的gpc208,以便执行行为不依赖于哪个gpc208接收特定的处理任务。进一步,每个gpc208独立于ppu202中的其他gpc208进行操作,以执行针对一个或更多个应用程序的任务。由于前述的事项,本领域普通技术人员将理解,在图1-3中所描述的架构绝不限制本发明的范围。

图4是根据本发明的各种实施例的、包括在图3的通用处理集群(gpc)208中的流式多处理器(sm)310的框图。如图所示,sm310包括但不限于任何数量的子分区单元430、互连网络480、sm高速缓存490和聚合屏障单元(cbu)420。

如图所示,子分区单元430和cbu420经由互连网络480连接至sm高速缓存490。在各种实施例中,互连网络480可以被配置成使子分区单元430和cbu420访问包括在任何数量和类型的寄存器中的信息以及包括在sm高速缓存490中的存储器位置。sm高速缓存490可以包括任何类型和数量的片上存储器。例如,在各种实施例中,sm高速缓存490可以包括共享存储器、l1高速缓存存储器或其组合。

总之,可以给子分区单元430中的每一个分配任何数量的线程束,然而给定的线程束仅仅分配给一个子分区单元430。如图所示,子分区单元430中的每一个包括但不限于,指令高速缓存440、指令调度程序450、和核心数据路径460。如结合图3所描述的,sm310从管线管理器305接收处理任务。对于每个线程束,所分配的子分区单元430接收所分配的处理任务并将相关联的指令存储在指令高速缓存440中。指令调度程序450为包括在所分配的线程束中的多个线程发出指令。

核心数据路径460包括但不限于功能单元(未示出)和寄存器文件407。功能单元执行任何数量和任何类型的操作,以执行被分配给相关联的子分区单元430的线程。寄存器文件407提供可以以任何技术上可行的方式实现和布置的一组寄存器。例如,寄存器文件407可以在被分配给子分区单元430的不同线程束之间进行划分。

众所周知,当在sm310上执行时,开发者可以编写使线程束中的仅仅一部分线程执行指令的代码。在本文中,在执行这类指令期间,线程束中的线程被称为“分散的(diverged)”。为了支持分散的线程,对于每个线程束,指令调度程序450经由相关联的线程束程序计数器(pc)发出用于包括在该线程束中的“活动的”线程的指令。相比之下,指令调度程序450并不发出用于包括在该线程束中的“不活动的”线程的指令,结果是,不活动的线程被暂停。

cbu420管理分散的线程并且执行同步操作。对于包括在分配给sm310的每个线程束中的每个线程,cbu420维持调度状态422。如图所示,调度状态422被存储在cbu420中。在可选的实施例中,调度状态422可以存储在cbu420和指令调度程序450可访问的任何存储器中或高速缓存中。每个调度状态422可以包括任何数量和类型的值。

对于给定的线程,相关联的调度状态422指定线程是否退出、受阻或畅通。如果退出相关联的调度状态422,则线程不再能执行任何指令。如果相关联的调度状态受阻,则线程处于同步操作并且是不活动的。如果相关联的调度状态422畅通,则线程可以处于或可以不处于同步操作,并且可以是或可以不是活动的。在可选的实施例中,调度状态422可以包括任何数量和类型的状态,其中状态中的至少一个指定线程受阻。

为了确保包括在线程束中的所有未退出的线程向前进,cbu420基于一个或更多个调度策略使包括在线程束中的多个线程激活和去激活。作为使线程去激活的一部分,cbu420将与线程相关联的恢复程序计数器472设置为指定该线程当被再激活时要执行的指令。cbu420将恢复程序计数器472存储在包括在核心数据路径460中的寄存器文件407中。在可选的实施例中,可以将恢复程序计数器472中的每一个存储在cbu420和相关联的指令调度程序450可访问的任何存储器或高速缓存中。

特别地,当不存在包括在线程束中的非活动的线程时,cbu420基于一个或更多个调度策略、调度状态422和恢复程序计数器472执行激活一个或更多个线程的“选择进程(electionprocess)”。作为选择进程的一部分,cbu420基于调度策略选择包括在线程束中的不活动的线程用于执行。然后cbu420将与线程束相关联的线程束pc设置为等于与所选择的不活动的线程相关联的恢复pc422。随后,cbu420选择包括在线程束中的任何其他不活动的线程,其与和线程束pc相等的恢复pc422相关联。对于所选的线程中的每一个,如果调度状态442是受阻,则cbu420将调度状态442设置为畅通。最终,cbu420激活所选择的线程。

支持分散线程的传统ppu的一个限制是,一些指令的适当行为假定每个线程束中的线程都是聚合的。事实上,当线程是分散的时,则结果是无法预期的。例如,在传统ppu上执行的代码可以产生不正确的结果或意外终止。尽管一些传统编译器和传统ppu实现一些等级的同步功能,其功能是有限的并且不能保证对所有情况聚合。作为一般情况,某些指令的实现方式可能要求跨线程束中的不同线程的一定等级的聚合,其不能由包括在通常承担确保这样的线程聚合任务的传统ppu中的传统编译器和传统硬件机制维持。

线程束内同步

为了全面和有效确保正确执行包含分散线程的代码和指令,sm310基于同步指令执行线程束内同步操作。在本文中同步指令也被称为“warpsync”指令。参与warpsync指令的线程中的每一个各自指定“所请求的”一组线程,其在执行紧跟着warpsync指令的指令之前被聚合。如本文所提及的,“一组线程”包括在两个线程和n个线程之间(包括两个和n个),其中线程束包括n个线程。进一步,参与warpsync指令的线程中的每一个包括位于所请求的一组线程中的其本身。可将所请求的一组线程中的每一个指定为寄存器、即时量或者常量。

当确定线程已经到达warpsync指令时,指令调度程序450确定warpsync指令是否是最优的候选。如在本文所提及的,当包括在线程束中的每个未退出的线程参与warpsync指令时,warpsync指令是最优的候选,每个未退出的线程将所请求的一组线程指定为即时量或常量,以及每个未退出的线程是活动的。如果warpsync指令是最优的候选,则指令调度程序450将相关的线程束pc设置为指定跟随warpsync指令的指令。以这种方式,指令调度程序450解决一个循环中的warpsync指令。

然而,如果warpsync指令不是最优的候选,则cbu420执行同步操作,其确保所请求的一组线程一起执行跟着warpsync指令的指令。显而易见的,cbu420在执行warpsync指令的时候不考虑包括在所请求的一组线程中的任何退出的线程。因此,正如在本文所提到的,将包括在所请求的一组线程中的任何退出的线程认为是为了warpsync决定(resolution)的目的已经到达warpsync指令。首先,cbu420同时且独立地处理正在执行warpsync指令的每个活动的线程。对于每个活动的线程,cbu420将相关联的恢复程序计数器472设置为指定warpsync指令。恢复程序计数器472不影响活动的线程的当前执行。然后cbu420确定与活动的线程相关联的所请求的一组线程。如果所请求的一组线程并不包括活动的线程,则cbu420发出错误消息并允许线程继续执行。

随后,cbu420执行比较操作以确定包括在所请求的一组线程中的任何线程是否是不活动的。如果包括在所请求的一组线程中的任何线程是不活动的,则cbu420将与活动的线程相关联的调度状态422设置为受阻并且使该活动的线程去激活。因为相关联的恢复程序计数器472指定warpsync指令,新的去激活的线程在warpsync指令下受阻。

作为比较操作的结果,包括在线程束中的线程没有一个是活动的,或者包括在所请求的一组线程中的所有线程都是活动的。如果包括在线程束中的线程没有一个是活动的,则cbu420基于调度策略、调度状态422和恢复程序计数器472执行激活一个或更多个线程的选择过程。然而,如果包括在所请求的一组线程中的所有线程都是活动的,则所请求的一组线程正在一起执行warpsync指令。由于所请求的一组线程是聚合的,所以cbu420将线程束pc设置为指定紧跟着warpsync指令的指令。有利的是,当参与warpsync指令的每个线程将所请求的一组线程指定为即时量时,cbu420可以在接近12个循环中解决warpsync指令。

应当注意,本文描述的技术是示例性的而不是限制性的,并且在不脱离于本发明的最广阔的精神和范围的情况下可作改变。在不脱离所描述的实施例的范围和精神的情况下,针对cbu420、指令调度程序450、sm310和warpsync指令提供的功能的许多修改和变形对本领域普通技术人员将是显而易见的。

例如,在可选的实施例中,指令调度程序450可以执行选择进程的任何部分(包括所有)。进一步地,cbu420和指令调度程序450可以执行以任何技术上可行的方式实现任何调度策略的任何其他进程,以确保线程的向前进展。在不同的实施例中,warpsync指令可以与防护谓语(guardpredicate)和/或输入谓语(inputpredicate)相关联。

本文中描述的发明概念可以用来定义不同的指令对,其中所述对中的第二指令依赖于线程束中的两个或更多个线程是适当聚合的。每个“指令对”包括与线程束中所请求的一组线程相关联的warpsync指令和后续指令,所述后续指令假定线程束中所请求的一组指令是聚合的。以这种方式,指令对确保正确操作后续指令。这种指令对的示例包括但不限于,举例来说,如线程束内屏障(bar_sync)指令,随机(shfl_sync)指令和投票(vote_sync)指令。bar_sync指令同步多个线程束中的和多个线程束之间的线程。shfl_sync指令使能线程束中的线程之间的直接寄存器到寄存器数据交换(directregister-to-registerdataexchange)。vote_sync指令基于从线程束中的线程接收到的数据生成单个投票结果。

在一些实施例中,cbu420支持用于warpsync指令的寄存器发散。cbu420激活包括在所请求的一组线程之一中的线程,并且将用于包括在所请求的任何其他组线程中的线程的恢复程序计数器472设置为warpsync指令。最后cbu420根据调度策略调度包括在所请求的其他组线程中的每一个的线程。以这种方式,cbu420独立地聚合所请求的一组线程中的每一个。

同步包括在线程束内的不同线程

图5是根据本发明的各种实施例的、由图4的流式多处理器310执行的用于在同时执行单个后续指令之前同步包括在线程束内的不同线程的示例指令序列。图5的上下文是线程3、2和1中的每一个指定用于warpsync指令的所请求的一组线程作为线程3、2和1。

指令序列500从步骤504开始,其中线程3和2是活动的,线程1是不活动的。与线程1相关联的恢复pc472(1)指定与warpsync指令不等同的xyz指令,线程束pc指定warpsync指令。在步骤506中,线程3和2执行warpsync指令。在步骤508中,因为线程1是不活动的,所以cbu420将与线程3相关联的恢复pc472(3)设置为指定warpsync指令,将与线程3相关联的调度状态422(3)设置为受阻并且使线程3去激活。类似地,cbu420将与线程2相关联的恢复pc472(2)设置为指定warpsync指令,将与线程2相关联的调度状态422(2)设置为受阻并且使线程2去激活。

最后,在步骤510中,作为选择进程的一部分,cbu420将线程束pc设置为指定xyz指令并激活线程1。在步骤512中,在指令调度程序450发出用于线程1的一个或更多个指令(包括xyz指令)之后,线程1到达warpsync指令。在步骤514中,线程1执行warpsync指令。在步骤516中,由于线程3和2是不活动的,cbu420将与线程1相关联的恢复pc472(1)设置为指定warpsync指令,将与线程1相关联的调度状态422(1)设置为受阻并使线程1去激活。

最后,在步骤520中,作为选择进程的一部分,cbu420将线程束pc设置为指定warpsync指令,将调度状态422(3)、422(2)和422(1)设置为畅通并激活线程1、2和3。在步骤522中,线程1、2和3同时执行warpsync指令。在步骤524中,由于线程1、2和3全部都是活动的,cbu420将线程束pc设置为指定紧跟着warpsync指令的指令。以这种方式,cbu420允许聚合的和活动的线程1、2和3在warpsync指令之后继续前进。

图6是根据本发明的各种实施例的、在同时执行单个后续指令之前用于同步包括在线程束内的不同线程的方法步骤的流程图。尽管结合图1-4的系统描述了方法步骤,但本领域技术人员将理解的是,被配置成以任何顺序执行所述方法步骤的任何系统均落在本发明的范围内。仅仅出于说明的目的,在单个线程束的上下文中描述图6。因而,在描述中所涉及的“活动的线程”是包括在该单个线程束中的活动的线程。将图6的描述限制为单个线程束的上下文并不意味着以任何方式限制本发明的范围。

如图所示,方法600从步骤602开始,其中一个或更多个活动的线程到达warpsync指令。在步骤604中,指令调度程序450确定warpsync指令是否是最优的候选。如本文前面所描述的,当每个未退出的线程参与warpsync指令时,warpsync指令是最优的候选,每个未退出的线程指定所请求的一组线程为即时量或常量,并且每个未退出的线程是活动的。

如果在步骤604中指令调度程序450确定warpsync指令是最优的候选,则方法600前进至步骤606。在步骤606中,指令调度程序450将线程束pc设置为紧跟着warpsync指令的指令,并且方法600终止。

然而,如果在步骤604中指令调度程序450确定warpsync指令不是最优的候选,则方法600直接前进到步骤608。在步骤608中,同时地并且对于每个活动的线程,cbu420将相关联的恢复程序计数器472设置为指定warpsync指令。在步骤610中,同时地并且对于每个活动的线程,cbu420确定与所述活动的线程相关联的所请求的一组线程。作为步骤610的一部分,如果cbu420确定与给定的活动的线程相关联的所请求的一组线程不包括该活动的线程,则cbu420发出错误消息,并且允许线程继续执行。

在步骤612中,同时地并且对于每个活动的线程,如果相关联的所请求的一组线程中的任何线程都是不活动的,则cbu420使活动的线程去激活或者受阻。为了使活动的线程受阻,cbu420将与活动的线程相关联的调度状态422设置为受阻。由于与活动的线程相关联的恢复pc472指定warpsync指令,在warpsync指令下使任何新的去激活的线程受阻。作为步骤612的结果,要么没有线程是活动的,要么包括在所请求的一组线程中的所有线程都是活动的。

如果在步骤614中没有线程是活动的,则方法600前进到步骤616。在步骤616中,cbu420执行选择进程,所述选择进程选择一个或更多个不活动的线程以执行。显而易见的是,对于所选的线程中的每一个,恢复pc472指定相同的指令并且,作为步骤616的一部分,cbu420将线程束pc设置为等于所指定的指令。在步骤618中,对于所选的线程中的每一个,cbu420将相关联的调度状态422设置为畅通并且激活线程。然后方法600返回至步骤602,在该处一个或更多个活动的线程束最终到达并执行warpsync指令。

然而,如果在步骤614中,包括在所请求的一组线程中的线程是活动的,则方法600直接前进到步骤620。在步骤620中,cbu420将线程束pc设置为紧跟着warpsync指令的指令,然后方法600终止。

总之,线程束同步(warpsync)指令将流式微处理器配置为聚合包括在线程束中的一组线程。当执行warpsync指令时,对于每个活动的线程,聚合屏障单元(cbu)将相关联的恢复程序计数器(pc)设置为等于(equalto)warpsync指令。同时地并且对于每个活动的线程,cbu执行比较操作,以确定在所请求的一组线程中的任何线程是否不活动的。如果在所请求的一组线程中的任何线程是不活动的,则cbu使活动的线程受阻并且去激活。由于恢复pc,在warpsync指令下使新的去激活的线程受阻。

作为比较操作的结果,要么包括在线程束中的线程没有一个是活动的,要么包括在所请求的一组线程中的所有线程都是活动的。如果包括在线程束中的线程没有一个是活动的,则cbu执行选择操作,所述选择操作选择一个或更多个不活动的线程,其中与所选的不活动的线程中的每一个相关联的恢复pc指定相同的指令。cbu将线程束pc设置为等于所指定的指令,使受阻的所选的线程中的任何一个畅通,并且激活所选的线程。然而,如果包括在所请求的一组线程中的所有线程都是活动的,则所请求的一组线程正在一起执行warpsync指令。由于所请求的一组线程是聚合的,cbu将线程束程序计数器设置为紧跟着warpsync指令的指令。

有利的是,所公开的技术使ppu能够正确执行代码和指令,其依赖于包括在线程束内的不同线程的聚合。相反,包括在通常承担保证这样的线程聚合任务的传统ppu中的传统编译器和传统硬件机制不能保证线程聚合。当需要正确执行代码时,由于传统编译器和传统ppu不能一直保证线程束内的线程聚合,所以在传统ppu上执行的代码可能产生不正确的结果或者意外终止。

为了说明的目的已经呈现了各种实施例的描述,但是并不意图穷尽或限制所公开的实施例。在不脱离所描述的实施例的范围和精神的情况下,许多修改和变形对本领域普通技术人员将是显而易见的。

本实施例的各个方面可以体现为系统、方法或计算机程序产品。因此,本公开的各个方面可以采取全部硬件实施例、全部软件实施例(包括固件、常驻软件、微代码等等)或者结合软件和硬件方面的实施例(在此通常称为“模块”或“系统”)的形式。进一步地,本公开的方面可以采取包含在一个或更多个计算机可读介质中的计算机程序产品的形式,所述计算机可读介质具有包含在其上的计算机程序代码。

可以利用一个或更多个计算机可读介质的任何组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。例如,计算机可读存储介质可以是但不限于电子、磁、光、电磁、红外或半导体系统、装置或设备或前述的任何合适的组合。计算机可读存储介质的更具体的示例(非穷尽列举)可以包括如下:具有一个或更多个电线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或闪存)、光纤、便携式光盘只读存储器(cd-rom),光存储设备、磁存储设备,或者前述任何合适的组合。在本文档的上下文中,计算机可读存储介质可以是可包含或存储用于由指令执行系统、装置或设备使用或与之结合使用的程序的任何有形介质。

上面参考根据本公开的实施例的方法、装置(系统)和计算机程序产品的流程图说明和/或框图,描述了本公开的各个方面。将要理解的是,流程图说明和/或框图中的每个框、流程图说明和/或框图中的框的组合均可以由计算机程序指令实现。可将这些计算机程序指令提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,以制造机器。所述指令当经由计算机或其他可编程的数据处理装置的处理器执行时,使得能够实现流程图和/或框图的一个或更多个框中指定的功能/动作。这样的处理器可以是但不限于通用处理器、特殊用途处理器、专用处理器或现场可编程门阵列。

图中的流程图和框图说明了根据本公开的各种实施例的系统、方法以及计算机程序产品的可能实现方式的架构、功能和操作。就此而言,流程图或框图中的每个框可以代表模块、区段或代码部分,其包括用于实现一个或更多个指定逻辑功能的一个或更多个可执行指令。还应当注意的是,在一些可选的实现方式中,在框中记录的功能可不按照图中记录的顺序发生。例如,连续示出的两个框实际上可以大致同时发生,或者有时以相反的顺序执行这些框,这依赖于所涉及的功能。还需要注意的是,框图和/或流程图说明中的每个框,以及框图和/或流程图说明中的框的组合,可以由执行指定功能或动作的专用基于硬件的系统或专用硬件与计算机指令的组合来实现。

虽然前面针对本公开的实施例进行了描述,但是可以设计本公开的其他和进一步的实施例而不脱离其基本范围,并且其范围由权利要求确定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1