并行线程处理器中的一致分支指令的制作方法

文档序号:6351212阅读:202来源:国知局
专利名称:并行线程处理器中的一致分支指令的制作方法
技术领域
本发明总体上涉及并行图形处理领域,更具体地,涉及并行线程处理器中的分支指令。
背景技术
目前的并行图形数据处理包括被开发用于对图形数据执行诸如线性插值、曲面细分(tessellation)、光栅化、纹理映射、深度测试等特定操作的系统和方法。传统上,图形处理器使用固定的函数计算单元处理图形数据;但是,近来,图形处理器的各部分已可编程,从而使得这类处理器能够支持种类繁多的用于处理顶点和片段(fragment)数据的操作。为了进一步提高性能,图形处理器一般采用诸如管线化这类处理技术,这种管线化处理技术试图贯穿图形管线的不同部分并行地处理尽可能多的图形数据。具有单指令多线程(SMT)架构的并行图形处理器被设计为最大化图形管线中的并行处理量。在SMT架构中,并行线程组试图尽可能经常一起同步执行程序指令,以提高处理效率。然而,当程序包含断言(条件)分支指令(predicated (conditional) branchinstruction)、并且一些线程执行(取用)该分支至目标指令地址、而其他线程不执行该分支并跳转(fall through)至下一个指令时,一般会出现问题。在一些现有技术系统中,断言分支指令由正在编译条件代码的编译器或由编程人员插入代码序列中。断言分支指令与断言和/或条件代码测试相关联,当断言值为真并且条件代码测试为真时,线程组中的每个线程均只执行分支指令。断言分支指令使用断言约束(guard)寄存器和/或条件代码(CC)测试来实现条件分支,并且具有下列三种形式iPg BRA target ;// 如果(Pg)则转至目标;BRA CC. LT target ;// 如果(CC. LT)则转至目标;iPg BRA CC. LT target ;// 如果(Pg && CC. LT)则转至目标;“非”断言约束 O !Pg使用断言寄存器值的布尔补码。如果省略断言约束OPg并省略条件代码测试,则分支是非条件的。利用线程组中的P个线程,断言或条件指令序列可以使用断言分支指令,或者可以使用不带分支指令的断言指令。依据用于P个线程的断言寄存器和条件代码测试的运行时(run-time)值,在使用断言分支的代码中会出现两个不同的运行时情形,并且在不带分支的断言代码中出现第三个情形。在第一个情形中,P个线程全都具有相同的断言约束寄存器Pg值和相同的条件代码测试结果,因而P个线程全都进行分支转移(branch)至目标,或者P个线程全都跳转并执行紧跟在后的指令。线程组被收敛(converged),并且卷绕包(warp)中的P个线程全都遵循相同的执行路径。在第二个情形中,一些线程具有真Pg值而另一些线程具有假Pg值。在此情形下,具有真Pg值的线程进行分支转移至目标,而其余线程跳转并执行紧跟在后的指令。因为一些线程进行分支转移而另一些不进行分支转移,所以线程组发散。当线程组被发散时,使用不同组的激活线程来执行这两个代码路径,并且一些现有技术系统使用同步令牌(token)的堆栈来管理发散且同步的线程组。在执行序列中的某一点处,执行线程组同步,以使发散的线程组重收敛。该同步操作增加了额外的指令和同步堆栈操作,从而降低了执行效率并且增大了总开销。在第三个情形中,不同于使用断言分支指令来实现可以使线程组发散的条件代码序列,而只使用断言指令。基于互补的Pg和! Pg断言(或者对互补的条件代码测试)对指令进行断言,这样用不同组的激活线程来执行这两个代码路径,而不使线程组发散。断言代码序列的执行要求迫使线程组中的线程全都通过代码的每个部分,而不管任何线程是否执行该代码。假设SMT处理器可执行多达800个线程,则这样的设计是低效率的,这是因 为可以不必迫使数以百计的线程通过它们不执行的代码路径。在程序设计时或编译时,编程人员或编译器难以预测将会出现哪些运行时情形,因此难以选择使用哪一个指令序列来获得对条件代码序列的闻效执行。据此,本领域中需要一种在具有SIMT架构的系统中用于条件代码序列的更加高效的分支转移机制,该分支转移机制不会使线程组发散或者执行不必要的指令。

发明内容
本发明的一个实施例提出了一种用于管理执行一组指令的线程组中的一个或多个线程的方法,所述一组指令包括目标指令和指定条件的特定类型的分支指令。该方法包括下列步骤接收所述分支指令,其中,所述线程组中的每个激活线程均与真或假条件值相关联,所述真或假条件值与由所述分支指令所指定的所述条件相关联;用合并函数将与所述线程组中的每个激活线程相关联的所述条件值合并到一个真或假判定中,所述判定指明是否所述线程组中所有激活线程都应取用至所述目标指令的分支;以及如果所述判定为真,则更新用于所述线程组中所有激活线程的激活程序计数,以指明所述一组指令中的所述目标指令,或者如果所述判定为假,则更新用于所述线程组中所有激活线程的所述激活程序计数,以指明紧跟所述分支指令的下一个指令。一致分支(unanimous branch)用布尔与(AND)合并函数来合并与每个激活线程相关联的条件值,因而要求所有激活线程一致同意取用所述分支。分支任意(branch-any)指令用布尔或(OR)函数来合并与每个激活线程相关联的条件值,因而如果任一激活线程条件值为真则迫使所有激活线程取用所述分支。所公开的技术的一个优点在于,一致分支指令通过仅在线程组中所有激活线程都取用分支时进行分支转移而避免了额外的执行周期。这在一个分支路径的代码长度明显比另一分支路径的代码长度长的时候尤其有利。所公开的技术的另一个优点在于,在所公开的技术中不需要执行在使线程组发散的实现方案中需要加以执行的线程组同步操作。


