绑定数据并行设备源代码的制作方法

文档序号:6427779阅读:123来源:国知局
专利名称:绑定数据并行设备源代码的制作方法
技术领域
本发明涉及编译环境。
背景技术
计算机系统常常包括一个或多个中央处理单元(CPU)以及一个或多个数据并行设备(例如图形处理单元(GPU))。CPU和数据并行设备通常使用由其相应的架构定义的不同指令集来运行,使得CPU指令可能不能在数据并行设备上执行并且反之亦然。CPU通常执行计算机系统上的所有通用处理,并且数据并行设备通常执行计算机系统上的数据并行处理(例如图形处理)。由于其不同的指令集和函数,CPU和数据并行设备常常使用不同的高级编程语言来编程。例如,CPU可以使用诸如C或C++之类的通用编程语言来编程,并且诸如图形处理单元(GPU)之类的数据并行设备可以使用诸如HLSL、GLSL或Cg之类的数据并行设备编程语言来编程。然而,数据并行设备编程语言常常具有在CPU编程语言中未发现的限制。这些限制源自数据并行设备在计算机系统上执行程序方面对CPU所起的作用。随着数据并行设备的作用由于数据并行处理能力的增强而增加,所期望的将是增强编程人员对数据并行设备进行编程的能力。

发明内容
提供本发明内容是为了以简化的形式介绍将在以下具体实施方式
中进一步描述的一些概念。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。在计算机系统中提供一种编译环境,该编译环境允许编程人员使用具有数据并行 (DP)扩展的高级通用编程语言来对CPU和数据并行设备(例如GPU) 二者进行编程。一种编译过程使用一组绑定描述符将以该通用语言编写的模块化DP代码翻译成以高级DP设备编程语言的DP设备源代码。绑定器从该组绑定描述符中生成单个自包含的DP设备源代码单元。DP设备编译器从该DP设备源代码单元中生成供在一个或多个数据并行设备上执行的DP设备可执行代码。


