用于同步代码的发散区域中的线程的系统和方法

文档序号:6510860阅读:162来源:国知局
用于同步代码的发散区域中的线程的系统和方法
【专利摘要】提供用于在多线程并行处理系统内同步代码的发散区域中的线程的系统和方法。方法包括,在任何线程进入发散区域之前,生成表示将进入发散区域的线程的数目的计数。方法还包括在发散区域内使用计数以同步发散区域中的线程。
【专利说明】用于同步代码的发散区域中的线程的系统和方法
[0001]相关申请的交叉引用
[0002]本申请要求于2012年9月10日由Jones所提交的序列号为13/608,912的、标题为“SYSTEM AND METHOD FOR SYNCHRONIZING THREADS IN A DIVERGENT REGION OF CODE”的美国申请的优先权,其与本申请共同受让,并在本文通过援引的方式加以合并。
【技术领域】
[0003]本发明总地涉及多线程并行处理系统,并且,更具体地,涉及同步代码的发散区域中的线程。
【背景技术】
[0004]在图形处理和其他处理领域中,通常要求程序对包括如图像或音频文件这种集合的数据点的大集合进行操作。这种程序可被频繁地、有利地构建为动作的序列,其中每个可并发地实施在集合中的所有数据点上。
[0005]被设计为支持这种程序的一种处理系统称为单指令多数据(SMD)系统。SMD系统提供多个处理器,其中每个对单数据点应用程序的指令。在硬件中,多个处理器的子集可实现为多处理单元(MPU)。

【发明内容】

[0006]一个方面提供用于同步多个线程的方法。方法包括生成表示将进入发散区域的线程的数目的计数。计数在任何线程进入发散区域之前生成。方法还包括在发散区域内使用计数以同步发散区域中的线程。
[0007]另一方面提供存储指令的非暂时性计算机可读介质。当由MPU执行时,指令致使MPU同步MPU上执行的多个线程。由MPU所实施的步骤包括生成表示将进入发散区域的线程的数目的计数。计数在任何线程进入发散区域之前生成。步骤还包括在发散区域内使用计数以同步发散区域中的线程。
[0008]又一方面提供计算设备。计算设备包括MPU,适用于同步MPU上执行的多个线程。MPU配置为生成表示将进入发散区域的线程的数目的计数。计数在任何线程进入发散区域之前生成。MPU进一步配置为在发散区域内使用计数以同步发散区域中的线程。
【专利附图】