为了详细地理解本发明的上述特征,对于以上简要说明的发明,可以参照实施例进行更为具体的描述,其中一些实施例示出于附图中。然而,应注意的是,附图中示出的只是本发明的代表性实施例,因此不应被认为是对本发明的范围的限制,本发明可以适用于其他同等有效的实施例。图I是示出了被配置为实施本发明的一个或多个方面的计算机系统的框图;图2是根据本发明的一个或多个方面的、用于图I的计算机系统的并行处理子系统的框图;图3是根据本发明的一个或多个方面的、用于图2的并行处理子系统的并行处理单元的框图;图4是根据本发明的一个或多个方面的、用于图3的并行处理单元的指令单元的框图; 图5是根据本发明的一个或多个方面的、用于处理一致分支指令的方法步骤的流程图;以及图6是根据本发明的一个或多个方面的、用于处理分支任意指令的方法步骤的流程图。
具体实施例方式在下面的描述中,阐释了大量具体细节以提供对本发明更为彻底的理解。然而,对于本领域技术人员来讲将显而易见的是,在缺少这些具体细节中的一个或多个的情况下也可以实施本发明。在其他例子中,为了避免与本发明发生混淆,对公知特征没有进行描述。系统概述图I是示出了被配置为实施本发明的一个或多个方面的计算机系统100的框图。计算机系统100包括中央处理单元(CPU) 102和系统存储器104,两者经由可包括存储器桥105的总线路径通信。存储器桥105例如可以是北桥芯片,经由总线或其他通信路径106 (例如,超传输链接)连接到I/o (输入/输出)桥107。I/O桥107例如可以是南桥芯片,从一个或多个用户输入设备108 (例如,键盘、鼠标)接收用户输入,并将该输入经由路径106和存储器桥105转发(forward)至CPU 102。并行处理子系统112经由总线或其他通信路径113(例如,PCI Express、加速图形端口或超传输链接)耦合至存储器桥105 ;在一个实施例中,并行处理子系统112是将像素输送到显示设备110(例如,常规的基于CRT或IXD的监视器)的图形子系统。系统盘114还连接到I/O桥107。开关116为I/O桥107和诸如网络适配器118以及各种外插卡(add-in card) 120和121的其他组件之间提供了连接。其他组件(未明确示出)也可以连接到I/O桥107,包括USB或其他端口连接、⑶驱动器、DVD驱动器、胶片记录设备等。图I中将各种组件互连的通信路径可以使用任何合适的协议来实现,比如PCI (外围组件互连)、PCI Express (PCI-E)、AGP (加速图形端口)、超传输或其他任何一种总线或点对点通信协议,并且不同设备之间的连接可以使用本领域已知的不同协议。在一个实施例中,并行处理子系统112包含被优化用于图形和视频处理的电路,例如包括视频输出电路,并且构成图形处理单元(GPU)。在另一个实施例中,并行处理子系统112包含被优化用于通用处理的电路,同时保留底层(underlying)的计算架构,本文将进行更为详细的描述。在又一个实施例中,并行处理子系统112可与一个或多个其他系统元件集成,诸如存储器桥105、CPU 102和I/O桥107,以形成片上系统(SoC)。
图2示出了根据本发明一个实施例的并行处理子系统112。并行处理子系统112包括一个或多个并行处理单元(PPU) 202,其每一个均耦合至本地并行处理(PP)存储器204。一般来讲,并行处理子系统包括U个PPU,其中U > I。(本文中,相似对象的多个实体用表示该对象的参考数字以及根据需要结合表示该实体的带括号的数字加以表示)。PPU 202和PP存储器204可用一个或多个诸如可编程处理器、专用集成电路(ASIC)和存储器器件这类集成电路器件来实现。如关于PPU 202(0)详细示出的,每个PPU 202都包括主机(host)接口 206,该主机接口 206经由通信路径113而与系统100的其余部分通信,其连接到存储器桥105 (或者,在一个替代实施例中,直接连接到CPU 102)。在一个实施例中,通信路径113是PCI-E链接,其中给每个PPU 202分配有专用通道(lane),如本技术领域已知的。也可使用其他通信路径。主机接口 206生成数据包(或其他信号)用于通过通信路径113传送,并且也从通信路径113接收所有传入的数据包(或其他信号),将传入的数据包引向PPU 202的适当组件。例如,可将与处理任务相关的命令引向前端单元212,而可将与存储器操作(例如,对PP存储器204读取或写入)相关的命令引向存储器接口 214。主机接口 206、前端单元212和存储器接口 214通常可采用常规设计,由于对于本发明而言并非关键所在,因此省略详细描述。每个PPU 202都有利地实现高度并行的处理器。如关于PPU 202 (O)详细示出的,PPU 202包括C个内核208,其中C彡I。每个处理内核208均能够并发执行大量(例如,数十个或数百个)线程,其中每个线程均为程序的实例(instance);下面描述多线程处理内核208的一个实施例。内核208经由工作分布单元210接收将要执行的处理任务,该工作分布单元从前端单元212接收定义处理任务的命令。工作分布单元210可以实施各种用于分布工作的算法。例如,在一个实施例中,工作分布单元210从每个内核208接收“准备就绪”信号,指明该内核是否有足够的资源来接受新的处理任务。当新的处理任务到达时,工作分布单元210将该任务指派给正在维护(assert)该准备就绪信号的内核208 ;如果没有内核208正在维护准备就绪信号,则工作分布单元210保持该新的处理任务,直至该准备就绪信号被内核208所维护为止。本领域技术人员将认识到,也可使用其他算法,并且工作分布单元210分布输入的处理任务所采用的具体方式对于本发明而言并非关键所在。内核208与存储器接口 214通信,以对各种外部存储器设备进行读写。在一个实施例中,存储器接口 214包括适于与本地PP存储器204通信的接口以及至主机接口 206的连接,从而使得内核能够与系统存储器104或其他相对于PPU 202而言的非本地存储器通信。存储器接口 214通常可以采用常规设计,并且将省略详细描述。内核208可以被编程为执行与种类繁多的应用相关的处理任务,包括但不限于线性和非线性数据变换、视频和/或音频数据的过滤、建模操作(例如,运用物理定律确定对象的位置、速率和其他属性)、图像渲染操作(例如,顶点着色、几何着色和/或像素着色程序)等等。PPU 202可将数据从系统存储器104和/或本地PP存储器204传输到内部(片上)存储器中,对数据进行处理,并将结果数据写回到系统存储器104和/或本地PP存储器204中,在这里这类数据可以由其他系统组件访问,包括例如CPU 102或另一并行处理子系统112。再次参照图I,在一些实施例中,并行处理子系统112中的一些或所有PPU 202是、具有渲染管线的图形处理器,可以被配置为执行与下述各项相关的各种任务由图形数据生成像素数据,所述图形数据是由CPU 102和/或系统存储器104经由存储器桥105和总线113而供给的;与本地PP存储器204(可以作为图形存储器加以使用,包括例如常规的帧缓冲区)交互,以存储和更新像素数据;将像素数据输送到显示设备110 ;诸如此类。在一些实施例中,PP子系统112可包括作为图形处理器而操作的一个或多个PPU 202以及供通用计算使用的一个或多个其他PPU 202。这些PTO可相同或不同,并且每个PPU均可具有其自己的专用PP存储器装置或非专用PP存储器装置。
操作时,CPU 102是计算机系统100的主处理器,控制并协调其他系统组件的操作。具体来讲,CPU 102发出控制PPU 202的操作的命令。在一些实施例中,CPU 102将针对每个PPU 202的命令流写入到入栈缓冲区(pushbuffer)(图I中未明确示出),所述入栈缓冲区可位于系统存储器104、PP存储器204或者可由CPU 102和PPU 202访问的其他的存储位置中。PPU 202从入栈缓冲区读取命令流,然后相对于CPU 102的操作异步地执行命令。应予以理解的是,本文所示系统是例示性的,可以对其进行变形和修改。可根据需要修改连接拓扑,包括桥的数量和布置。例如,在一些实施例中,系统存储器104直接连接到CPU 102而非通过桥连接,并且其他设备经由存储器桥105和CPU 102与系统存储器104通信。在其他替代拓扑中,并行处理子系统112连接到I/O桥107或者直接连接到CPU102,而非连接到存储器桥105。在又一些实施例中,I/O桥107和存储器桥105可能被集成到单个芯片中。本文所示具体组件是可选的;例如,任何数量的外插卡或外围设备都可能得到支持。在一些实施例中,开关116被省去,并且网络适配器118和外插卡120、121直接连接到I/O桥107。PPU 202与计算机系统100其余部分的连接也可以改变。在一些实施例中,PP系统112被实现为外插卡,可以被插入系统100的扩展槽中。在另一些实施例中,PI3U 202可以被集成在具有诸如存储器桥105或I/O桥107这类总线桥的单个芯片上。在又一些实施例中,PPU 202中的一些或全部元件可被集成在具有CPU 102的单个芯片上。PPU可设置有任何容量(amount)的本地PP存储器,包括不设置本地存储器,并且可以任何组合方式来使用本地存储器和系统存储器。例如,在统一存储器架构(UMA)实施例中,PPU 202可以是图形处理器;在这类实施例中,提供极少的甚至不提供专用图形(PP)存储器,并且PPU 202将以排他的方式或者几乎以排他的方式使用系统存储器。在UMA实施例中,PTO可被集成到桥式芯片或处理器芯片中,或者被提供为具有高速链接(例如,PCI-E)的分立芯片,所述高速链接例如经由桥式芯片将PI3U连接到系统存储器。如上所述,并行处理子系统中可以包含有任何数量的PPU。例如,多个PI3U可以被设置在单个外插卡上,或者多个外插卡可以连接到通信路径113,或者PTO中的一个或多个可以被集成到桥式芯片中。多PPU系统中的PPU可彼此相同或不同;例如,不同的PTO可能具有不同数量的内核、不同容量的本地PP存储器等。当存在有多个PPU时,可以并行地操作这些PI3U从而以高于单个PPU202可能达到的吞吐量来处理数据。内置有一个或多个PPU的系统可以以各种配置和形式因素来加以实现,包括桌上型电脑、膝上型电脑或者手持式个人计算机、服务器、工作站、游戏控制台、嵌入式系统等。内核概述
图3是根据本发明的一个或多个方面的、用于图2的并行处理子系统112的并行处理单元220的框图。PPU 202包含被配置为并行执行大量线程的内核208(或多个内核208),其中术语“线程”是指对特定的一组输入数据执行的特定程序的实例。在一些实施例中,采用单指令多数据(SIMD)指令发送技术来支持大量线程的并行执行,而无需提供多个独立指令单元。在一些实施例中,采用单指令多线程(SMT)技术,使用被配置为发送指令到一组处理引擎的公共指令单元,来支持大量通常同步的线程的并行执行。不同于其中所有处理引擎一般都执行相同指令的SMD执行机制(regime),SMT执行允许不同的线程更容易跟随(follow)通过给定线程程序的发散的执行路径。本领域技术人员将理解的是,SIMD处理机制代表SMT处理机制的功能子集。以类似于SMD工作体系的方式,SIMT并行处理内核208通过跨被包含在内核208中的多个并行处理引擎302对不同数据执行单个并行程序的数个实例。这样,例如,内核208可被配置为在内核208内的并行处理引擎302上执行一系列公共指令。在内核208 内的并行处理引擎302当中并发执行的一定数量的线程的集合在本文中被称为“卷绕包(warp)”或“线程组”。另外,在内核208上,多个相关线程组可以同时是激活的(处于不同执行阶段)。相关线程组的集合在本文中被称为“协作线程阵列”(“CTA”)。特定CTA的大小等于mXk,其中k是线程组中并发执行的线程的数量,并且一般是内核208中的并行处理引擎302的数量的整数倍,m是内核208上同时处于激活状态的相关线程组的数量。CTA的大小通常由编程人员和CTA可用的诸如存储器或寄存器的硬件资源的容量决定。依据每CTA资源使用情况,内核208可以并发执行一个或多个CTA。在一个实施例中,每个内核208包含P个(例如,8个、16个等)并行处理引擎302阵列,该阵列被配置为从单个指令单元312接收SMT指令。每个处理引擎302均有利地包括相一致的一组功能单元(例如,算术逻辑单元等)。这些功能单元可被管线化,从而允许在前面的指令结束之前发送新的指令,如本领域所已公知的。可提供功能单元的任何组合。在一个实施例中,这些功能单元支持多种运算,包括整数和浮点算术(例如,加法和乘法)、比较运算、布尔运算(AND、OR、异或(XOR))、移位以及各种代数函数的计算(例如,平面插值、三角、指数和对数函数等);并且同一功能单元硬件可均衡地用于(be leveraged to)执行不同运算。每个处理引擎302使用本地寄存器堆(local register file, LRF) 304中的空间,用于存储它的本地输入数据、中间结果等。在一个实施例中,本地寄存器堆304在物理上或逻辑上被划分为P个通道,每个通道均具有某一数量的条目(其中每个条目可能存储例如32位字)。给每个处理引擎302分配一个通道,并且不同通道中对应的条目可以填充有供执行同一程序的不同线程所使用的数据,以利于同步并行执行。SIMT指令可指定寄存器操作数,其访问与线程组中的每个线程相对应的每个通道中的寄存器条目。在一些实施例中,每个处理引擎302可以仅访问被分配给它的通道中的LRF条目。本地寄存器堆304中条目的总数最好足够大,以支持每处理引擎302的多个并发线程。每个处理引擎302也有权访问片上共享存储器306,该存储器306在内核208中的全部处理引擎302之间共享,并且可用于在不同线程之间传输数据。共享存储器306可如所期望的一样大,并且在一些实施例中,任何处理引擎302都可以用同等低的延迟时间(例如,可与访问本地寄存器堆304相比)对共享存储器306中的任一位置进行读或者写。在一些实施例中,共享存储器306被实施为共享寄存器堆;在另一些实施例中,共享存储器306可以用共享高速缓存存储器(shared cache memory)加以实施。
除共享存储器306外,一些实施例还提供附加的片上参数存储器和/或高速缓存308,可以被实施为例如常规的RAM或高速缓存。参数存储器/高速缓存308可以被用于例如保持状态参数和/或可能被多个线程所需要的其他数据(例如,各种常数)。处理引擎302也有权经由存储器接口 214访问片外“全局”存储器320,该存储器可以包括例如PP存储器204和/或系统存储器104,并且系统存储器104如上所述可由存储器接口 214经由主机接口 206访问。应予以理解的是,PPU 202外部的任何存储器都可用作全局存储器320。处理引擎302可以经由允许任何处理引擎302访问全局存储器320的互连(图中未示出)而耦合至存储器接口 214。在一个实施例中,每个处理引擎302均是多线程的,并且可以例如通过在本地寄存器堆304中维持与分配给该处理引擎的通道的不同部分中的每个线程相关联的当前状态信息来并发执行多达G个(例如,24个)线程。处理引擎302有利地被设计为从一个线程迅速切换到另一线程,使得来自不同线程的指令可以按任何顺序发送而无效率损失。指令单元312被配置为使得,对于任何给定处理周期,可发送相同的指令(INSTR)给所有P个处理引擎302。因而,在单个时钟周期的水平,内核208实施基本上表现P通道(way) SIMT或SMD设计的微架构。由于每个处理引擎302也是多线程的,并发支持多达G个线程,所以本实施例中的内核208可以有多达PXG个线程并发执行。例如,如果P= 16且G = 24,则内核208支持多达384个并发线程。因为指令单元312向所有P个处理引擎302并行发送相同指令,所以内核208有利地被用于处理线程组中的线程。如本文所使用的,“线程组”是指一组对不同输入数据执行同一程序的多达P个的线程,并且给每个处理引擎302分配该组中的一个线程。线程组可包括少于P个的线程,在此情况下,在正在处理该线程组的周期内,一些处理引擎302将处于空闲状态。线程组也可包括多于P个的线程,在此情况下,处理将在连续的时钟周期上进行。由于每个处理引擎302可以并发支持多达G个线程,所以在任一给定时间都可以有多达G个线程组在内核208中执行。在每个时钟周期上,发送一个指令到构成G个线程组中被选中的一个线程组的所有P个线程。为了指明哪一些线程当前处于激活状态,可在指令中包含关于相关联的线程的“激活掩码”。处理引擎302使用激活掩码和线程组标识符,以确定在处理该指令时应该使用本地寄存器堆304中给该处理引擎分配的通道的哪个部分。这样,在给定周期内,内核208中的所有处理引擎302可为同一线程组中的不同线程同步执行同一指令。本领域技术人员将认识到,这种线程组中每个线程的同步并行执行具有SIMD架构的特点。当线程组中的线程正在同步执行时,处理引擎302被配置为以SMD方式执行指令。然而,在一些实例中,例如由于条件或断言指令、程序中分支处的发散等,所以线程组中一些线程可暂时处于空闲状态,如本文将进一步描述的。处理引擎302可被配置为用作SMD或SMT引擎。内核208的操作有利地经由内核接口303得到控制。在一些实施例中,内核接口303从工作分布单元210接收待处理数据(例如,基元数据、顶点数据和/或像素数据)以及定义将如何处理该数据(例如,将执行哪个程序)的命令和状态参数。内核接口 303可以将待处理数据加载到共享存储器306中并将参数加载到参数存储器308中。内核接口 303还初始化指令单元312中的每个新的线程或线程组,然后向指令单元312发信号以开始执行线程。当线程或线程组的执行完成时,内核208有利地通知内核接口 303。内核接口 303然后可以开始其他进程,例如,检索从共享存储器306输出的数据和/或使内核208准备执行附加的线程或线程组。应予以理解的是,本文所描述的内核架构是例示性的,可以对其进行各种变形和修改。可包括任何数量的处理引擎。在一些实施例中,每个处理引擎均具有其自己的本地寄存器堆,并且每线程的本地寄存器堆条目的分配根据需要可以是固定的或可配置的。此夕卜,尽管仅示出一个内核208,但PPU 202可包括任何数量的内核208,这些内核208有利地采用彼此一致的设计,使得执行行为不依赖于接收具体处理任务的内核208。每个内核208有利地与其他内核208独立地操作,并且具有其自己的处理引擎、共享存储器等。本领域技术人员将理解的是,图1、2和3中所描述的架构决非限制本发明的范围,并且在不脱离本发明的范围的情况下,本文所教导的技术可在任何适当配置的处理单元上实施,这些处理单元包括但不限于一个或多个CPU、一个或多个多核CPU、一个或多个GPU、一个或多个多核GPU等。线程阵列和协作线程阵列 在一些实施例中,图3的多线程处理内核208可以使用线程块或线程阵列执行通用计算。线程阵列由对输入数据集并发执行同一程序以生成输出数据集的若干( )线程组成。线程阵列中的每个线程都被分配唯一的线程标识符(“线程ID”),所述线程标识符在线程执行期间可由该线程访问。线程ID控制线程的处理行为的各个方面。例如,线程ID可被用于确定线程输入数据集中将被处理的部分和/或确定线程输出数据集中将生成或写入的部分。在一些实施例中,线程阵列被布置为“协作的”线程阵列或CTA。每个CTA是对输入数据集并发执行同一程序(本文中被称为“CTA程序”)以生成输出数据集的一组线程。在CTA中,线程可以通过以依赖于线程ID的方式彼此共享数据来相互协作。例如,在CTA中,数据可以由一个线程生成并由另一个线程消耗。在一些实施例中,在将要共享数据以确保该数据在消耗线程试图访问它之前实际上已经由生成线程所生成的时候,可将同步指令插入CTA程序代码中。如果CTA的线程之间存在数据共享,则数据共享的程度由CTA程序决定;因而,应予以理解的是,在使用CTA的具体应用中,CTA的线程实际上可能彼此共享或者不共享数据,取决于CTA程序。在一些实施例中,CTA中的线程使用图3的共享存储器306来与同一 CTA中的其他线程共享输入数据和/或中间结果。例如,CTA程序可能包含计算共享存储器306中将被写入具体数据的地址的指令,该地址是线程ID的函数。每个线程使用其自己的线程ID计算该函数,并且写入到对应的位置。该地址函数有利地被定义为使得不同线程写入到不同位置;只要该函数是确定的,被任一线程所写入的位置就是可预测的。CTA程序还可以包含计算共享存储器306中将要被读取的地址的指令,该地址线程ID的函数。通过定义合适的函数并提供同步技术,可以采用可预测的方式,由CTA中的一个线程将数据写入到共享存储器306中的给定位置,并且由同一 CTA中的不同线程从该位置读取。因此,在线程之间的任何期望模式的数据共享都可以得到支持,并且CTA中的任一线程都可以与同一 CTA中的任何其他线程共享数据。
CTA(或其他类型的线程阵列)被有利地用于执行使其自身适用于(lend to)数据并行分解的计算。如本文所使用的,“数据并行分解”包括其中通过对输入数据并行地多次执行同一算法以生成输出数据而解决计算问题的任何情况;例如,数据并行分解的一个常见的实例涉及对输入数据集的不同部分应用相同的处理算法以便生成输出数据集的不同部分。数据并行分解可处理的问题的示例包括矩阵代数、任何维数的线性和/或非线性变换(例如,快速傅里叶变换)、以及包含任何维数卷积滤波器的各种过滤算法、多维度的可分离的滤波器等。在CTA程序中指定将要对输入数据集中的每个部分所应用的处理算法,并且CTA中的每个线程对输入数据集中的一个部分执行相同的CTA程序或生成输出数据集中的一个部分。CTA程序可以使用广泛的数学和逻辑运算来实施算法,并且程序可以包含条件或分支转移执行路径以及直接和/或间接存储器访问。在一个实施例中,在图I的CPU 102上执行的驱动器程序将定义CTA的命令写入到存储器(例如,系统存储器104)中的入栈缓冲区(图中未明确示出),由PPU 202从该入栈缓冲区读取命令。这些命令有利地与状态参数相关联,所述状态参数例如为CTA中的线 程数量、将使用CTA处理的输入数据集在全局存储器320中的位置、待执行的CTA程序在全局存储器320中的位置以及输出数据将要写入的全局存储器320中的位置。可将这些状态参数与命令一起写入入栈缓冲区。作为对这些命令的响应,内核接口 303将状态参数加载到内核208 (例如,参数存储器308)中,然后开始启动线程,直至已有CTA参数中所指定数量的线程已被启动为止。在一个实施例中,内核接口 303在线程启动时将线程ID按顺序分配给线程。通常来讲,由于CTA中的所有线程都执行同一内核208中的同一程序,所以任一线程都可以被分配以任一线程ID,只要将每个有效的线程ID仅分配给一个线程即可。任何唯一的标识符(包括但不限于数字标识符)都可以被用作线程ID。在一个实施例中,如果CTA包括某一数量( )的线程,则线程ID为从O到Iitl-I的简单顺序的(一维)索引值。在其他实施例中,可以使用多维索引方案。应予以注意的是,只要参照线程ID对数据共享加以控制,线程与处理引擎之间的具体分配就不会影响CTA执行的结果。因而,CTA程序可以独立于将要用于执行该CTA程序的具体硬件。多线程指令处理图4是根据本发明的一个或多个方面的、用于图3的并行处理单元202的指令单元312的框图。指令单元312包括指令获取单元400、指令高速缓存430、常数高速缓存410、分发器(dispatcher) 435和条件代码-断言单元450。指令获取单元400接收待处理的数据和与应当用于处理该数据的程序相对应的程序标识符。程序计数存储器405存储激活程序的计数,指明对于每个线程组所应当执行的下一个程序指令(INSTR)。当G = 24时,程序计数存储器405存储24个激活程序计数。类似地,线程状态存储器420存储用于每个线程组的激活掩码,其中,所述激活掩码中的每一比特均对应于线程组中的一个线程。因此,激活掩码中的比特数为P,即线程组中的线程数。线程状态存储器420还存储关于每个线程组的禁用掩码。禁用掩码包含线程组中每一个线程的标志(flag)。该标志指明对于控制指令的处理来说线程是被启用还是禁用,或者线程是否已经退出该程序。CRS(调用、返回、同步)堆栈425包括针对每个线程组的执行堆栈,如图4中执行堆栈(O)至(G-I)所示。执行堆栈在控制指令处理期间被用于推入和弹出包含状态信息的令牌,例如,令牌类型、令牌程序计数和令牌掩码。在本发明的一些实施例中,对于发生溢出(overflow)的任一执行堆栈455,CRS堆栈425可将条目转(spill)到高速缓存或全局存储器320中,并当CRS堆栈425中有空间可用时重存储所转的条目。执行控制指令时,控制器415对CRS堆栈425推入和弹出条目。在一个实施例中,存在六种控制指令条件(断言)分支指令、调用指令、预中断指令、预返回指令、条件返回指令、同步指令和条件中断指令。替代实施例可包括更多或更少类型的控制指令以及不同类型的控制指令。控制器415将线程组的激活程序计数和激活掩码提供到指令高速缓存430。指令高速缓存430获得与激活程序计数相对应的指令,并将该指令和激活掩码输出到分发器435。指令高速缓存430根据需要使用本领域技术人员所公知的高速缓存技术从全局存储器320读取指令。执行控制指令时,控制器415经由控制信息从条件代码-断言单元450接收控制信息。控制信息包括指明控制指令的类型的令牌类型、堆栈展开信号以及将令牌推入到CRS堆栈425上并更新线程组的激活掩码和禁用掩码所需要的其他数据。分发器435对指令进行解码并将关于任何断言或条件控制指令(条件分支、条件中断、条件返回和断言指令)的条件数据输出到条件代码-断言单元450。条件数据包括断言测试和条件测试以及将对其应用条件代码的比较值(由控制指令指定)。常规的条件代码被用于评价关于比较值的由指令所指定的条件测试,以产生真或假结果。关于整数值的8个条件测试中的6个为常规条件测试,例如,小于(LT)、等于(EQ)、大于(GT)、小于或等于(LE)、大于或等于(GE)以及不等于(NE)。条件测试用于确定比较值为正、零还是负。当使用浮点格式值时,条件测试还可包括定义诸如NaN(非数字)值这类无序值的行为的条件测试。NaN相对于数字值而言是无序的,因此,当被用于产生比较值或作为用于常规条件测试的输入时,可能产生意想不到的结果。8个条件测试,例如,LEG、U、LTU、EQU、LEU、GTU、NEU和GEU,规定了 NaN值的明确处理。LEG(小于、等于或大于)仅当比较值为零、正或负即为有序的时为真。U(无序的)仅当比较值为无序的即NaN时为真。LTU(小于零或无序的)当比较值为负或NaN时为真。EQU (等于零或无序的)仅当比较值为零或NaN时为真。LEU(小于或等于零或者无序的)仅当比较值为负、零或NaN时为真。GTU(大于零或无序的)仅当比较值为正或NaN时为真。NEU (不等于零或无序的)仅当比较值为正、负或NaN时为真。GEU (大于或等于零或者无序的)仅当比较值为正、零或NaN时为真。其他2个常规的条件测试(对于整数和浮点值而言)为总是(TR)和从不(FL)。还可使用附加的条件测试,例如溢出和进位(carry),并且相应地增加条件测试的数量。可在程序执行期间计算比较值,并且线程组中的每个线程均可具有比较值。因此,当对条件测试进行评价时,一些线程可产生真结果,而其他线程产生假结果。类似地,当对断言测试进行评价时,一些线程会评价真结果而一些会评价假结果。在条件控制或分支指令中,当一个或多个激活线程相对于其他激活线程产生不同的断言或条件测试结果时,线程发散,并且用CRS堆栈425来为分支的一侧存储包含激活掩码和程序计数的令牌,所述分支的一侧将在该分支的第一侧已完成执行之后得到执行。除条件数据之外,分发器还向条件代码-断言单元450输出控制指令(调用、中断、返回、条件分支、断言分支等)、由指令指定的任何目标程序计数(地址)以及激活掩码。 控制指令不会被分发器435输出到处理引擎203。而是由条件代码-断言单元450基于被包含在由条件代码-断言单元450输出到控制器415的控制信息中的激活掩码来确定“取用”掩码。具体来讲,条件代码-断言单元450使用断言测试和条件测试结果来确定这样的“取用掩码”,所述取用掩码指明对于由控制指令指定的断言测试和条件测试的评价为“真(TRUE) ”的激活线程。清除关于线程组中线程的取用掩码中指明真比较测试结果的比特。可由控制器415使用激活掩码和取用掩码来更新禁用掩码。当用两个或更多具有不同函数指针的线程执行函数调用时,使函数调用串行化,以执行指定每个唯一函数指针的线程,并且使用取用掩码来指明每个唯一函数指针的激活线程。条件代码-断言单元450经由控制信息而将取用掩码和令牌类型输出到控制器415。当目标程序计数由调用或分支控制指令所指定时,由条件代码-断言单元450经由控制信息将取用的程序计数输出到控制器415。令牌类型指明被执行以产生禁用掩码的控制指令的类型。令牌类型包括同步、调用、发散和中断。注意,当关于线程的控制指令在途中(in-flight)、即经由控制信息由控制器415输出且尚未由控制器415接收时,控制器415不应当输出关于同一线程的另一个指令。由分发器435接收的其他指令(非控制指令)排队等候以输出到处理引擎302。分发器435可被配置为基于处理指令所需(计算的或存储的)资源的可用性而输出指令。在分发器435的一些实施例中,使用寄存器计数(scoreboarding)方案追踪资源可用性并确定哪些指令可以被输出到处理引擎302。当处理引擎302收到指令时,生成读取请求以获得执行该指令所需要的任何操作数,并将读取请求输出到LRF 304或共享存储器306。然后当得到操作数时由处理引擎302处理该指令。一致分支和分支任意指令处理在SIMT环境中,当线程组执行条件代码序列时,可能会出现这样的情形,其中线程组中的一些线程基于条件代码或断言进行分支转移至目标指令而其他线程不进行分支转移。当执行条件代码序列时,这种情形会导致线程发散以及额外的管理总开销。为了提高条件代码序列的效率,编译器在编译条件代码序列时,或者编程人员在对条件代码序列进行编程时,可以使用一致分支指令,而不论线程组是否与单独的每线程运行时决定一致或不一致。—致分支指令与断言和/或条件代码以及目标指令相关联。当由处理内核208对一致分支指令进行评价时,只有在线程组中的所有激活线程基于断言或条件代码而一致同意取用分支时,线程组中的每个激活线程才进行分支转移至目标指令。如果至少一个激活线程不同意取用分支,则线程组中的每个激活线程会跳转至条件序列中的下一个指令(本文中称为“跳转(fall-through)指令”)。在包含一致分支指令的条件代码序列中,对目标指令和/或跳转指令进行断言,使得仅对其断言为真的线程将执行目标指令和/或跳转指令。也可以相同方式对目标代码路径和跳转代码路径中的后续指令进行断言。一致分支指令可以采用下列形式iPg BRA. U target ;// 如果一致(Pg)则转至目标BRA. U CC. test, target ;// 如果一致(CC. test)则转至目标iPg BRA. U CC. test, target ;//如果一致(PgMCC. test)则转至目标“非”断言测试O! Pg对断言寄存器Pg的补码进行测试。省略的断言或CC测试被认为为真。此外,当评价一致分支指令时,只有在线程组中的所有激活线程都一致同意取用分支时,才执行至目标指令的分支转移。当约束断言Pg和条件代码测试CC. test都被指定时,那么这两者、在卷绕包的所有激活线程中必须为真以取用分支。
操作时,当分发器435收到一致分支指令时,一致分支指令被传送至控制器415。基于条件代码-断言单元450,控制器415首先确定线程组中的激活线程是否一致同意取用分支,即,对于线程组中的每个激活线程而言,条件代码和/或断言均为真。在一个实施例中,如果在当前激活掩码中线程被启动,则该线程是激活的。在另一个实施例中,每线程的断言值和/或条件代码值被存储在条件代码-断言单元450中,指明对于线程组中的每个线程而言断言和/或条件代码是真还是假。如果线程组中的激活线程一致同意取用分支,则控制器415将存储在程序计数存储器405中的激活程序计数设定至与一致分支指令相关联的目标指令的程序计数。重要的是,目标指令被断言使得仅与目标指令相关联的断言为真的线程将执行目标指令。也可以相同的方式对目标代码路径中的后续指令进行断言。然而,如果线程组中的至少一个激活线程不同意取用分支,即,条件代码和/或断言对于该激活线程而言为假,则控制器415使存储在程序计数存储器405中的激活程序计数递增,即,将激活程序计数设定至与跳转指令相关联的程序计数。与目标指令类似地,跳转指令也被断言使得仅与跳转指令相关联的断言为真的线程将执行跳转指令。也可以相同的方式对跳转代码路径中的后续指令进行断言。表I示出了表现如果-则-否则(if-then-else)语句的一组指令的示例if (a < b) A ;else B;该组指令包含两个一致分支指令。表I
指令编号指令Γ 周期数
~ ISETP. LT Pl, Ra, Rb ;Pl = (Ra < Rb) ;
~2@P1 BRA. U Then ;如果一致(Pl)则转至;
3Else @ ! Pl B ;否则B ;B
~@ ! Pl BRA. U Done ; 如果一致(! Pl)则完成;
5Then @P1 A ;则A ;A
6Done 在指令I,对于线程组中的每个激活线程,确定断言Pl的值,并将其存储在断言存储单元450中。在指令2,基于针对线程组中每个激活线程的断言Pl的值来评价BRA. U (第一一致分支指令),以确定线程组中的所有激活线程是否都同意取用分支。如果都同意,则线程组进行分支转移至指令5,并对于线程组中的每个激活线程执行指令“A”。否则,线程组跳至指令3,并且在指令3,对于Pl为假(! Pl)的线程组中的每个线程执行B。在指令4,基于针对线程组中每个激活线程的断言! Pl的值来评价BRA. U(第二一致分支指令),以确定线程组中的所有激活线程是否都一致同意取用分支。如果都同意,则线程组进行分支转移至指令6。否则,在指令5,对于Pl为真的线程组中的每个线程执行A。如果线程组在断言Pl的值上不一致,则表I中该组指令的执行需要A+B+3个周期,作为必要的执行周期数。如果线程组中的所有激活线程都取用Pl分支,则执行需要A+2个周期。类似地,如果线程组中的所有激活线程都取用! Pl分支,则执行需要B+3个周期。如本文之前所述,即使在线程组中的所有线程都取用同一代码路径的情况下,现有技术的条件代码技术也会增加额外的指令并使用同步堆栈操作来发散线程组并使其同步,或者使用要求线程组中每个线程都执行如果-否则状态语句的两个代码路径。相比较而言,一致分支指令通过仅在线程组中的所有线程都一致同意取用分支时进行分支转移而避免了这些额外的执行周期。这在一个 路径的代码长度明显比另一路径的代码长度长时尤其有利。一致分支指令不使线程组发散并且不要求同步堆栈操作。图5是根据本发明的一个或多个方面的用于处理一致分支指令的方法步骤的流程图。虽然结合图I 4的系统来描述这些方法步骤,但本领域技术人员将理解,被配置为按照任何次序执行这些方法步骤的任何系统都在本发明的范围内。方法500开始于步骤502,其中,通过将激活程序计数(PC)输出到指令高速缓存430,控制器415获取与针对线程组的激活程序计数的当前设置相对应的程序指令。在步骤504,分发器435确定该指令是否是一致分支指令。如果不是一致分支指令,则方法500前进至步骤506,在其中正常执行该指令。然而,如果在步骤504,该指令是一致分支指令,则方法500前进至步骤508。如本文之前所述,一致分支指令与断言和/或条件代码条件以及目标指令相关联。在步骤508,控制器415基于与一致分支指令相关联的条件代码和/或断言而确定线程组中的所有激活线程是否都一致同意取用分支。如果不是,则方法前进至步骤510,其中使激活PC递增,以反映跳转指令(条件代码序列中的下一个指令)的程序计数,并且不执行分支。然而,如果在步骤508,线程组中的所有激活线程都一致同意取用分支,则在步骤512,将激活PC设定至与一致分支指令相关联的目标指令的目标PC。为了提高循环条件代码序列的效率,编译器在编译条件代码序列时,或者编程人员在对条件代码序列进行编程时,可使用分支任意指令。当对分支任意指令进行评价时,如果线程组中至少一个激活线程决定取用分支,则线程组中的所有激活线程都进行分支转移至与该分支任意指令相关联的目标指令。分支任意指令可以采用下列形式iPg BRA. ANY target ;//如果任意(Pg)则所有线程都转至目标当被使用在具有断言代码的循环体的末端时,分支任意指令实施并行线程的循环,而不制作任何同步堆栈条目。下面详细描述“当型(while)”循环的示例。在分支任意指令的情形中,控制器415确定是否线程组中的至少一个激活线程决定取用分支。如果是,则控制器415将存储在程序计数存储器405中的激活程序计数设定至与分支任意指令相关联的目标指令的目标程序计数。控制器415还设定激活掩码,以指明线程组中的每个线程都应该执行(取用)至与目标程序计数相关联的目标指令的分支。但是,如果控制器415确定没有激活线程决定取用分支,则控制器415使存储在程序计数存储器405中的激活程序计数递增,即,将激活程序计数设定至与下一个指令相关联的程序计数。分支任意指令不使线程组发散并且不要求同步堆栈操作。
表2示出了表现“当型”循环的一组指令的示例while (a < b) S ;该组指令包含分支任意指令。表 权利要求
1.一种控制器,所述控制器管理执行一组指令的线程组中的一个或多个线程,所述一组指令包括目标指令和指定条件的分支指令,所述控制器经配置以 接收所述分支指令,其中,所述线程组中的每个激活线程均与真或假条件值相关联,所述真或假条件值与由所述分支指令所指定的所述条件相关联; 用合并函数将与所述线程组中的每个激活线程相关联的所述条件值合并到一个真或假判定中,所述判定指明是否所述线程组中所有激活线程都应取用至所述目标指令的分支;以及 如果所述判定为真,则更新用于所述线程组中所有激活线程的激活程序计数,以指明所述一组指令中的所述目标指令,或者 如果所述判定为假,则更新用于所述线程组中所有激活线程的所述激活程序计数,以 指明紧跟所述分支指令的下一个指令。
2.根据权利要求I所述的控制器,其中,所述合并函数是所有所述真或假条件值的布尔与,因而要求所有激活线程对取用至所述目标指令的所述分支的一致决定。
3.根据权利要求I所述的控制器,其中,所述合并函数是所有所述真或假条件值的布尔或,因而如果任一激活线程具有真条件值,则决定取用至所述目标指令的所述分支。
4.根据权利要求I所述的控制器,其中,所述目标指令与断言条件相关联,使得仅对其断言条件为真的激活线程执行所述目标指令。
5.根据权利要求I所述的控制器,其中,所述下一个指令与断言条件相关联,使得仅对其断言条件为真的激活线程执行所述目标指令。
6.根据权利要求I所述的控制器,其中,与第一激活线程相关联的所述条件值是基于存储在断言寄存器中并与所述第一激活线程相关联的断言值而确定的。
7.根据权利要求I所述的控制器,其中,所述分支指令指定条件代码测试,并且所述线程组中的每个激活线程均与条件代码测试值相关联。
8.根据权利要求I所述的控制器,其中,所述线程组中的所述激活线程由激活掩码指明。
9.一种控制器,所述控制器用于管理执行一组指令的线程组中的一个或多个线程,所述一组指令包括目标指令和指定条件的一致分支指令,所述控制器经配置以 接收所述一致分支指令,其中,所述线程组中的每个激活线程均与条件值相关联,所述条件值指明由所述一致分支指令所指定的条件对于所述激活线程而言是真还是假; 将与所述线程组中的每个激活线程相关联的条件值合并到一个真或假判定中,所述判定指明是否所述线程组中的所有激活线程都一直同意所述相关联的条件值为真;以及如果所述判定为真,则更新激活程序计数,以指明所述一组指令中的所述目标指令,或者 如果所述判定为假,则更新所述激活程序计数,以指明紧跟所述一致分支指令的下一个指令。
10.根据权利要求9所述的控制器,其中,所述目标指令与第一断言条件相关联,并且所述下一个指令与第二断言条件相关联。
11.根据权利要求10所述的控制器,其中,所述第一断言条件与由所述一致分支指令所指定的所述条件相同。
12.根据权利要求10所述的控制器,其中,如果所述线程组中的至少一个激活线程具有假条件值,则所述第一断言条件对于第一组激活线程中的每个激活线程而言为真而对于第二组激活线程中的每个激活线程而言为假,并且所述第二断言条件对于所述第二组激活线程中的每个激活线程而言为真而对于所述第一组激活线程中的每个激活线程而言为假。
13.根据权利要求10所述的控制器,其中,如果所述线程组中的所有激活线程都进行分支转移,则所述第一断言条件对于所述线程组中的所有激活线程而言为真,并且所述线程组中的所有激活线程都执行所述目标指令而不执行所述下一个指令。
14.根据权利要求9所述的控制器,其中,与第一激活线程相关联的所述条件值是从存储在断言寄存器中并与所述第一激活线程相关联的断言值来确定的。
15.根据权利要求9所述的控制器,其中,所述分支指令进一步指定条件代码测试,并且所述线程组中的每个激活线程均与条件代码测试值相关联。
全文摘要
本发明的一个实施例提出了一种用于管理执行多线程处理器的线程组中的线程发散的机制。当执行一致分支指令时,使线程组中所有激活线程都仅在该线程组中每个线程都同意取用分支时进行分支转移。以这种方式,可以消除线程发散。当执行分支任意指令时,使线程组中所有激活线程都在该线程组中的至少一个线程同意取用分支时进行分支转移。
文档编号G06F15/00GK102640131SQ201080053460
公开日2012年8月15日 申请日期2010年9月24日 优先权日2009年9月24日
发明者吉列尔莫·胡安·罗扎斯, 理查德·克雷格·约翰逊, 约翰·R·尼科尔斯, 罗伯特·史蒂文·格兰维尔 申请人:辉达公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1