包括、合并在本发明书内并构成其一部分的附图提供了对各实施例的进一步理解。附图示出各实施例,并且与说明书一起用于解释本发明的原理。其他实施例和各实施例的许多预期优点将随着参考下面的详细描述进行更好的理解而得到认识。附图的元素不一定相对于彼此是比例正确的。相同的附图标记指代对应的类似部分。图1是示出了计算机系统中的编译环境的实施例的框图。图2是示出了绑定描述符的实施例的框图。图3是示出了由编译器执行的方法的实施例的流程图。
图4A-4B是示出了生成绑定描述符的示例的框图;图5是示出了由绑定器执行的方法的实施例的流程图。图6是示出了被配置为实施编译环境的计算机系统的实施例的框图。图7是示出了具有被配置为执行DP设备可执行代码的数据并行设备的计算机系统的实施例的框图。
具体实施例方式在以下详细描述中,对附图进行了参考,附图构成了实施例的一部分且在其中作为示例示出了可在其中实践本发明的各特定实施例。就此,诸如“顶部”、“底部”、“前方”、 “后方”、“前导”、“尾部”等的方向性术语参考所描述的附图的取向来使用。因为各实施例的各组件可以被定位为多个不同的取向,所以方向性术语出于说明的目的来使用而不是限制。可以理解,可以使用其它实施例并且可以做出结构上或逻辑上的改变而不背离本发明的范围。因此,以下详细描述并不旨在限制,并且本发明的范围由所附权利要求来限定。应该理解,此处描述的各示例性实施例的特征可相互组合,除非另外具体注明。图1是示出了诸如计算机系统100之类的计算机系统中的编译环境10的实施例的框图,该计算机系统在图6中予以示出并且在下面更详细地描述,其中该计算机系统执行指令以将具有数据并行(DP)部分14的通用(GP)代码12 (后面称为GP代码1 编译成包括DP设备可执行代码40的通用(GP)可执行代码32。编译环境10响应于具有数据并行扩展的通用(GP)编译器20的调用而被生成以编译GP代码12的所有或所选模块。例如, 该调用可以由编程人员或计算机系统的其他用户或者计算机系统中的其他代码生成。GP可执行代码32表示旨在供在一个或多个处理器(例如中央处理单元(CPU))上执行的程序。GP可执行代码32包括来自一个或多个中央处理单元(CPU)的指令集的低级指令。GP可执行代码32还可以包括一个或多个DP设备可执行代码40。DP设备可执行代码40表示旨在供在一个或多个诸如图7中所示的DP设备210之类并且下面将予以更详细描述的数据并行(DP)设备上执行的数据并行程序(例如着色器)。DP设备通常是图形处理单元(GPU)、或者CPU的矢量执行核,但是在一些实施例中也可以包括CPU的标量执行核或者其他合适的设备。DP设备可执行代码40可以包括DP字节代码,该DP字节代码使用设备驱动程序(未示出)被从DP设备的指令集转换成低级指令。DP设备可执行代码40还可以包括来自一个或多个DP设备的指令集的低级指令。因此,GP可执行代码32可以直接由一个或多个中央处理单元(CPU)执行,并且包含的DP设备可执行代码40要么可以由一个或多个DP设备直接执行,要么可以在转换成DP设备的低级指令以后由一个或多个DP设备执行。GP代码12包括具有数据并行扩展的高级通用编程语言(之后称为GP语言)的指令序列,所述数据并行扩展形成存储在一个或多个模块的集合中的程序。GP语言允许程序被编写为不同部分(即模块),使得每个模块都可以存储在可以由计算机系统访问的单独的文件中或者位置处。GP语言提供用于对包括一个或多个通用CPU和一个或多个专用DP 设备的计算环境进行编程的单个语言。使用GP语言,编程人员可以将CPU和DP设备代码二者包括在GP代码12中以分别供CPU和DP设备执行,并且协调CPU和DP设备代码的执行。GP代码12可以表示任何合适类型的代码、比如应用、二进制函数或操作系统服务。
在一个实施例中,可以通过将诸如C或C++之类的广泛适用的高级和通用编程语言扩展为包括数据并行特性来形成GP语言。GP语言包括丰富的链接能力,所述链接能力允许代码的不同部分被包括在如图1中用GP代码12示出的不同模块中。所述数据并行特性提供如下编程工具该编程工具利用DP设备的专用架构来允许数据并行操作比CPU更快或更有效地被执行。在其他实施例中,GP语言可以是允许编程人员针对CPU和DP设备二者进行编程的另一合适的高级通用编程语言。GP代码12包括具有指定供在DP设备上执行的代码的一个或多个模块中的一个或多个部分14。在一个实施例中,GP语言允许编程人员在定义内核函数(亦称矢量函数)时使用注释16 (例如_declspec (vector) ···)来指定GP代码12的一部分14作为DP设备代码。注释16与旨在供在DP设备上执行的内核函数的函数名17(例如kernelfimc)相关联。代码部分14还可以包括对内核函数(例如forall. . . , kernel_func,...)的一个或多个调用18。内核函数可以调用GP代码12中的其他内核函数(即其他DP设备代码),并且可以使用由GP代码12定义的类型(例如类或结构体)。这些类型可以或可以不被注释成 DP设备代码。在其他实施例中,可以使用其他合适的编程语言构造来指定GP代码12的部分14作为DP设备代码和/或CPU代码。编译环境10包括GP编译器20和链接器30。GP编译器20被配置为编译GP代码 12,其中GP代码12是以GP语言编写的,被存储在一个或多个模块中并且包括CPU代码和 DP设备代码二者。GP编译器20可以通过如下方式来形成将诸如C或C++编译器之类的广泛适用的高级和通用编程语言编译器的编译器功能扩展为具有编译GP代码12中的CPU 代码和DP设备代码二者的能力。针对GP代码12中的CPU代码,GP编译器20将具有CPU代码的一个或多个模块编译成一个或多个对象或中间表示(IR)文件22,所述对象或中间表示文件具有标识出一个或多个对象或顶文件22之间的关系的符号。链接器30接收对象或文件22,并且将对象或文件22组合成GP可执行代码32并且解析一个或多个对象或顶文件22之间的符号。 GP可执行代码32包括来自由CPU定义的指令集的低级指令。因此,GP可执行代码32可以由实现该指令集的一个或多个CPU直接执行。针对GP代码12的部分14中的DP设备代码,GP编译器20和链接器30以高级数据并行(DP)设备语言为GP代码12中的每个部分14中的每个调用18组合生成单个自包含的DP设备源代码单元36 (例如文件或字符串)。链接器30将每个DP设备源代码单元 36提供给DP设备编译器38。DP设备编译器38被配置为编译以诸如HLSL(高级着色器语言)之类的高级DP设备编程语言编写的代码、而不是以GP代码12的GP语言编写的代码。 在一个实施例中,GP编译器20将部分14从GP语言翻译成高级DP设备编程语言以供之后被链接器30中的绑定器34包括在DP设备源代码单元36中。在另一实施例中,GP编译器 20将部分14从GP语言翻译成中间表示(IR)并且绑定器34将顶翻译成高级DP设备编程语言以供包括在DP设备源代码单元36中。另外,DP设备编译器38包括有限的链接能力或不包括链接能力。为了与DP设备编译器38的该单模块模式一起运行,GP编译器20和链接器30为每个调用18生成DP设备源代码单元36,该DP设备源代码单元36为完全自包含的、即包括源自GP代码12的部分 14中的相应调用18的内核函数和类型的所有DP设备源代码。
具体而言,GP编译器20分开地将每个调用18、内核函数和类型在一组绑定描述符 24中与其他绑定信息一起翻译成DP中间代码(即DP设备源代码或IR)。链接器30包括绑定器34,该绑定器34通过如下方式将来自该组绑定描述符M的DP中间代码绑定到DP 设备源代码单元36中遍历来源于调用18并且由该组绑定描述符M形成的调用图;将DP 中间代码翻译成DP设备源代码(如果需要);以及串接来自该组绑定描述符M WDP设备源代码。绑定器34的函数可以在所有需要的DP中间代码都可用的情况下由绑定器34静态地执行,或者在运行时间动态地执行。DP设备编译器38将具有高级指令的每个DP设备源代码单元36从高级DP设备语言编译成相应的DP设备可执行代码40,该DP设备可执行代码40具有来自DP设备的旨在供在DP设备上执行的指令集的字节代码或低级指令。尽管在图1的实施例中是与GP编译器20和链接器30分开地示出的,但是DP设备编译器38在其他实施例中可以被包括在GP编译器20、链接器30或绑定器34中。图2是示出了绑定描述符M的实施例的框图。GP编译器20为来自调用18的每个调用、函数和类型生成绑定描述符对。绑定描述符M包括名称24A,该名称24A存储相应调用、函数或类型的唯一名称;类型MB,该类型24B指示绑定描述符对是声明绑定描述符、定义绑定描述符还是调用存根绑定描述符;针对相应调用、函数或类型的DP中间代码 MC ;以及导入表MD,该导入表24D如果有的话具有对由相应调用、函数或类型引用的其他函数和类型的其他绑定描述符M的引用。GP编译器20对用在DP中间代码中的内核函数和类型使用命名约定。该命名约定保证为每个内核函数和类型使用唯一的名称,并且为函数和类型的每个实例一致地使用该唯一的名称。另外,GP编译器20对用于标识出绑定描述符M的名称使用命名约定。该命名约定允许在导入表24D中基于本地可用的信息来统一地引用绑定描述符24。该命名约定可以基于GP代码12中的内核函数和类型的名称。现在将参考图3-5来描述将GP代码12中的一个或多个DP设备代码部分14编译成DP设备可执行代码40的过程的附加细节。图3是示出了由GP编译器20执行的方法的实施例的流程图,图4A-4B是示出了生成绑定描述符M的示例的框图,并且图5是示出了由绑定器34执行的方法的示例的流程图。在参考图3-5所述的实施例中,GP编译器20生成三种类型的绑定描述符24—— 调用存根绑定描述符24、声明绑定描述符M以及定义绑定描述符M。在其他实施例中,GP 编译器20可以生成其他合适类型的绑定描述符M或者充当绑定描述符M的其他合适的数据结构。GP编译器20在每当GP编译器20被调用以编译包括调用18 (即DP设备代码调用站点)或内核函数的GP代码12的模块时执行图3的方法。如图3所示,GP编译器20翻译GP代码12中的所检测的调用18或内核函数的DP 代码,并且为调用18生成调用存根绑定描述符M或者为内核函数生成声明和定义绑定描述符对,这在框52中予以指示。针对调用18或内核函数二者,GP编译器20将GP代码12 中的DP代码从GP语言翻译成DP中间代码,并且将DP中间代码存储到所生成的绑定描述符或描述符M中。GP编译器20如果有的话还将由内核函数引用的类型记录在绑定描述符 M中,这在框M中予以指示。GP编译器20为模块中的每个调用18和内核函数执行框52 和讨的功能,这在框56中予以指示。
针对调用18,GP编译器20将调用18的DP代码从GP语言翻译成DP中间代码,该 DP中间代码用于建立对所调用的内核函数的调用。GP编译器20将该DP中间代码与导入表MD中的对所调用内核函数的声明和定义绑定描述符M的引用和对由调用站点所使用的任何类型的声明绑定描述符M的引用一起存储到调用站点18的调用存根绑定描述符M 的DP中间代码24C中。图4A示出了 GP代码12 (1)的示例,该GP代码12 (1)包括分别在以基于具有DP 扩展的C++的GP语言编写的模块A. cpp、B. cpp,C. cpp中的DP代码的部分14(1)、14 (2)和 14 (3)。响应于GP编译器20被调用以编译模块A. cpp, GP编译器20标识出对内核函数Foo 的调用18(1)。如图4B的示例中所示,GP编译器20在对调用18(1)(图4A中所示)执行图3的框52的功能时图生成调用存根绑定描述符M (1)。GP编译器20生成调用存根绑定描述符M(I)以包括调用站点24A(1)的唯一名称;指示符MB(I),该指示符MB(I)指示绑定描述符M(I)是调用存根描述符;调用存根代码,该调用存根代码被GP编译器20翻译成DP中间代码;以及导入表24D (1),该导入表24D (1)具有对所调用内核函数Rx)的绑定描述符和对(3)的引用。由于模块A. cpp仅仅包括单个调用18(1)并且不包括任何内核函数,因此GP编译器20仅仅为模块A. cpp生成绑定描述符M (1)。针对内核函数,GP编译器20生成声明绑定描述符M和定义绑定描述符24。GP编译器20生成声明绑定描述符M,该声明绑定描述符M将用于声明内核函数的DP中间代码包括在DP中间代码24C中并且将对用在内核函数的声明中的任何类型的声明绑定描述符 24的引用包括在导入表MD中。GP编译器20还生成定义绑定描述符24,该定义绑定描述符M将用于定义内核函数的DP中间代码包括在DP中间代码24C中,将对所调用的内核函数的声明和定义绑定描述符M的引用包括在导入表24D中,将对由内核函数使用的任何类型的声明绑定描述符M的引用包括在导入表24D中,并且将对由内核函数使用的任何成员函数的定义绑定描述符M的引用包括在导入表MD中。响应于GP编译器20被调用以编译图4A的示例中的B. cpp模块,GP编译器20标识出内核函数你0,并且在执行图3的框52的功能时为内核函数Foo生成声明绑定描述符 24(2)和定义绑定描述符对(3),这在图4B中予以示出。GP编译器20生成声明绑定描述符 24(2)以包括Foo的签名的唯一名称24M2);指示符MB ( ,该指示符MB ( 指示绑定描述符是声明绑定描述符;Foo的签名24以2),该签名MCQ)被GP编译器20翻译成 DP中间代码;以及空的导入表MD(2)。GP编译器20生成定义绑定描述符M(3)以包括 Foo的签名的唯一名称24A(3);指示符24B(3),该指示符MB ( 指示绑定描述符M (3)是定义绑定描述符;Foo的定义MC ( ,该定义MC ( 被GP编译器20翻译成DP中间代码; 以及导入表24D (3),该导入表24D (3)具有对模块B. cpp中的内核函数Hoo的声明绑定描述符对(4)和定义绑定描述符M(5)以及内核函数Boo的声明绑定描述符M(6)和定义绑定描述符M(7)的引用。GP编译器20还标识出模块B. cpp中的内核函数Hoo 16 (2)。GP编译器20在对模块B. cpp中的函数Hoo执行图3的框52功能时生成声明绑定描述符M(4)和定义绑定描述符M (5)。GP编译器20生成声明绑定描述符MG)以包括B. cpp Hoo的签名的唯一名称24A(4);指示符MB(4),该指示符MB(4)指示绑定描述符对(4)是声明绑定描述符; B. cpp Hoo的签名M (4),该签名M (4)被GP编译器20翻译成DP中间代码;以及空的导入表24D(4)。GP编译器20生成定义绑定描述符以包括B. cpp Hoo的唯一名称24A (5); 指示符24B(5),该指示符MB 指示绑定描述符是定义绑定描述符;B. cpp Hoo的定义24C (5),该定义24C (5)被GP编译器20翻译成DP中间代码;以及导入表24D (5),该导入表MD 具有对模块C. cpp中的内核函数Boo的声明绑定描述符M(6)和定义绑定描述符对⑵的引用。因此,针对模块B. cpp, GP编译器20为内核函数Rx)生成绑定描述符M (2)和 24(3)并且为B. cpp中的内核函数Hoo生成绑定描述符对(4)和对(5)。响应于GP编译器20被调用以编译图4A的示例中的C. cpp模块,GP编译器20标识出模块C. cpp中的内核函数Boo 16 (3),并且在对函数Boo执行图3的框52的功能时生成声明绑定描述符M (6)和定义绑定描述符M (7)。GP编译器20生成声明绑定描述符M (6) 以包括Boo的签名的唯一名称24A(6);指示符24B(6),该指示符MB(6)指示绑定描述符 24(6)是声明绑定描述符;Boo的签名24C(6),该签名MC(6)被GP编译器20翻译成DP中间代码;以及空的导入表MD (6)。GP编译器20生成定义绑定描述符M (7)以包括Boo的唯一名称24A(7);指示符MB(7),该指示符MB(7)指示绑定描述符对(7)是定义绑定描述符;Boo的定义24C (7),该定义24C (7)被GP编译器20翻译成DP中间代码;以及导入表 240(7),该导入表对0(7)具有对模块C. cpp中的内核函数Hoo的声明绑定描述符M(8)和定义绑定描述符对(9)的引用。GP编译器20还检测到Boo引用类型MyType。因此,GP编译器20在执行图3的框M的功能时记录类型MyType。GP编译器20还标识出模块C. cpp中的内核函数Hoo 16 (4)。GP编译器20在执行图3的框52的功能时生成声明绑定描述符M (8)和定义绑定描述符M (9)。GP编译器20 生成声明绑定描述符24(8)以包括C. cpp Hoo的签名的唯一名称24A(8);指示符MB (8), 该指示符MB(S)指示绑定描述符M(8)是声明绑定描述符;C. cpp Hoo的签名24C(8),该签名MC (8)被GP编译器20翻译成DP中间代码;以及空的导入表MD (8),因为C. cpp Hoo 未使用任何在图3的框56中所确定的类型。GP编译器20生成定义绑定描述符M (9)以包括:C. cpp Hoo的唯一名称24A (9);指示符24B (9),该指示符24B (9)指示绑定描述符24 (9) 是定义绑定描述符;C. cpp Hoo的定义24C (9),该定义24C (9)被GP编译器20翻译成DP中间代码;以及空的导入表MD(9),因为C. cpp Hoo未调用任何其他内核函数。因此,针对模块C. cpp, GP编译器20为内核函数Boo生成绑定描述符M (6)和 24(7)并且为C. cpp中的内核函数Hoo生成绑定描述符对(8)和对(9)。回过来参考图3,CP编译器20翻译DP代码并且为由GP编译器20在框M中所记录的每个类型生成绑定描述符对,这在框58中予以指示。GP编译器20将每种类型的DP 代码从GP语言翻译成用于声明该类型的DP中间代码,并且将该DP中间代码与导入表24D 中的对由该类型所使用的任何其他类型的声明绑定描述符M的引用一起存储在该类型的相应声明绑定描述符M中的相应DP中间代码24C中。GP编译器20将DP中间代码存储到 DP中间代码MC中,其中任何成员函数的主体都被移除。针对每个成员函数,GP编译器20 还生成定义绑定描述符24,该定义绑定描述符M包括用于定义DP中间代码MC中的类定义主体之外的成员函数的DP中间代码。GP编译器20还包括对由成员函数所使用的任何类型的声明绑定描述符M的引用;对由成员函数所调用的任何非成员函数的声明绑定描述符M的引用;以及对由成员函数所调用的任何其他成员函数的定义绑定描述符M的引
参考图4B的示例,GP编译器20在对由内核函数Boo在编译模块C. cpp时所引用的类型MyType执行图3的框58的功能时生成声明绑定描述符M(IO)。GP编译器20生成声明绑定描述符M(IO)以包括=MyType的唯一名称24A(10);指示符MB(IO),该指示符 MB(IO)指示绑定描述符M(IO)是声明描述符;用于声明该类型的DP中间代码,该DP中间代码被GP编译器10翻译成DP中间代码MC(IO);以及空的导入表MD(IO)。现在将参考图5描述在一个实施例中由绑定器M执行的函数。在图5中,绑定器 34从调用存根描述符M开始遍历由调用站点的一组绑定描述符M所形成的调用图,这在框72中予以指示。针对来自该组绑定描述符M的所有类型的声明和函数定义,绑定器34 从该组绑定描述符M中收集DP中间代码,将该DP中间代码翻译成DP设备源代码(如果必要),并且串接该DP设备源代码,这在框74中予以指示。绑定器34如框76中所指示的那样移除DP设备源代码中的任何冗余,并且如框78中所指示的那样确定是否检测到任何错误(例如不被支持的递归调用)。如果未检测到错误,则绑定器34以合适的顺序将DP设备源代码单元36作为单个自包含的单元发出给DP设备编译器38,这在框82中予以指示。 如果检测到错误,则绑定器34报告错误,这在框80中予以指示。在图4A至4B的示例中,绑定器34从调用存根描述符M(9)开始遍历由调用18(1) 的绑定描述符M (I)-M (10)所形成的调用图。绑定器34从该组绑定描述符M O)(10) 中收集DP中间代码,将该DP中间代码翻译成DP设备源代码(如果必要),并且串接来自 24(2)-24(10)的 MyType 类型声明和 Foo、B. cpp Hoo、Boo、和 C. cpp Hoo 函数定义的 DP 设备源代码。绑定器34以正确的程序顺序并且在没有调用18(1)的冗余性的情况下将从绑定描述符M(I)-M(IO)中生成的DP设备源代码单元36发出给DP设备编译器38。上面的实施例可以填补具有丰富链接能力的通用语言与具有极少或不具有链接能力的DP设备语言之间的缺口。上面的实施例可以实现这一点,同时维持通用语言的正确的当前工具链流并且允许编程人员以模块化和组件化的方式对CPU和数据并行设备二者一起进行编程。图6是示出被配置为实现图1所示的编译环境10的计算机系统的实施例的框图。计算机系统100包括一个或多个处理器封装102、存储器系统104、零个或多个输入/输出设备106、零个或多个显示设备108、零个或多个外围设备110、和零个或多个网络设备112。处理器封装102、存储器系统104、输入/输出设备106、显示设备108、外围设备 110和网络设备112使用包括任何合适的类型、数量和配置的控制器、总线、接口、和/或其他有线或无线连接的一组互连114来进行通信。计算机系统100表示出于通用或专用目的而配置的任何合适的处理设备。计算机系统100的示例包括服务器、个人计算机、膝上型计算机、平板计算机、个人数字助理 (PDA)、移动电话、智能手机、和音频/视频设备。计算机系统100的组件(即,处理器封装 102、存储器系统104、输入/输出设备106、显示设备108、外围设备110、网络设备112和互连114)可包含在公共外壳(未示出)中或任何合适数量的独立外壳(未示出)中。每个处理器包102都包括一个或多个处理核,所述处理核形成被配置为执行指令 (例如软件)的执行硬件。每个处理器包102都可以包括具有相同或不同架构和/或指令集的处理核。例如,处理核可以包括顺序执行核、超标量执行核、以及数据并行执行核(例如GPU执行核)的任何组合。每个执行核都被配置为访问并执行存储在存储器系统104中的指令。这些指令可以包括基本输入输入系统(BIOS)或固件(未示出)、操作系统(OS) 122、 GP代码12、GP编译器20、具有绑定器34的链接器30、DP设备编译器38、以及具有DP设备可执行代码40的GP可执行代码32。每个执行核都可以结合或响应于从输入/输出设备 106、显示设备108、外围设备110、和/或网络设备112接收到的信息来执行指令。计算机系统100引导并执行OS 122。OS 122包括如下指令这些指令可以由执行核执行以管理计算机系统100的组件并提供允许程序访问并使用这些组件的一组功能。 在一个实施例中,OS 122是Windows操作系统。在其他实施例中,OS 122是适于和计算机系统100 —起使用的另一操作系统。计算机系统100执行GP编译器20、链接器30、绑定器 34、以及DP设备编译器38以如上述那样从GP代码12中生成具有DP设备可执行代码40 的GP可执行代码32。计算机系统100可以使用一个或多个处理核来执行包括DP设备可执行代码40的GP可执行代码32,这将在下面参考图7的实施例予以描述。存储器系统104包括被配置成存储指令和数据的任何合适的类型、数量和配置的易失性或非易失性存储设备。存储器系统104的存储设备是存储计算机可执行指令(即元件)的计算机可读存储介质,这些指令包括操作系统(0 122、GP代码12、GP编译器20、 链接器30、绑定器34、DP设备编译器38、以及具有DP设备可执行代码40的GP可执行代码32。这些指令可以被计算机系统100执行以执行在此所述的OS 122、GP代码12、GP编译器20、链接器30、绑定器34、DP设备编译器38、GP可执行代码32、以及DP设备可执行代码40的功能和方法。存储器系统104存储从处理器封装102、输入/输出设备106、显示设备108、外围设备110和网络设备112接收的指令和数据。存储器系统104将存储的指令和数据提供给处理器封装102、输入/输出设备106、显示设备108、外围设备110和网络设备112。存储器系统104中的存储设备的示例包括硬盘驱动器、随机存取存储器(RAM)、只读存储器(ROM)、闪存驱动器和卡、以及诸如磁盘和CD和DVD之类的光盘。输入/输出设备106包括被配置成将指令或数据从用户输入到计算机系统100并将指令或数据从计算机系统100输出到用户的任何合适的类型、数量和配置的输入/输出设备。输入/输出设备106的示例包括键盘、鼠标、触摸垫、触摸屏、按钮、拨盘、旋钮和开关。显示设备108包括被配置成向计算机系统100的用户输出文本和/或图形信息的任何合适的类型、数量和配置的显示设备。显示设备108的示例包括监视器、显示屏和投影仪。外围设备110包括被配置成用计算机系统100中的一个或多个其他组件来操作以执行通用或专用处理功能的任何合适的类型、数量和配置的外围设备。网络设备112包括被配置成允许计算机系统100通过一个或多个网络(未示出) 进行通信的任何合适的类型、数量和配置的网络设备。网络设备112可根据任何合适的网络协议和/或配置来操作以允许计算机系统100将信息发送给网络或者从网络接收信息。图7是示出了具有被配置为执行DP设备可执行代码40的DP设备210的计算机系统200的实施例的框图。在图7的实施例中,计算机系统100 (图6中所示)形成主机,该主机被配置为向DP设备210提供DP设备可执行代码40以供执行并且使用互连114 (图6)接收由DP设备可执行代码40所生成的结果。DP设备210包括一个或多个处理元件(PE) 212 的组、以及存储DP设备可执行代码40的存储器214。PE 212执行DP可执行代码40并且将由DP设备可执行代码40生成的结果存储在存储器214(未示出)中。在一个实施例中,DP设备210是图形卡,其中一个或多个图形处理单元(GPU)包括 PE 212和与存储器104(图6)分开的存储器214。在该实施例中,图形卡的驱动程序(未示出)可以将DP设备可执行代码40的字节代码转换成所述GPU的指令集以供所述GPU的 PE 212执行。在另一实施例中,DP设备210由一个或多个GPU(即PE 212)的组合形成,所述GPU 与一个或多个CPU执行核和存储器104 (图6)的一部分214 —起被包括在处理器包102 (图 6)中。在该实施例中,可以在计算机系统100上配备附加的软件来将DP设备可执行代码 40的字节代码转换成处理器包102中的指令集。在另一实施例中,DP设备210由处理器包102(图6)的一个或多个执行核中的一个或多个矢量处理流水线和存储器104(图6)的一部分214的组合形成。在该实施例中, 可以在计算机系统100上配备附加的软件来将DP设备可执行代码40的字节代码转换成处理器包102中的矢量处理流水线的指令集。在又一实施例中,DP设备210由处理器包102(图6)的一个或多个执行核的一个或多个标量处理流水线和存储器104(图6)的一部分214的组合形成。在该实施例中,可以在计算机系统100上配备附加的软件来将DP设备可执行代码40的字节代码转换成处理器包102中的标量处理流水线的指令集。尽管此处说明并描述了具体实施例,但本领域技术人员可以理解,可用各种替换和/或等价实现来替换此处示出并描述的具体实施例而不背离本发明的范围。本申请旨在覆盖此处讨论的具体实施例的任何改编或变型。因此,本发明旨在仅由权利要求书及其等效方案来限制。
权利要求
1.一种由计算机系统(100/200)执行的方法,所述方法包括将通用数据并行代码(1 的旨在供在一个或多个数据并行设备(210)上执行的第一部分(14)翻译成第一数据并行设备源代码;将通用数据并行代码的旨在供在一个或多个数据并行设备上执行的第二部分(14)翻译成第二数据并行设备源代码;以及将第一和第二数据并行设备源代码绑定成自包含的数据并行设备源代码单元(36)。
2.如权利要求1所述的方法,其特征在于,进一步包括从该自包含的数据并行设备代码单元中生成数据并行设备可执行代码。
3.如权利要求1所述的方法,其特征在于,进一步包括利用所述一个或多个数据并行设备来执行该数据并行设备可执行代码。
4.如权利要求1所述的方法,其特征在于,进一步包括从该通用数据并行代码的旨在供在中央处理单元(CPU)上执行的第三部分中生成通用可执行代码。
5.如权利要求1所述的方法,其特征在于,第一部分包括注释,该注释标识出旨在供在所述一个或多个数据并行设备上执行的内核函数。
6.如权利要求5所述的方法,其特征在于,第二部分包括内核函数的调用。
7.如权利要求1所述的方法,其特征在于,进一步包括生成第一组一个或多个绑定描述符,所述绑定描述符包括与第一数据并行设备源代码相对应的第一数据并行中间代码;以及生成第二组一个或多个绑定描述符,所述绑定描述符包括与第二数据并行设备源代码相对应的第二数据并行中间代码、以及对第一组绑定描述符的至少之一的引用。
8.如权利要求7所述的方法,其特征在于,第一组一个或多个绑定描述符对应于内核函数,并且其中第二组一个或多个绑定描述符对应于内核函数的调用。
9.一种存储计算机可执行指令的计算机可读存储介质(104/214),所述计算机可执行指令在由计算机系统(100)执行时执行一种方法,所述方法包括为通用代码(1 中的一组内核函数生成一组绑定描述符(对),该组内核函数中的每个都旨在供在一个或多个数据并行设备(210)上执行;为所述内核函数之一的调用(18)生成调用存根绑定描述符04); 为由该组内核函数引用的类型生成第二组绑定描述符04);以及遍历由第一组绑定描述符、调用存根绑定描述符和第二组绑定描述符形成的调用图以生成自包含的数据并行设备源代码单元(36)。
10.如权利要求9所述的计算机可读存储介质,其特征在于,所述方法进一步包括 编译该自包含的数据并行设备源代码单元以生成数据并行设备可执行代码。
全文摘要
本发明涉及绑定数据并行设备源代码。在计算机系统中提供一种编译环境,该编译环境允许编程人员使用具有数据并行(DP)扩展的高级通用编程语言来对CPU和数据并行设备(例如GPU)二者进行编程。一种编译过程使用DP设备源代码的一组绑定描述符将以该通用语言编写的模块化DP代码翻译成以高级DP设备编程语言的DP设备源代码。绑定器从该组绑定描述符中生成单个自包含的DP设备源代码单元。DP设备编译器从该DP设备源代码单元中生成供在一个或多个数据并行设备上执行的DP设备可执行代码。
文档编号G06F9/45GK102298535SQ20111018463
公开日2011年12月28日 申请日期2011年6月21日 优先权日2010年6月22日
发明者L·张, S·S·索迪, W·朱, Y·莱瓦诺尼 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1