【附图说明】
[0009]现在结合附图对接下来的描述进行参考,其中:
[0010]图1是根据本公开的系统的示意图;以及
[0011]图2是根据本公开的方法。
【具体实施方式】
[0012]图1是根据本公开的系统100的示意图。系统包括耦连到主机存储器104并耦连到图形处理单元(GPU) 106的主机处理器102。GPU106也耦连到主机存储器104,并可使用直接存储器存取(DMA)对主机存储器104写入数据以及从主机存储器104读取数据。
[0013]GPU106还耦连到显示器108或其他输出设备,并且适用于使用显示器108显示由GPU106所生成的信息。在其他实施例中,显示器108还可以、或可替代地耦连到主机处理器102用于由主机处理器102所生成的信息的显示。
[0014]GPU106包括处于线程执行控制单元(TECT)IlO控制之下的多个多处理单元(MPU)112。TE⑶110耦连到主机处理器102,并且适用于从主机处理器102接收控制信号。MPUl 12耦连到设备存储器114,并且适用于对设备存储器114写入数据以及从设备存储器114读取数据。设备存储器114耦连到主机存储器104,并且适用于对主机存储器104写入数据以及从主机存储器104读取数据。
[0015]主机处理器102可执行构建为叫做内核的SMD程序的序列的程序。作为执行程序的一部分,主机处理器102可在GPU106中启动内核的序列。
[0016]GPU106提供将并行工作布置为线程、线程块(或简称块)以及网格的层次的并行计算架构。网格是线程的集合,其中所有线程执行通用内核。单独线程将其内核执行为独立实体,具有独立数据、栈和程序计数器。线程被分组为用户定义大小(块中线程的数目)的线程块。块内的线程被确保并发地执行。
[0017]为了指派到MPU112以及由MPU112执行,块的线程可分为子集。这些子集可以可替代地称为“线程束(warp)”或“波前(wavefront)”。子集的大小典型地选择为MPU112中的处理器数目乘以2的幂(即1、2、4等)。线程束的线程被指派到单个MPU112,并且MPU112在相应的1、2、4等数目的时钟周期中执行线程束的线程的一个指令。
[0018]可使用执行屏障操作(或简称屏障)或其他同步操作来同步块的线程。通常,屏障用来强迫实行在屏障之前和之后所发出的操作上的排序约束。一旦线程到达屏障,其不能前进直到所有线程已到达屏障为止。
[0019]屏障可实现为计数信号量(semaphore)。当线程调用屏障时,线程传递进来块中活动线程的数目的计数。响应于初次这种调用,信号量将其计数初始化为传递进来的计数,减去一,表示剩余要调用信号量的线程的数目。随着每个后续线程调用计数信号量,信号量递减其计数。一旦计数达到零,则允许所有线程前进。
[0020]在其他实施例中,屏障可实现为诸如位字段的每线程标记。例如,如果屏障具有64个可能的参与者,那么根据本公开的系统可使用64位值中的二进制(1/0)位来指示到达。掩码可允许线程的子集参与(实现“仅等待N个线程”的行为)。也就是说,可通过创建具有若干经设置(或经清除)的位的、等于块中活动线程的数目的经接收的计数的掩码来初始化位字段屏障。
[0021]在又一个实施例中,根据本公开的系统可实现为逻辑门的网络以对等待的线程实施多输入AND (与)操作。在这种系统中,可通过可编程地将等于块中活动线程的数目的经接收的计数的若干输入关联到TRUE (真)(或FALSE (假))来实施子集操作。
[0022]屏障和其他同步操作可以以GPU的硬件实现或经由GPU上执行的软件来实现。一些GPU提供某个数目的硬件屏障,并且当需要时可使用软件供应附加的屏障。
[0023]内核可包括取决于依靠数据的条件测试可能或可能不执行的代码的片段或区域。这种代码的片段可称为发散区域。如果屏障置于这种发散区域中,那么一些线程可能不到达屏障,这基于线程正在其上运行的数据。因为直到所有线程已到达屏障以前没有线程可以越过屏障前进,所以这可能导致死锁或不正确的执行。针对这些原因,在代码的发散区域内使用屏障典型地是非法的。
[0024]虽然处理单元106在本文称为图形处理单元,但应理解的是处理单元106可用于可以与图形无关的数据处理一也就是说,在任何要求多线程处理的应用中。在其他实施例中,处理单元106可包含经优化用于通用处理、同时保留本文所讨论的底层计算架构的电路。
[0025]主机处理器102包括适用于接收存储在一个或多个类型的计算机可读介质上的程序的一个或多个子系统。短语“计算机可读介质”包括能够由计算机所存取的任何类型的介质,诸如只读存储器(ROM)、随机存取存储器(RAM)、硬盘驱动器、压缩光盘(⑶)、数字视频光盘或数字通用光盘(DVD)或任何其他类型的介质。
[0026]图2是根据本公开的方法200。方法200适合于在使用结构化的控制流写程序之处使用。在虚线208以上所示的步骤在进入代码的发散区域之前实施,而虚线208以下的步骤在当处于发散区域内时实施。
[0027]在进入代码的发散区域之前,在步骤202中,使用屏障操作将到达发散区域的所有线程同步。一旦所有线程经同步,在步骤204中,生成将进入发散区域的线程的数目的计数。
[0028]随后,在步骤206中,可通过为屏障操作供应计数来同步发散区域内的线程,屏障操作在发散区域内的所有线程的继续执行以前将等待仅该数目的线程到达屏障。
[0029]在一些实施例中,每个线程可计算指示线程是否将进入发散区域的布尔变量(或标记)pass。随后,通过使用从每个线程接收pass的屏障操作以及current_count—到达发散区域的线程的数目的计数,步骤202和204可一起实施。屏障使用current_count同步到达发散区域的所有线程,随后返回new_COunt—到达屏障的、pass设为真的线程的数目的计数。
[0030]在其他实施例中,其中线程布置在子集(也称为线程束或波前)中,步骤204可包括针对每个子集确定子集中的任何线程是否将进入发散区域、对包括这种线程的子集的数目进行记数(tally)、以及使用子集的记数生成计数。在一些这样的实施例中,进入发散区域的线程的数目的计数可通过子集的记数乘以每个子集中的线程的数目来生成。
[0031]在一些实施例中,没有进入第一发散区域的所有线程进入第二发散区域。这种情况出现在例如对于具有then和else子句二者的if语句中。在这种实施例中,其中期望进入第二发散区域的线程的同步并且针对每个线程计算布尔值pass,可使用!pass (或NOTpass,即pass的逻辑否定)生成进入第二发散区域的线程的计数。
[0032]在遭遇第一发散区域内的第二发散区域并且期望同步进入第二发散区域的线程之处,可实施与已针对第一发散区域所描述的动作类似的动作。在步骤202中,当同步到达第二发散区域的线程时,到达第二发散区域的线程的计数将与进入第一发散区域的线程的计数(new_count,在上文所描述的一些实施例中)相同。
[0033]在一些实施例中,当编译器遭遇“if”语句、“while”语句、或其他产生代码的发散区域并且其中发散区域包括同步操作的语句时,用于实施方法200 (或本公开的其他实施例)的步骤的指令由编译器自动地生成。这种编译器可以比要求程序员手工编写根据本公开的方法产生更有效的实现方案。此外,程序员将发现这种编译器更便于使用,因为将不要求程序员在代码的每个发散区域以前和在代码的每个发散区域内添加实现这种方法的代码。
[0034]应理解的是,这种编译器可利用方法200或根据本公开的任何其他方法。这种编译器可采用多于一个在单个程序中具体化本公开的方法。这种方法可采用多于一个类型的屏障来实现该方法,并可在以硬件实现的同步操作和以软件实现的屏障之间进行选择。可基于同步操作的计数来进行这种选择,该同步操作在包括要求同步的多个发散区域的程序中已经使用。
[0035]与本申请相关领域的技术人员应理解的是,可对所描述的实施例进行其他和进一步的附加、删除、替换和修改。
【权利要求】
1.一种用于同步多个线程的方法,所述方法包括: 生成表示将进入发散区域的线程的数目的计数,所述计数在任何线程进入所述发散区域之前生成;以及 在所述发散区域内使用所述计数以同步所述发散区域中的所述线程。
2.根据权利要求1所述的方法,其中所述生成所述计数进一步包括: 同步所述多个线程;以及 一旦所述多个线程经同步,则生成所述计数。
3.根据权利要求1所述的方法,其中所述多个线程布置在多个线程组中,并且其中所述生成所述计数进一步包括: 针对每个线程组,确定所述组中的任何线程是否将进入所述发散区域;以及 基于所述确定的结果生成所述计数。
4.根据权利要求3所述的方法,其中: 所述确定所述组中的任何线程是否将进入所述发散区域进一步包括标识将进入所述发散区域的所述组中的一个线程;以及 所述基于所述确定的结果生成所述计数进一步包括基于经标识的线程生成所述计数。
5.根据权利要求1所述的方法,其中所述使用所述计数以同步所述线程进一步包括使用实现为计数信号量、位字段和逻辑门的网络中的一个的屏障,其中所述屏障以硬件和软件中的一个实现。
6.根据权利要求5所述的方法,其中所述使用所述屏障进一步包括使用所述计数的值初始化所述屏障。
7.根据权利要求1所述的方法,其中所述计数是第一计数,所述发散区域是第一发散区域,并且所述第一发散区域包括第二发散区域,所述方法进一步包括: 生成表示将进入所述第二发散区域的线程的数目的第二计数,所述第二计数在任何线程进入所述第二发散区域之前生成,其中所述第二计数使用所述第一计数生成;以及在所述第二发散区域内使用所述第二计数以同步所述第二发散区域中的所述线程。
8.一种计算设备,包括: 多处理单元,适用于同步所述多处理单元上执行的多个线程,所述多处理单元配置为: 生成表示将进入发散区域的线程的数目的计数,所述计数在任何线程进入所述发散区域之前生成;以及 在所述发散区域内使用所述计数以同步所述发散区域中的所述线程。
9.根据权利要求8所述的计算设备,其中所述生成所述计数进一步包括: 同步所述多个线程;以及 一旦所述多个线程经同步,则生成所述计数。
10.根据权利要求8所述的计算设备,其中所述多个线程布置在多个线程组中,并且其中生成计数进一步包括: 针对每个线程组,确定所述组中的任何线程是否将进入所述发散区域; 基于所述确定的结果生成所述计数。
【文档编号】G06F9/52GK103823720SQ201310407499
【公开日】2014年5月28日 申请日期:2013年9月9日 优先权日:2012年9月10日
【发明者】斯蒂芬·琼斯 申请人:辉达公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1