批量同步图形处理单元编程的制作方法

文档序号:6594641阅读:222来源:国知局
专利名称:批量同步图形处理单元编程的制作方法
批量同步图形处理单元编程背景当代商品图形硬件用中等成本提供了强大的原料处理能力。然而,对GPU进行编 程用于通用计算是相对困难的。这部分地是因为现有的通用GPU编程语言基于流处理模 型,因为GPU是流处理器;这些语言包括Brook、Sh和NVIDIA公司的CUDA。流处理是以数据为中心的模型,其中数据被组织成元素的同类流。将调用个体函 数的内核并行地应用于输入流的所有元素来产生输出流。通过在多个流上启动多个内核来 实现复杂计算。这种流/内核抽象显式地暴露出底层数据依赖性。然而,虽然提供高性能,但出于多个原因,流处理模型使得通用GPU编程很困难。 其一,程序可读性和维护是一个大问题,因为根据数据依赖性而非功能来将程序分区到各 内核中。将新的功能添加到现有程序通常涉及重写代码的许多不相关的部分。其二,由于 中间或临时流的广泛使用,复杂应用中的数据流几乎不与低层程序逻辑有关。显式数据流 管理因此是乏味的且易于出错的。编程困难的另一原因在于并行原语的抽象是困难的,这妨碍了代码重用。更具体 地,许多并行原语,诸如scan和sort,需要多个内核启动。当内核调用这种原语时,需要将 原语的一部分与调用器进行捆绑来减小中间流尺寸和内核启动成本。结果是完整性被破坏 的原语,这使得原语的抽象变得困难。因为以上的问题,使用如今的GPU编程语言来编写即使中等复杂的通用程序也是 极度困难的。对GPU可编程性的任何改进因此是高度需要的。概述提供本概述以便以简化形式介绍将在以下的详细描述中进一步描述的一些代表 性概念。本概述不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在以限制 所要求保护的主题的范围的任何方式来使用。简言之,此处描述的主题的各方面涉及提供和便于对用于图形处理单元(GPU)上 的通用计算的编程语言的使用的技术。对批量同步GPU编程(BSGP)程序,诸如系统的一部 分进行编程来包括壁垒(barrier)来描述GPU上的并行处理。在一个方面,BSGP编译器检测对应于超级步(superst印)的壁垒,基于壁垒将 BSGP程序转换成内核,并对其进行组合。在编译期间,编译器对齐语句中的壁垒,并将相应 的超级步捆绑在一起以便代码重用。提供par构造来允许程序员例如通过指定独立语句块 来控制捆绑的各方面。在一个方面,提供了线程操纵仿真来用操作fork(分叉)和kill (销毁)来透明 地模拟线程创建和销毁。还提供了用于线程之间的高效通信的远程变量访问内部函数和集 体原语操作。结合附图阅读以下详细描述,本发明的其他优点会变得显而易见。附图简述作为示例而非限制,在附图中示出了本发明,附图中相同的附图标记指示相同或 相似的元素,附图中


