Gpu发散栅栏的制作方法_4

文档序号:9816368阅读:来源:国知局
时延操 作的核心的执行,一旦活动线程束(活动线程束池)的数目达到某一阈值,GPU 12可立即执 行线程压缩。
[0064] -些核心可包含"传统"栅栏操作与发散栅栏操作的混合物。传统栅栏操作使到达 栅栏的全部线程束暂停,且不同于发散栅栏不与GPU 12在运行时评估的布尔条件相关联。 传统发散栅栏操作还不使GPU 12执行线程排序和线程压缩。对于包含传统栅栏和发散栅栏 的混合物的核心,发散栅栏指令应产生传统栅栏操作。在具有传统和发散栅栏的混合物的 核心中,GPU 12可在不等待线程束由于执行传统栅栏操作而暂停的情况下执行线程压缩。 [0065] 一些核心还可包含子例程调用。在子例程调用期间,GPU可将线程数据与具有与称 为子例程相关联的不同调用堆叠的线程束调换。当发散栅栏操作包含在此类调用内时,子 例程调用可存在问题。举例而言,第一线程束的线程可调用核心的第一线(例如,线10)处的 子例程。第二线程束可调用核心的稍后执行点(例如,线20)处的同一子例程。子例程包含发 散栅栏指令。
[0066] 由于执行介入指令和/或其它因素,当第一和第二线程束执行子例程内部的发散 栅栏指令时,第一线程束和第二线程束的堆叠可彼此不同。在具有子例程内部的发散栅栏 的问题的一个实例解决方案中,GPU 12可完全禁止具有子例程内部的发散栅栏。在另一实 例解决方案中,GPU 12可实施逻辑以确保在执行子例程调用内部的发散栅栏指令时,执行 具有发散栅栏指令的子例程的线程束具有相同堆叠。
[0067] 图3为说明根据本发明的技术的基于每一线程束内的活动线程的数目将线程束排 序的概念图。图3的实例说明未排序的线程束80的数目。GPU 12响应于将与发散栅栏指令相 关联的布尔表达式评估为等于真而将未排序的线程束80排序,如上文所描述。在图3的实例 中,未排序的线程束80包含线程束82、84、86、88、90、92、94、96和98。在未排序的线程束80 中,活动线程束以对角散列说明。非活动线程束线程在无任何散列的情况下说明。
[0068] GPU 12基于每一线程束中的活动线程的数目将未排序的线程束82排序。所得经排 序线程束在图3经说明为经排序线程束100。在未排序的线程束80中,线程束82具有最多活 动线程(全部活动),随后按顺序为线程束90、线程束88、线程束94、线程束84、线程束98、线 程束92、线程束86和线程束96(全部非活动)。如图3中所说明,GPU 12使用插入排序将未排 序的线程束80排序。基于每一线程束中的活动线程的数目的插入排序的结果在图3中经说 明为经排序线程束100。在不同实例中,GPU 12可将未排序的线程束80存储在队列中,随后 将队列中的线程束就地排序,此导致经排序线程束100为队列。在不同实例中,队列可实施 为指针的链表。每一指针可指向特定线程束。为将链表排序,GPU 12可在链表中调换与线程 束相关联的指针。
[0069] 图4为说明用于将来自一个线程束的活动线程与来自另一线程束的非活动线程调 换的技术的概念图。在图4的实例中,GPU 12先前已将未排序的线程束80排序到经排序线程 束100中。GPU 12将非活动线程与经排序线程束100的活动线程调换。GPU 12将非活动线程 与活动线程调换,直到"非活动线程束"(即,具有全部非活动线程的线程束)不再可产生为 止。将非活动线程与活动线程调换的过程被称作"线程压缩"。将经排序线程束100的非活动 线程与活动线程调换的结果经说明为经压缩线程束120。
[0070] GPU 12基于两个线程束中的活动和非活动线程的数目将非活动线程与活动线程 调换。在图4的实例中,GPU 12将来自具有更多活动线程的线程束的线程与来自具有较少活 动线程的线程束的线程调换。在图4中,GPU 12将具有非活动线程的最左边的线程束的线程 与具有活动线程的最右边的线程束调换。GPU 12继续从外向内调换来自不同线程束的线 程,即,将来自具有更多活动线程的线程束的非活动线程与来自具有更多非活动线程的线 程束的活动线程调换,直到非活动线程束不再可产生为止。调度器24恢复执行当时仍保持 在队列中的任何和全部线程束。另外,每当队列的头端处的线程束含有全部活动线程时,调 度器24释放位于队列的头端处的具有全部活动线程的线程束且开始执行线程束。
[0071] 通过将非活动线程与活动线程调换,本发明的技术形成具有大量活动线程的线程 束以及具有全部非活动线程的线程束。具有较大数目的活动线程的线程束增大GPU 12的利 用率和输送量。具有全部非活动线程的线程束还可增大GPU 12的输送量,因为非活动线程 束可"快进"到当前控制流块的末端或在指令遵循当前控制块时结束执行。因此,在一些情 况下,具有全部非活动线程的线程束可立即结束执行。因此,GPU 12可减少执行时间或停止 执行此类非活动线程束,且利用与非活动线程束相关联的PE来执行调度器24确定可在那些 PE上执行的不同线程束。
[0072] 图5为说明根据本发明的技术的用于处置多个发散栅栏指令的技术的概念图。因 为发散栅栏通常位于还具有相关联的布尔条件的控制流块中,线程束可在GPU为线程束的 任何线程将布尔条件评估为真时进入发散栅栏所在的控制流分支,或GPU可允许线程束穿 过发散栅栏所在的控制流块且继续执行。如果线程束并不进入栅栏所在的控制流分支或如 果对于线程束中的全部线程发散栅栏的布尔条件为假,那么线程束可穿过发散栅栏。在图5 的实例中,GPU 12执行包含多个发散栅栏(被称作"DB1" "DB2"和"DB3")的核心20。作为一个 实例,核心属于光线跟踪应用程序。图5说明八个线程(线程140、142、144、146、148、150、152 和154)通过核心的进度。线程140至154的条形图的长度指示每一线程是否已到达发散栅栏 DB1至DB3中的一者,或已完全结束执行("结束")核心。
[0073]在图5的实例中,DB1、DB2和DB 3中的每一者位于核心中的不同点处。含有对应于 DB1、DB2和DB3的三个发散栅栏样本的一个实例伪代码包含于以下:
[0075]核心伪代码包含多个发散栅栏指令,DB1、DB2和DB3。发散栅栏指令中的每一者出 现在分支语句或循环语句中。线程束执行核心20可依据它们进入的控制流块和布尔条件 (例如,与发散栅栏指令相关联的栅栏条件)的评估而到达不同发散栅栏。线程执行核心20 可在核心20的执行中首现遇到DB1,随后为DB2或DB3。
[0076]相对于单一发散栅栏指令,当多个发散栅栏指令存在于核心中时,GPU 12可类似 地处置线程束排序和执行线程压缩的过程。确切地说,调度器24可将到达同一发散栅栏的 线程束一起分组到被称作"压缩池"的单元中。GPU 12可将线程束的线程压缩在压缩池中, 所述线程束已到达同一发散栅栏指令。
[0077]更确切地说,GPU 12使与线程束已到达的发散栅栏相关联的前缀与每一线程束相 关联。作为一实例,到达第一发散栅栏的线程束可具有前缀"1",到达第二发散栅栏的线程 束可具有前缀"2"等。每一线程束还经指派指示线程束中的活动线程的数目的第二数目,例 如后缀。作为一实例,如果线程束具有三个活动线程束,那么线程束经所指派后缀"三"(3)。 [0078]前缀和后缀的组合形成GPU 12使用其来将线程束队列中的线程束排序的数目。作 为一实例,用于GPU 12的线程束队列中可存在三个线程将排序。第一线程束已到达发散栅 栏"2"且具有四(4)个活动线程。GPU 12可将数目"24"指派给第一线程束以用于排序目的。 第二线程束可能已到达发散栅栏T且具有一(1)个活动线程。GPU 12可将值"11"指派给第 二线程束。第三线程束可能已到达发散栅栏"Γ且具有3(三)个活动线程。GPU 12可将13指 派为用于线程束的排序值。GPU 12通过每一现场束的值将队列中的线程束排序。排序的结 果可为使得第三线程束(具有排序值11)位于队列的头端处,第二线程束(具有排序值13)为 队列中的第二个,且第一线程束(具有排序值24)位于队列的尾端处。因为具有排序值11和 13的线程束具有相同前缀"Γ,所有GPU 12可形成压缩群组。
[0079]在GPU 12暂停全部线程束且将线程束插入在队列中之后(或在线程束不暂停在栅 栏上时结束执行),GPU 12通过将活动线程与非活动线程调换而对第一线程束群组执行线 程压缩。换言之,GPU 12在消除关于后续发散栅栏的发散之前消除关于第一发散栅栏的全 部发散,即GPU 12在移动到发散栅栏DB2、DB3等上之前消除关于发散栅栏DB1的发散。
[0080] 为消除与特定发散栅栏相关联的发散,GPU 12将第一线程束群组从队列分离,形 成压缩池且对池中的线程束执行压缩。由于GPU 12执行压缩,因此GPU 12将线程束从压缩 池释放且在执行时恢复线程束,使得GPU 12可在到达任何后续发散栅栏后暂停所释放的线 程束。同时,含有其余线程束的队列继续接收任何发散栅栏上暂停的额外线程束。在循环情 况下,GPU 12可在它们到达栅栏DB2、DB3或甚至再次到达DB1时暂停恢复的线程束。GPU 12 将线程束添加到队列且就爱那个线程束与队列中的其它线程束排序,如上文所描述。
[0081] 当全部那些线程束暂停且插入在队列中时(即,队列再次变得完整),GPU 12对队 列中的当前第一群组重复同一压缩过程,举例来说,此可适用于DB2。应注意,在GPU 12完成 先前压缩且将全部线程束从先前压缩池释放之前,GPU 12可不具有队列中的全部线程束且 开始另一轮压缩。因此,连续压缩过程之间不存在冲突。一旦全部线程束暂停于同一栅栏 上,此形成队列中的仅一个群组,GPU 12可将暂停的线程束中的全部从队列分离且清空队 列。
[0082] 因为暂停于位于队列的前部处的栅栏(例如,DB1)上的线程束稍后很可能撞击后 续栅栏(例如,DB2/DB3),因此GPU 12可利用压实仅第一线程束群组的技术,以在为后续栅 栏(例如,DB2、DB3等)执行压缩
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1