Gpu发散栅栏的制作方法

文档序号:9816368阅读:579来源:国知局
Gpu发散栅栏的制作方法
【技术领域】
[0001] 本发明涉及图形处理,且更确切地说,涉及用于管理执行图形处理单元(GPU)上的 线程的技术。
【背景技术】
[0002] 最近,已存在一种朝向所谓的通用GPU(GPGPU)的转变。不同于执行图形渲染的传 统GPU,GPGPU可经配置以执行通常被称作"核心"的通用任务或程序。一些类型的任务可更 好地适合于特定类型的处理器,例如中央处理单元(CPU)或GPUXPU可更好地适合于具有更 多分支、跳转和条件性逻辑的任务,而GPU可适合于高度平行任务及/或具有多个浮点计算 的任务。由于多个GPU具有SMD硬件架构,因此GPU还可包含执行SMD(单指令多数据)指令 的能力。当GHJ执行S頂D指令时,GPU可对多个数据值执行由指令指示的同一操作。通常,GPU 具有多个执行单元,所述多个执行单元能够并行执行由SIMD指令指示的操作。

【发明内容】

[0003] 本发明的技术提供用于降低执行于图形处理单元(GPU)上的线程当中的发散的技 术。GPU可包括支持被称作"发散栅栏"指令的指令。发散栅栏指令尝试将来自多个线程束的 发散线程分组到新线程束中,使得线程执行同一指令,进而改善GPU性能。
[0004] 在一个实例中,本发明描述一种方法,所述方法包括:为多个线程束中的每一线程 束确定对于每一线程束的对应线程布尔表达式是否为真;暂停执行具有对于其表达式为真 的对应线程的每一线程束;确定对于其表达式为真的多个线程束中的每一者的活动线程的 数目;基于多个线程束中的每一者的活动线程的数目将对于其表达式为真的多个线程束排 序;将多个线程束的第一线程束的活动线程的线程数据与多个线程束的第二线程束的非活 动线程的线程数据调换;以及恢复执行对于其表达式为真的多个线程束中的至少一者。
[0005] 在另一实例中,本发明描述一种包含存储器和至少一个可编程处理器的装置,所 述至少一个可编程处理器经配置以:为多个线程束中的每一线程束确定对于每一线程束的 对应线程布尔表达式是否为真;暂停执行具有对于其表达式为真的对应线程的每一线程 束;确定对于其表达式为真的多个线程束中的每一者的活动线程的数目;基于多个线程束 中的每一者中的活动线程的数目将对于其表达式为真的多个线程束排序;将多个线程束的 第一线程束的活动线程的线程数据与多个线程束的第二线程束的非活动线程的线程数据 调换;以及恢复执行对于其表达式为真的多个线程束中的至少一者。
[0006] 在另一实例中,本发明描述一种设备,所述设备包含:用于为多个线程束中的每一 线程束确定对于每一线程束的对应线程布尔表达式是否为真的装置;用于暂停执行具有对 于其表达式为真的对应线程的每一线程束的装置;用于确定对于其表达式为真的多个线程 束中的每一者的活动线程的数目的装置;用于基于多个线程束中的每一者中的活动线程的 数目将对于其表达式为真的多个线程束排序的装置;用于将多个线程束的第一线程束的活 动线程的线程数据与多个线程束的第二线程束的非活动线程的线程数据调换的装置;用于 恢复执行对于其表达式为真的多个线程束中的至少一者的装置。
[0007] 在另一实例中,本发明描述一种存储指令的非暂时性电脑可读储存媒体,当所述 指令执行时,使至少一个可编程处理器进行以下操作:为对于其表达式为真的多个线程束 中的每一线程束确定多个发散栅栏中的相关联发散栅栏;基于每一线程束的相关联发散栅 栏将多个线程束中的每一线程束分组到多个压缩池中,其中使至少一处理器将多个线程束 排序的指令包括至少一处理器将属于多个压缩池中的同一者的多个线程束排序的指令,其 中第一线程束和第二线程束属于多个压缩池中的同一者,且其中使至少一处理器恢复执行 对于其条件为真的多个线程束中的至少一者包括恢复执行同一个压缩池的至少一个线程 束。
[0008] 在附图及以下描述中阐述本发明的一或多个实例的细节。本发明的其它特征、目 标和优点将从所述描述和图式以及权利要求书而显而易见。
【附图说明】
[0009] 图1为说明根据本发明的技术的可支持GPU发散栅栏指令的执行的实例计算装置 的框图。
[0010] 图2为说明根据本发明的技术的在多个处理元件上执行的线程束的框图。
[0011] 图3为说明根据本发明的技术的基于每一线程束内的活动线程的数目将线程束排 序的概念图。
[0012] 图4为说明用于将来自一个线程束的活动线程与来自另一线程束的非活动线程调 换的技术的概念图。
[0013] 图5为说明根据本发明的技术的用于处置多个发散栅栏指令的技术的概念图。 [0014]图6为说明根据本发明的技术的用于执行发散栅栏指令的技术的流程图。
【具体实施方式】
[0015] 本发明涉及用于减少执行在图形处理单元(GPU)上的线程的发散的技术。GPU可包 括被称作处理元件(PE)的多个执行单元。被称作"核心"的程序可在GPU的一或多个PE上执 行。应用程序可将核心划分到多个线程中,所述线程构成GPU的工作的基础单元。GPU调度器 可进一步将线程一起分组到被称作"线程束"的线程群组中。线程束可包含一些图形架构中 的某一数目的线程(例如,32个线程)。
[0016] GPU的驱动程序或调度器产生线程以执行GPU上的核心。线程为GPU上待处理的数 据的基础单元,且不应与CPU线程混淆。调度器可将每一线程指派到GPU的执行单元。执行单 元(也被称作处理元件("PE")或着色器)为能够对多个数据值并行执行同一指令的SMD单 J L· 〇
[0017] -般来说,线程束的每一线程执行同一指令。程序计数器(PC)存储每一线程将执 行的指令的存储器地址。一般来说,对于线程束的线程中的每一者可存在单一 PC。对于每一 线程束具有单一 PC允许线程中的每一者同时执行,只要线程中的每一者不需要执行不同指 令。
[0018] 多个GPU现在包括用以执行流控制指令(例如,用以执行分支、跳转、转至)和其它 流控制指令的能力。流控制指令可以多种方式更改程序执行的流。在不具有流控制指令的 程序或核心中,PE可从头到尾地执行核心的指令。在PE结束执行指令之后,GPU将PC的值设 定为存储器中的下一个指令的地址(通常通过逐一增加 PC值),且PE执行下一个指令。执行 程序的过程以此方式继续执行不具有流控制指令的程序,直到程序到达退出点为止,在所 述点处执行终止。
[0019] 执行流控制指令可使PE执行除递增PC值以外的地址处的后续指令。而非执行递增 PC值的地址处的后续指令,执行流控制指令的PE可执行具有不同PC地址(例如子例程的地 址等)的后续指令。因此,据称流控制指令更改程序的执行"流"。
[0020] 流控制指令的实例包括子例程调用、分支、返回、跳跃等。在不同实例中,PE跳转到 的指令地址(即经指派至PC的地址)可基于运行时处在线程之间变化的数据的值。流控制指 令还可与每一 PE分别评估的布尔表达式相关联。布尔表达式为产生评估真或假的布尔值的 表达式。布尔表达式可包含布尔运算符,例如"且"、"或"、"非"、"异或(X0R)"等。布尔表达式 还可包含运算检验,例如大于、小于、等于、不等于、大于或等于、小于或等于等。布尔表达式 的真值或假值可取决于随一个线程到另一线程而不同的数据或值。
[0021] 因此,有可能一个线程跳转到,且执行不同于同一线程束内的另一线程的指令。然 而,如上所述,对于线程序仅存在一个PC。其中线程束的两个或两个以上线程执行不同指令 的条件被称作"发散"。当发散出现时,线程的一些组可持续执行同一指令。然而,还可存在 执行不同指令的多组线程。
[0022]作为线程发散的实例,线程束的第一线程和第二线程可执行流控制指令,例如 "if-else"语句或循环语句。第一线程执行的后续指令可基于存储于第一线程的寄存器中 的数据的值。类似地,第二线程的后续指令可基于存储于第二线程的寄存器中的数据的值。 如果第一和第二线程具有不同寄存器数据,那么第一和第二线程可跳转到与不同指令地址 相关联的不同后续指令。
[0023]在线程束线程发散的情况下,线程可采用控制流块的不同分支,例如"if-else"语 句。在循环语句的情况下,线程束线程还可在不同时间(例如,在执行不同数目的循环的迭 代之后)退出循环语句。
[0024] 当线程束线程(例如)由于采用if-else语句的不同分支或执行不同数目的循环的 迭代而变得发散时,GPU使由发散导致的不同执行路径中的每一者序列化。也就是说,GPU确 定"活动"的线程且正在执行同一指令。活动线程继续在与每一线程相关联的PE上执行,直 到线程结束执行或到达栅栏(例如下文将极详细地的论述的发散栅栏指令)为止。
[0025] 在序列化期间,GPU还确定当前不执行的线程,且将那些非活动线程及其相关联的 PE设定为空闲。当PE设定为空闲时,非活动线程不执行,此损害GPU性能。在一些情况下,发 散线程可进一步发散,即可存在多个"层级"或"嵌套式发散"。为处置嵌套式发散,GPU使用 收敛堆栈来追踪嵌套式分支和循环。GPU首先处置最深或最内层的发散,且执行具有最深层 级的发散,直到执行结束或暂停为止。GPU随后将所述层级的发散从收敛堆栈移除,且重复 执行收敛堆栈上的最内部的其余线程的过程,且将结束的线程从收敛堆栈移除。一旦线程 结束执行分支或循环,GPU可将线程重组或收敛回在一起,以形成不再发散的线程束。
[0026] 本发明的技术介绍GPU可支持的被称作"发散栅栏"的指令。在不同实例中,应用软 件编程接口(API)可包含支持发散栅栏指令。此类API可包含开放计算语言(OpenCL)、开放 图形语言(OpenGL)和微软DirectX API。当编程具有特定API的GPU时,编程器可在发散很可 能显著影响性能的代码点处插入使GPU执行发散栅栏指令的发散栅栏函数调用。GPU驱动程 序或编译程序还可自动检测发散很可能显著影响性能的代码点,且可在那些
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1