图1是表示编译器自动地将BSGP程序转换成流内核并为GPU执行生成管理代码 的计算(编程/编译和/或运行时环境)中的示例组件的框图。图2A是示出线程之间的壁垒操作的构造的表示。图2B是示出线程之间的集体操作的构造的表示。图3A是流编程模型中的源代码重用的表示。图;3B是批量同步编程模型中的源代码重用的表示。图4是示出编译BSGP程序所采用的示例步骤的流程图。图5A-5C是用于便于临时流优化的最小流的图形构建的表示。图6示出了表示壁垒对齐和合并的par构造的表示。详细描述此处描述的技术的各方面一般涉及用于GPU上的通用计算的新的GPU编程语言, 此处被称为BSGP (批量同步GPU编程)。BSGP基于批量同步并行(BSP)模型,该模型是从 低层程序结构中抽象以支持超级步(superst印)的并行编程模型。BSGP程序因此包括超级 步的顺序集,其中每一超级步由多个线程完全并行地执行。如此处所使用的,在每一超级步 的结尾处执行壁垒同步来确保按照相对于彼此的顺序次序来执行各步骤。如将理解的,BSGP容易阅读、编写和维护。例如,BSGP程序看上去与顺序C++代码 相似,只需要某些附加的额外信息来描述GPU上的并行处理。这是因为不像流处理中的内 核,超级步不是具有显式指定的输入和输出参数的个体函数,而是类似于传统顺序编程中 的语句,并且是在语义上推断的而非在语法上实施的。BSGP的另一优势在于其数据依赖性是隐式地定义的,因为局部变量是可见的并且 可以跨超级步共享。将程序员从流编程中的乏味的时间数据流管理中解脱出来。此外,有 了 BSGP,诸如reduce (缩减)、SCan (扫描)和sort (排序)的并行原语可以作为整体在单 个语句中被调用,使得原语的抽象变得简单并因此便于代码重用。如将进一步理解的,BSGP通过透明地仿真一组线程操纵特征来提供线程操纵仿 真,具体地,通过包括fork和kill的操作来仿真线程拆分和析构。还提供了包括reduce、 scan和sort的高效原语操作库。还描述了高效地将BSP映射到GPU的语言构造,包括要求 块和并行块,来帮助克服关于BSP和GPU的若干不兼容问题。虽然此处描述的某些示例涉及各种代码清单,但可以理解这些是非限制性的示 例。类似地,虽然在类似CUDA的环境中描述编译器,但这只是一个合适的环境。如此,本发 明不限于此处所描述的任何特定实施例、方面、概念、结构、功能或示例。相反,此处所描述 的实施例、方面、概念、结构、功能或示例中的任一个都是非限制性的,并且本发明一般能够 以在计算和GPU编程方面提供好处和优点的各种方式来使用。转向附图,描述了 BSGP,S卩,容易阅读、编写和维护的用于GPU上的通用计算的一 种编程语言。有了 BSGP,程序员只需要向程序102提供少量的额外信息,在此处被称为壁 垒,来描述GPU 104上的并行处理。BSGP编译器108自动地将两个壁垒之间的语句推断为 超级步并将其转换成GPU内核Ioe1-Ioen,如图ι所示。每一超级步因此由多个线程并行地 执行,其中壁垒同步对超级步进行定界来确保正确的并行执行。图1还示出编译器所产生 的数据流管理代码110。对于编译,BSGP编程模型不直接匹配GPU的流处理体系结构,因此编译器108需要将BSGP程序转换为高效的流程序。为了构建编译器108,需要考虑壁垒同步,因为虽然可以 使用粗粒度化的并行体系结构的硬件同步来直接实现壁垒,但这在流环境中是不可能的。 在GPU的流环境中,常常创建比可以同时在物理处理单元上执行的线程更多的数量级。线 程被动态地分布到可用的处理单元以执行。在完成之后回收类似用于保存线程上下文的寄 存器之类的资源。物理处理单元的同步不影响非执行的线程,并因此不等价于线程的(逻 辑)壁垒。等待所有线程完成可用作有效壁垒,但这使得线程上下文被析构。为了解决这 个问题,编译器108自动地添加上下文保存代码来使得壁垒符合BSGP语义,如以下所描述 的。另一个与编译器相关的问题是生成高效的流代码。因为局部变量是可见的并且跨 BSGP程序中的超级步共享,所以编译器108分析超级步之间的数据依赖性并自动地分配临 时流来在超级步的结尾处保存局部变量值,将这些临时流传递给后续超级步。为了减少临 时流的总数以便高效使用GPU上可用的(有限)视频存储器,此处描述了一种图优化方案。 作为超级步的顺序组织的结果,可以用多项式时间来获得最优解决方案。转向BSGP对流处理的考虑,BSGP和流处理之间的一个差别在于BSGP和流处理是 不同形式的SPMD(单程序多数据)处理,其中多个线程并行地执行同一个程序。线程的总 数被称为线程大小。每一线程被赋予一个等级,例如从0到size-Ι (大小-1)的唯一整数, 这个数字将该线程与其他线程区分开来。壁垒是用SPMD编程的一种同步的形式。当到达壁垒时,阻塞执行直到所有线程到 达同一个壁垒,如图2A中的壁垒222概括地表示的那样,图中的壁垒使得线程0和线程2 等待直到线程1完成其工作负荷。在流处理中,等待内核启动到终止只是壁垒的一种形式 (注意,内核启动传统地在GPU编程中被称为pass)。虽然具有CUDA能力的硬件支持局部 同步,但一般不能在一个内核中实现所有线程的壁垒。另一方面是集体操作,包括必须由所有线程同时执行的操作。在SPMD编程中,集 体操作在语法上与普通顺序操作相似,除了集体操作在语义上在所有线程上操作。一个线 程的输入可能影响其他线程的输出。例如,考虑图2B,其中集体前置和可以被定义为scan (X),收集线程(线程0、线程 1和线程幻中的χ的值来形成向量。在壁垒同步之后,如图2B中的虚线所表示的,使用该 向量来计算前置和。随后将前置和结果重新分发给每一线程的X,代码执行继续。典型的集 体操作在内部需要壁垒并因此在流编程中相对稀少。作为源代码示例,考虑求解以下问题给定三角形网格的连接,为每一顶点计算一 环(one-ring)邻接三角形的列表。网格含有m个顶点和η个三角形。连接被赋予范围从 0到m-1的3η个整数的数组,其中每三个连续的整数表示三角形的三个顶点索引。用于求解该问题的示例BSGP源代码基于排序算法。更具体地,以上问题通过排序 来求解,其中每一三角形被一式三份并与其三个顶点相关联。将相关联的顶点索引用作排 序键来对一式三份的三角形进行排序。在排序之后,共享同一个顶点的三角形被分组在一 起来创建所有顶点的邻接三角形的串接列表。随后将每一排序键与其前任进行比较来计算 指向每一顶点列表的开始位置的指针。清单1寻找邻接三角形(BSGP版本)
权利要求
1.一种在计算环境中的方法,包括检测批量同步程序中的壁垒(102),每一壁垒定界超级步;以及将所述超级步编译(108)成供图形处理单元(104)执行的流代码内核(Ioe1-Ioen)。
2.如权利要求1所述的方法,其特征在于,编译所述超级步包括在每一壁垒处添加保 存线程上下文的代码。
3.如权利要求1所述的方法,其特征在于,所述编译还包括使用分配的临时流组合所 述内核中的至少一些。
4.如权利要求3所述的方法,其特征在于,使用分配的临时流包括采用图优化方案。
5.如权利要求1所述的方法,其特征在于,还包括提供将线程的总数用作参数来执行 GPU代码块的spaWn语句。
6.如权利要求1所述的方法,其特征在于,还包括提供用于将控制处理器代码插入包 含超级步的require构造,所述require构造用于在启动所述包含超级步之前执行所述控 制处理器代码。
7.如权利要求1所述的方法,其特征在于,还包括提供在所述批量同步程序中使用来 指定独立的语句块的par构造。
8.如权利要求1所述的方法,其特征在于,还包括提供在所述批量同步程序中使用的 一组原语,包括提供数据并行原语、等级调整原语、或线程操纵原语,或数据并行原语、等级 调整原语或线程操纵原语的任意组合。
9.如权利要求8所述的方法,其特征在于,提供所述一组原语包括提供reduce原语, scan 原语,compact 原语,split 原语或 sort 原语,或 reduce、scan、compact、split 或 sort 原语的任意组合。
10.如权利要求8所述的方法,其特征在于,提供一组原语包括提供用于拆分线程的原 语、用于对线程排序的原语,或用于拆分线程的原语和用于对线程排序的原语两者。
11.如权利要求8所述的方法,其特征在于,提供一组原语包括提供用于销毁线程的原 语、用于分叉线程的原语,或用于销毁线程的原语和用于分叉线程的原语两者。
12.如权利要求1所述的方法,其特征在于,编译所述超级步包括内联对包含壁垒的 函数的调用,执行优化来降低数据依赖性,将CPU代码和GPU代码分开并生成内核和内核启 动代码,将对CPU变量的引用转换为内核参数,寻找在定义超级步外部使用的值并生成保 存和加载这些值的代码,以及生成临时流分配。
13.—种在计算环境中的系统,包括编译器(108),所述编译器(108)基于壁垒同步来 将包括语句、构造和原语的源代码处理成流内核(Ioe1-Ioen),并且将所述内核组合成能被 配置成供图形处理单元(104)执行的代码。
14.如权利要求13所述的系统,其特征在于,所述语句中的一个包括用于在所述源代 码中定界超级步的barrier语句,并且所述构造中的一个包括用于在所述源代码中将控制 处理器代码插入包含超级步中的require构造,所述编译器编译所述源代码以便在启动对 应于所述包含超级步的指令之前执行对应于所述控制处理器代码的指令。
15.如权利要求13所述的系统,其特征在于,所述原语包括reduce原语,scan原语, compact原语,split原语或sort原语,用于拆分线程的原语,用于对线程排序的原语,用于 销毁线程的原语或用于分叉线程的原语,或reduce原语、scan原语、compact原语、split原语或sort原语、用于拆分线程的原语、用于对线程排序的原语、用于销毁线程的原语或 用于分叉线程的原语的任意组合。
全文摘要
描述了计算环境中的一种技术,该技术包括用于图形处理单元(GPU)上的通用计算的编程语言以及相关联的编译器。对批量同步GPU编程(BSGP)程序进行编程以包括壁垒来描述GPU上的并行处理。BSGP编译器检测响应于超级步(superstep)的壁垒(barrier),将BSGP程序转换成基于壁垒的内核,并将其进行组合。在编译期间,编译器对齐语句中的壁垒并将相应的超级步捆绑在一起。提供par构造来允许程序员例如通过指定块独立语句来控制捆绑的各方面。提供了线程操纵仿真来透明地用操作fork(叉分)和kill(销毁)仿真线程创建和销毁。还提供了用于线程之间的高效通信的远程变量访问内部函数以及集体原语操作。
文档编号G06F9/38GK102132249SQ200980134286
公开日2011年7月20日 申请日期2009年6月26日 优先权日2008年6月26日
发明者B·郭, H·齐明, K·周 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1