Gpu发散栅栏的制作方法_3

文档序号:9816368阅读:来源:国知局
否为真;暂停执行具有对于其表达式为真的对应线程的每一线程束;以及确定对于 其表达式为真的多个线程束中的每一者的活动线程的数目。方法可进一步包括:基于多个 线程束中的每一者中的活动线程的数目将对于其表达式为真的多个线程束排序;将多个线 程束中的的第一线程束的活动线程的线程数据与多个线程束中的第二线程束的非活动线 程的线程数据调换;以及恢复执行对于其表达式为真的多个线程束中的至少一者。
[0047]图2为说明根据本发明的技术的在多个处理元件上执行的线程束的框图。图2说明 在多个处理元件42A至42N(PE 42)上执行的线程线程束40WE 42可为一或多个着色器22 (图1)的一部分。线程线程束(例如线程束40)可包括一线程群组,GPU调度器24可将所述线 程指派到多个处理元件(例如,PE 42)以供执行。图2的每一PE可包括能够在特定时间对多 个数据值执行单一指令(例如向量指令)的单指令多数据(SMD)单元。PE 42还可支持对单 一数据值执行单一指令,例如对单一浮点值的单一操作。
[0048]线程束40还包含GPU 12的调度器指派PE 42以供执行的指令44。在一些实例中,指 令44可存储于命令缓冲器中。指令44可包含每一PE经配置以经配置以执行的核心的指令 集。程序计数器(PC)50指示PE 42中的一或多者将执行的当前指令。在指令结束执行PE 42 之后,PC 50的值可递增到核心20的下一个指令的地址。线程束40还包含寄存器46。寄存器 46A至46N(寄存器46)可为能够处置多个数据值或单一值的通用寄存器。寄存器46可被"储 备",即,可加载和存储用于特定PE的数据。作为一实例,寄存器46A可限于存储用于PE 42A 的数据,且可不加载或存储用于其它PE的数据。寄存器46中的每一者46可将数据供应到PE 42中的一者和/或供应来自其的数据,PE 42可随后处理数据。线程束40还可包含线程束上 下文数据48。线程束上下文数据48可包含常见或在线程束40的不同线程当中共用的数据。 作为一实例,上下文数据48可包含预测寄存器的数据,所述数据可包含用于执行于线程束 40的PE 42上的每一线程的数据。
[0049] 线程束40、PE 42、指令44、寄存器46、上下文48以及PC 50可包括核心或GPU 12的 着色器22的核心的部分。在不同实例中,线程束40可包括可为GPU 12的图形管线的部分的 着色器(例如几何着色器、像素着色器和/或顶点着色器)的部分。在一些实例中,GPU 12可 将由线程束产生的结果馈入到图形管线的另一阶段中以供额外处理。
[0050]在执行线程束40上的核心期间,PE 42中的一或多者执行位于由PC 50指示的地址 处的指令44中的一者。在执行指令期间,PE 42可从寄存器46读取一或多个数据值。PE 42可 对数据值执行一或多个操作,且存储返回至寄存器46新值。PE 42可执行流控制指令,例如 分支、跳转、转至等。流控制指令可使一个PE(例如,PE 42A)跳转到指令44中与PE 42B不同 的一者,即执行于PE上的线程可由于流控制的不同评估而变得发散。然而因为存在单一 PC 50, PE 42可在给定时间在一个特定处仅执行由PC 50指示的指令44中的一者。
[00511 一旦线程束的线程发散,PE 42可仍仅在特定时间执行通过PC 50的值指示的一个 指令。为支持发散执行,线程束40维持指示PE 42中的哪一者应执行PC 50的地址处的指令 的状态,例如位掩码。作为一实例,PE 42A和42B可经调度以执行由采用"if-else"语句的不 同分支产生的不同指令。在此实例中,PE 42A执行指令44中的第一指令,且PE 42B稍后执行 第二指令,指令44中的第二不同指令。当PE 42A执行第一指令时,线程束40设定位掩码以指 示PE 42A在执行指令期间为活动,而PE 42B为非活动。PE 42A随后继续执行指令44,直到PE 42A的线程结束执行或暂停执行发散栅栏指令且暂停执行线程为止。一旦PE 42A结束执行, 线程束40改变位掩码以指示仅PE 42B为活动,将PC 50的值改变为PE 42B应执行的指令的 地址,且随后PE 42B执行由PC 50指定的指令,直到线程暂停或结束执行为止。
[0052]如上所述,本发明的技术包括发散栅栏指令,当所述指令执行时,可在多个线程束 (例如线程束40)的线程发散时改善GPU 12的性能。发散栅栏指令可包括应用软件编程接口 (API)的部分,例如DirectX 11API、0penGL API、0penCL和/或DirectCompute等。写入此类 API中的程序可将发散栅栏函数的调用插入到使GPU 12执行发散栅栏指令的核心20中。 [0053]编译程序/驱动程序18或操作系统还可将发散栅栏指令的调用插入到核心20的代 码中。在不同实例中,用户可使用编译程序/驱动程序18编译核心20。在编译期间,编译程 序/驱动程序18可分析核心20,且确定其中很可能发生发散的程序的位置和将显著影响性 能的位置中的至少一者,且可在那些位置中的至少一者处插入发散栅栏指令。编译程序/驱 动程序18可在很可能发生线程发散的位置和将显著影响性能的位置中的至少一者处在运 行时(也被称作"绑定时间")将发散栅栏指令插入到核心20的指令中。
[0054]很可能发散的代码的一个实例可为光线跟踪应用程序的代码,所述代码包含于下 文中。在此实例中,发散栅栏指令(例如由编译程序或用户)插入以在执行后续光线跟踪伪 代码时降低发散:
[0056]以上伪代码为GPU 12的多个线程和线程束可执行的循环的实例。每一线程可(例 如)基于在光线跟踪场景中光线生成的反射的数目执行循环不同次数。因此,一些线程可在 执行循环的几个迭代之后结束,而其它线程可继续执行环路最多环路的三十个迭代。
[0057]在此实例中,GPU 12在每一循环迭代期间执行发散栅栏指令。发散栅栏指令包含 GPU利用循环每一迭代评估的布尔表达式。如果对于线程束的至少一个线程布尔表达式评 估为真,那么GPU 12仅执行与发散栅栏指令相关联的操作,例如线程束排序和线程压缩。在 此实例中,布尔表达式i% 10==0在循环的每第十迭代期间评估为真。当对于线程束的一 个线程布尔表达式为真时,GPU 12可调换来自不同线程束的线程以形成具有更多活动线程 的新线程束,过程被称作"线程压缩"。
[0058]每当与一个线程束线程的发散栅栏相关联的布尔表达式评估为真,GPU 12将与线 程相关联的线程束(例如,线程束40)放入到队列或缓冲器中。一旦线程束被放入到队列中, GPU 12阻止线程束执行,且将队列中的线程束40排序。
[0059]图3中极详细地说明基于每一线程束的活动线程的数目将线程束排序。GPU 12可 基于每一线程束中的活动线程的数目,使用插入排序将线程束中的每一者排序。GPU 12将 线程束排序使得具有更多活动线程的线程束经排序队列的前部,且具有较少活动线程的线 程束经排序在队列的后部。
[0060] 当线程束添加到队列中或在不在栅栏处暂停的情况下完成之后,GPU 12随后对队 列中的线程束执行线程压缩,即将来自具有较大数目的活动线程的线程束的非活动线程与 具有较大数目的线程中的较小数目的线程束调换。GPU 12继续将来自具有较大数目的线程 的线程束的线程与具有较小数目的活动线程的线程束调换,直到GPU 12无法产生"非活动" 线程束为止。非活动线程束为具有全部非活动线程的线程束。当将非活动线程数据与活动 线程调换时,GPU 12还可调换每线程上下文数据48(若存在)。一旦具有全部活动线程的"完 全活动线程束"通过调换线程而产生,GPU 12将完全活动线程束从队列移除,且将其状态设 定为活动及利用当前指令恢复执行完全活动线程束。在GPU 12结束线程压缩之后,包含部 分活动线程束和完全非活动线程束的全部线程束被设定为就绪或活动状态。部分活动线程 束还利用当前指令恢复。完全非活动线程可快进到当前控制流块的末端,其如果无指令遵 循当前控制块,那么完全非活动线程束可立即结束执行。关于图4极详细地说明调换线程束 当中的线程的过程。
[0061] 在一些实例中,为将活动线程与非活动线程调换,GPU 12可将非活动线程和活动 线程所储存的寄存器数据存储在寄存器调换缓冲器52中。GPU 12随后将以前非活动线程的 寄存器数据存储在以前活动线程的对应寄存器中。GPU 12还使用多路复用器54("MUX 54") 将以前活动线程的寄存器数据存储在以前非活动线程的对应寄存器中。更确切地说,对于 与每一线程相关联的每一寄存器,多路复用器54( "MUX 54")在所储存的非活动和活动线程 的寄存器值之间多路复用,且存储返回至待调换的线程束的寄存器堆的值。在调换过程期 间,DBS 50还可调换来自第一和第二线程束的每线程上下文数据48。在一些实例中,GPU 12 可不利用寄存器调换缓冲器52来调换数据。而是,GPU 12可并行调换寄存器值而非将值存 储在缓冲器中。
[0062]在一些实例中,每一线程束可指与特定线程(被称作使用寄存器指针的"库")相关 联的一组寄存器46XPU 12可存储指针的映射表。表的每一行或列可对应于特定线程束,且 对应于线程束(视表布局而定)的行或列内的每一条目可存储将特定线程映射到寄存器46 内的寄存器库的指针值。GPU 12可将指针的映射存储到用于上下文数据48中线程束的线程 的寄存器库。在一些实例中,如果寄存器46由每线程寄存器库指针引用,那么GPU 12可通过 简言调换两个线程的每线程寄存器库指针值,而非使用寄存器调换缓冲器52和mux 54调换 两个线程的对应寄存器值中的每一者来调换每线程寄存器数据。
[0063]在一些实例中,执行核心可频繁访问GPU 12的(例如)全局存储器和/或系统存储 器14,或执行具有高量存取时间或时延的其它操作。在此情况下,包含发散栅栏操作的栅栏 操作可暂停过于线程束以隐藏这些长时延操作,且执行性能可受损。为加速具有长
当前第3页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1