CN102298535B - 绑定数据并行设备源代码 - Google Patents
绑定数据并行设备源代码 Download PDFInfo
- Publication number
- CN102298535B CN102298535B CN201110184637.7A CN201110184637A CN102298535B CN 102298535 B CN102298535 B CN 102298535B CN 201110184637 A CN201110184637 A CN 201110184637A CN 102298535 B CN102298535 B CN 102298535B
- Authority
- CN
- China
- Prior art keywords
- code
- data parallel
- equipment
- descriptor
- binding descriptor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/423—Preprocessors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/314—Parallel programming languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/54—Link editing before load time
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及绑定数据并行设备源代码。在计算机系统中提供一种编译环境,该编译环境允许编程人员使用具有数据并行(DP)扩展的高级通用编程语言来对CPU和数据并行设备(例如GPU)二者进行编程。一种编译过程使用DP设备源代码的一组绑定描述符将以该通用语言编写的模块化DP代码翻译成以高级DP设备编程语言的DP设备源代码。绑定器从该组绑定描述符中生成单个自包含的DP设备源代码单元。DP设备编译器从该DP设备源代码单元中生成供在一个或多个数据并行设备上执行的DP设备可执行代码。
Description
技术领域
本发明涉及编译环境。
背景技术
计算机系统常常包括一个或多个中央处理单元(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代码12)编译成包括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(例如kernel_func)相关联。代码部分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,所述对象或中间表示文件具有标识出一个或多个对象或IR文件22之间的关系的符号。链接器30接收对象或文件22,并且将对象或文件22组合成GP可执行代码32并且解析一个或多个对象或IR文件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将IR翻译成高级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通过如下方式将来自该组绑定描述符24的DP中间代码绑定到DP设备源代码单元36中:遍历来源于调用18并且由该组绑定描述符24形成的调用图;将DP中间代码翻译成DP设备源代码(如果需要);以及串接来自该组绑定描述符24的DP设备源代码。绑定器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是示出了绑定描述符24的实施例的框图。GP编译器20为来自调用18的每个调用、函数和类型生成绑定描述符24。绑定描述符24包括:名称24A,该名称24A存储相应调用、函数或类型的唯一名称;类型24B,该类型24B指示绑定描述符24是声明绑定描述符、定义绑定描述符还是调用存根绑定描述符;针对相应调用、函数或类型的DP中间代码24C;以及导入表24D,该导入表24D如果有的话具有对由相应调用、函数或类型引用的其他函数和类型的其他绑定描述符24的引用。
GP编译器20对用在DP中间代码中的内核函数和类型使用命名约定。该命名约定保证:为每个内核函数和类型使用唯一的名称,并且为函数和类型的每个实例一致地使用该唯一的名称。另外,GP编译器20对用于标识出绑定描述符24的名称使用命名约定。该命名约定允许在导入表24D中基于本地可用的信息来统一地引用绑定描述符24。该命名约定可以基于GP代码12中的内核函数和类型的名称。
现在将参考图3-5来描述将GP代码12中的一个或多个DP设备代码部分14编译成DP设备可执行代码40的过程的附加细节。图3是示出了由GP编译器20执行的方法的实施例的流程图,图4A-4B是示出了生成绑定描述符24的示例的框图,并且图5是示出了由绑定器34执行的方法的示例的流程图。
在参考图3-5所述的实施例中,GP编译器20生成三种类型的绑定描述符24——调用存根绑定描述符24、声明绑定描述符24以及定义绑定描述符24。在其他实施例中,GP编译器20可以生成其他合适类型的绑定描述符24或者充当绑定描述符24的其他合适的数据结构。
GP编译器20在每当GP编译器20被调用以编译包括调用18(即DP设备代码调用站点)或内核函数的GP代码12的模块时执行图3的方法。
如图3所示,GP编译器20翻译GP代码12中的所检测的调用18或内核函数的DP代码,并且为调用18生成调用存根绑定描述符24或者为内核函数生成声明和定义绑定描述符24,这在框52中予以指示。针对调用18或内核函数二者,GP编译器20将GP代码12中的DP代码从GP语言翻译成DP中间代码,并且将DP中间代码存储到所生成的绑定描述符或描述符24中。GP编译器20如果有的话还将由内核函数引用的类型记录在绑定描述符24中,这在框54中予以指示。GP编译器20为模块中的每个调用18和内核函数执行框52和54的功能,这在框56中予以指示。
针对调用18,GP编译器20将调用18的DP代码从GP语言翻译成DP中间代码,该DP中间代码用于建立对所调用的内核函数的调用。GP编译器20将该DP中间代码与导入表24D中的对所调用内核函数的声明和定义绑定描述符24的引用和对由调用站点所使用的任何类型的声明绑定描述符24的引用一起存储到调用站点18的调用存根绑定描述符24的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的功能时图生成调用存根绑定描述符24(1)。GP编译器20生成调用存根绑定描述符24(1)以包括:调用站点24A(1)的唯一名称;指示符24B(1),该指示符24B(1)指示绑定描述符24(1)是调用存根描述符;调用存根代码,该调用存根代码被GP编译器20翻译成DP中间代码;以及导入表24D(1),该导入表24D(1)具有对所调用内核函数Foo的绑定描述符24(2)和24(3)的引用。由于模块A.cpp仅仅包括单个调用18(1)并且不包括任何内核函数,因此GP编译器20仅仅为模块A.cpp生成绑定描述符24(1)。
针对内核函数,GP编译器20生成声明绑定描述符24和定义绑定描述符24。GP编译器20生成声明绑定描述符24,该声明绑定描述符24将用于声明内核函数的DP中间代码包括在DP中间代码24C中并且将对用在内核函数的声明中的任何类型的声明绑定描述符24的引用包括在导入表24D中。GP编译器20还生成定义绑定描述符24,该定义绑定描述符24将用于定义内核函数的DP中间代码包括在DP中间代码24C中,将对所调用的内核函数的声明和定义绑定描述符24的引用包括在导入表24D中,将对由内核函数使用的任何类型的声明绑定描述符24的引用包括在导入表24D中,并且将对由内核函数使用的任何成员函数的定义绑定描述符24的引用包括在导入表24D中。
响应于GP编译器20被调用以编译图4A的示例中的B.cpp模块,GP编译器20标识出内核函数Foo,并且在执行图3的框52的功能时为内核函数Foo生成声明绑定描述符24(2)和定义绑定描述符24(3),这在图4B中予以示出。GP编译器20生成声明绑定描述符24(2)以包括:Foo的签名的唯一名称24A(2);指示符24B(2),该指示符24B(2)指示绑定描述符24(2)是声明绑定描述符;Foo的签名24C(2),该签名24C(2)被GP编译器20翻译成DP中间代码;以及空的导入表24D(2)。GP编译器20生成定义绑定描述符24(3)以包括:Foo的签名的唯一名称24A(3);指示符24B(3),该指示符24B(3)指示绑定描述符24(3)是定义绑定描述符;Foo的定义24C(3),该定义24C(3)被GP编译器20翻译成DP中间代码;以及导入表24D(3),该导入表24D(3)具有对模块B.cpp中的内核函数Hoo的声明绑定描述符24(4)和定义绑定描述符24(5)以及内核函数Boo的声明绑定描述符24(6)和定义绑定描述符24(7)的引用。
GP编译器20还标识出模块B.cpp中的内核函数Hoo16(2)。GP编译器20在对模块B.cpp中的函数Hoo执行图3的框52功能时生成声明绑定描述符24(4)和定义绑定描述符24(5)。GP编译器20生成声明绑定描述符24(4)以包括:B.cppHoo的签名的唯一名称24A(4);指示符24B(4),该指示符24B(4)指示绑定描述符24(4)是声明绑定描述符;B.cppHoo的签名24(4),该签名24(4)被GP编译器20翻译成DP中间代码;以及空的导入表24D(4)。GP编译器20生成定义绑定描述符24(5)以包括:B.cppHoo的唯一名称24A(5);指示符24B(5),该指示符24B(5)指示绑定描述符24(5)是定义绑定描述符;B.cppHoo的定义24C(5),该定义24C(5)被GP编译器20翻译成DP中间代码;以及导入表24D(5),该导入表24D(5)具有对模块C.cpp中的内核函数Boo的声明绑定描述符24(6)和定义绑定描述符24(7)的引用。
因此,针对模块B.cpp,GP编译器20为内核函数Foo生成绑定描述符24(2)和24(3)并且为B.cpp中的内核函数Hoo生成绑定描述符24(4)和24(5)。
响应于GP编译器20被调用以编译图4A的示例中的C.cpp模块,GP编译器20标识出模块C.cpp中的内核函数Boo16(3),并且在对函数Boo执行图3的框52的功能时生成声明绑定描述符24(6)和定义绑定描述符24(7)。GP编译器20生成声明绑定描述符24(6)以包括:Boo的签名的唯一名称24A(6);指示符24B(6),该指示符24B(6)指示绑定描述符24(6)是声明绑定描述符;Boo的签名24C(6),该签名24C(6)被GP编译器20翻译成DP中间代码;以及空的导入表24D(6)。GP编译器20生成定义绑定描述符24(7)以包括:Boo的唯一名称24A(7);指示符24B(7),该指示符24B(7)指示绑定描述符24(7)是定义绑定描述符;Boo的定义24C(7),该定义24C(7)被GP编译器20翻译成DP中间代码;以及导入表24D(7),该导入表24D(7)具有对模块C.cpp中的内核函数Hoo的声明绑定描述符24(8)和定义绑定描述符24(9)的引用。GP编译器20还检测到:Boo引用类型MyType。因此,GP编译器20在执行图3的框54的功能时记录类型MyType。
GP编译器20还标识出模块C.cpp中的内核函数Hoo16(4)。GP编译器20在执行图3的框52的功能时生成声明绑定描述符24(8)和定义绑定描述符24(9)。GP编译器20生成声明绑定描述符24(8)以包括:C.cppHoo的签名的唯一名称24A(8);指示符24B(8),该指示符24B(8)指示绑定描述符24(8)是声明绑定描述符;C.cppHoo的签名24C(8),该签名24C(8)被GP编译器20翻译成DP中间代码;以及空的导入表24D(8),因为C.cppHoo未使用任何在图3的框56中所确定的类型。GP编译器20生成定义绑定描述符24(9)以包括:C.cppHoo的唯一名称24A(9);指示符24B(9),该指示符24B(9)指示绑定描述符24(9)是定义绑定描述符;C.cppHoo的定义24C(9),该定义24C(9)被GP编译器20翻译成DP中间代码;以及空的导入表24D(9),因为C.cppHoo未调用任何其他内核函数。
因此,针对模块C.cpp,GP编译器20为内核函数Boo生成绑定描述符24(6)和24(7)并且为C.cpp中的内核函数Hoo生成绑定描述符24(8)和24(9)。
回过来参考图3,CP编译器20翻译DP代码并且为由GP编译器20在框54中所记录的每个类型生成绑定描述符24,这在框58中予以指示。GP编译器20将每种类型的DP代码从GP语言翻译成用于声明该类型的DP中间代码,并且将该DP中间代码与导入表24D中的对由该类型所使用的任何其他类型的声明绑定描述符24的引用一起存储在该类型的相应声明绑定描述符24中的相应DP中间代码24C中。GP编译器20将DP中间代码存储到DP中间代码24C中,其中任何成员函数的主体都被移除。针对每个成员函数,GP编译器20还生成定义绑定描述符24,该定义绑定描述符24包括用于定义DP中间代码24C中的类定义主体之外的成员函数的DP中间代码。GP编译器20还包括:对由成员函数所使用的任何类型的声明绑定描述符24的引用;对由成员函数所调用的任何非成员函数的声明绑定描述符24的引用;以及对由成员函数所调用的任何其他成员函数的定义绑定描述符24的引用。
参考图4B的示例,GP编译器20在对由内核函数Boo在编译模块C.cpp时所引用的类型MyType执行图3的框58的功能时生成声明绑定描述符24(10)。GP编译器20生成声明绑定描述符24(10)以包括:MyType的唯一名称24A(10);指示符24B(10),该指示符24B(10)指示绑定描述符24(10)是声明描述符;用于声明该类型的DP中间代码,该DP中间代码被GP编译器10翻译成DP中间代码24C(10);以及空的导入表24D(10)。
现在将参考图5描述在一个实施例中由绑定器24执行的函数。在图5中,绑定器34从调用存根描述符24开始遍历由调用站点的一组绑定描述符24所形成的调用图,这在框72中予以指示。针对来自该组绑定描述符24的所有类型的声明和函数定义,绑定器34从该组绑定描述符24中收集DP中间代码,将该DP中间代码翻译成DP设备源代码(如果必要),并且串接该DP设备源代码,这在框74中予以指示。绑定器34如框76中所指示的那样移除DP设备源代码中的任何冗余,并且如框78中所指示的那样确定是否检测到任何错误(例如不被支持的递归调用)。如果未检测到错误,则绑定器34以合适的顺序将DP设备源代码单元36作为单个自包含的单元发出给DP设备编译器38,这在框82中予以指示。如果检测到错误,则绑定器34报告错误,这在框80中予以指示。
在图4A至4B的示例中,绑定器34从调用存根描述符24(9)开始遍历由调用18(1)的绑定描述符24(1)-24(10)所形成的调用图。绑定器34从该组绑定描述符24(2)-24(10)中收集DP中间代码,将该DP中间代码翻译成DP设备源代码(如果必要),并且串接来自24(2)-24(10)的MyType类型声明和Foo、B.cppHoo、Boo、和C.cppHoo函数定义的DP设备源代码。绑定器34以正确的程序顺序并且在没有调用18(1)的冗余性的情况下将从绑定描述符24(1)-24(10)中生成的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引导并执行OS122。OS122包括如下指令:这些指令可以由执行核执行以管理计算机系统100的组件并提供允许程序访问并使用这些组件的一组功能。在一个实施例中,OS122是Windows操作系统。在其他实施例中,OS122是适于和计算机系统100一起使用的另一操作系统。计算机系统100执行GP编译器20、链接器30、绑定器34、以及DP设备编译器38以如上述那样从GP代码12中生成具有DP设备可执行代码40的GP可执行代码32。计算机系统100可以使用一个或多个处理核来执行包括DP设备可执行代码40的GP可执行代码32,这将在下面参考图7的实施例予以描述。
存储器系统104包括被配置成存储指令和数据的任何合适的类型、数量和配置的易失性或非易失性存储设备。存储器系统104的存储设备是存储计算机可执行指令(即元件)的计算机可读存储介质,这些指令包括操作系统(OS)122、GP代码12、GP编译器20、链接器30、绑定器34、DP设备编译器38、以及具有DP设备可执行代码40的GP可执行代码32。这些指令可以被计算机系统100执行以执行在此所述的OS122、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。PE212执行DP可执行代码40并且将由DP设备可执行代码40生成的结果存储在存储器214(未示出)中。
在一个实施例中,DP设备210是图形卡,其中一个或多个图形处理单元(GPU)包括PE212和与存储器104(图6)分开的存储器214。在该实施例中,图形卡的驱动程序(未示出)可以将DP设备可执行代码40的字节代码转换成所述GPU的指令集以供所述GPU的PE212执行。
在另一实施例中,DP设备210由一个或多个GPU(即PE212)的组合形成,所述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中的标量处理流水线的指令集。
尽管此处说明并描述了具体实施例,但本领域技术人员可以理解,可用各种替换和/或等价实现来替换此处示出并描述的具体实施例而不背离本发明的范围。本申请旨在覆盖此处讨论的具体实施例的任何改编或变型。因此,本发明旨在仅由权利要求书及其等效方案来限制。
Claims (8)
1.一种由计算机系统(100/200)执行的方法,所述方法包括:
将通用数据并行代码(12)的旨在供在一个或多个数据并行设备(210)上执行的第一部分(14)翻译成第一数据并行设备源代码;
将通用数据并行代码的旨在供在一个或多个数据并行设备上执行的第二部分(14)翻译成第二数据并行设备源代码;
通过遍历由被注释为数据并行设备代码的一组内核函数的一组生成的绑定描述符所形成的调用图来基于该组绑定描述符将第一和第二数据并行设备源代码绑定成自包含的数据并行设备源代码单元(36);
从该自包含的数据并行设备代码单元中生成数据并行设备可执行代码;
将所述数据并行设备可执行代码合并成通用可执行代码,
其中所述内核函数中的至少一个使用由所述通用可执行代码所定义的类型,并且给类型不被注释为数据并行设备代码。
2.如权利要求1所述的方法,其特征在于,进一步包括:
利用所述一个或多个数据并行设备来执行该数据并行设备可执行代码。
3.如权利要求1所述的方法,其特征在于,进一步包括:
从该通用数据并行代码的旨在供在中央处理单元(CPU)上执行的第三部分中生成所述通用可执行代码。
4.如权利要求1所述的方法,其特征在于,第一部分包括注释,该注释标识出旨在供在所述一个或多个数据并行设备上执行的内核函数。
5.如权利要求4所述的方法,其特征在于,第二部分包括内核函数的调用。
6.如权利要求1所述的方法,其特征在于,进一步包括:
生成第一组一个或多个绑定描述符,所述绑定描述符包括与第一数据并行设备源代码相对应的第一数据并行中间代码;以及
生成第二组一个或多个绑定描述符,所述绑定描述符包括与第二数据并行设备源代码相对应的第二数据并行中间代码、以及对第一组绑定描述符的至少之一的引用。
7.如权利要求6所述的方法,其特征在于,第一组一个或多个绑定描述符对应于内核函数,并且其中第二组一个或多个绑定描述符对应于内核函数的调用。
8.一种方法,所述方法包括:
将通用数据并行代码的旨在供在一个或多个数据并行设备(210)上执行的第一部分(14)翻译成第一数据并行设备源代码;
将通用数据并行代码的旨在供在一个或多个数据并行设备上执行的第二部分(14)翻译成第二数据并行设备源代码;
为通用代码(12)中的被注释为数据并行设备代码的一组内核函数生成一组绑定描述符(24),该组内核函数中的每个都旨在供在一个或多个数据并行设备(210)上执行;
为所述内核函数之一的调用(18)生成调用存根绑定描述符(24);
为由该组内核函数引用的类型生成第二组绑定描述符(24);
遍历由第一组绑定描述符、调用存根绑定描述符和第二组绑定描述符形成的调用图以生成自包含的数据并行设备源代码单元(36);
编译该自包含的数据并行设备源代码单元以生成数据并行设备可执行代码;以及
将所述数据并行设备可执行代码合并成通用可执行代码,
其中所述内核函数中的至少一个使用由所述通用可执行代码所定义的类型,并且给类型不被注释为数据并行设备代码。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/820,240 | 2010-06-22 | ||
US12/820,240 US8756590B2 (en) | 2010-06-22 | 2010-06-22 | Binding data parallel device source code |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102298535A CN102298535A (zh) | 2011-12-28 |
CN102298535B true CN102298535B (zh) | 2016-04-20 |
Family
ID=45329839
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110184637.7A Active CN102298535B (zh) | 2010-06-22 | 2011-06-21 | 绑定数据并行设备源代码 |
Country Status (2)
Country | Link |
---|---|
US (1) | US8756590B2 (zh) |
CN (1) | CN102298535B (zh) |
Families Citing this family (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8533697B2 (en) * | 2007-02-14 | 2013-09-10 | The Mathworks, Inc. | Graphical processing unit (GPU) arrays providing high computational capabilities in a computing environment |
EP2616932A4 (en) * | 2010-09-13 | 2015-02-11 | Massively Parallel Tech Inc | SOFTWARE CONCEPT AND AUTOMATIC ENCRYPTION FOR PARALLEL CALCULATION |
US9841958B2 (en) * | 2010-12-23 | 2017-12-12 | Microsoft Technology Licensing, Llc. | Extensible data parallel semantics |
US9330031B2 (en) | 2011-12-09 | 2016-05-03 | Nvidia Corporation | System and method for calibration of serial links using a serial-to-parallel loopback |
US8776223B2 (en) * | 2012-01-16 | 2014-07-08 | Qualcomm Incorporated | Dynamic execution prevention to inhibit return-oriented programming |
US9483235B2 (en) * | 2012-05-09 | 2016-11-01 | Nvidia Corporation | Method and system for separate compilation of device code embedded in host code |
US10261807B2 (en) * | 2012-05-09 | 2019-04-16 | Nvidia Corporation | Method and system for multiple embedded device links in a host executable |
DE102013208418A1 (de) * | 2012-05-09 | 2013-11-14 | Nvidia Corp. | Verfahren und System zur separaten Kompilierung von Geräte-Code, welcher in Host-Code eingebettet ist |
DE102013208560A1 (de) * | 2012-05-09 | 2013-11-14 | Nvidia Corporation | Verfahren und System für mehrere eingebettete Geräte-Links in einer Host-ausführbaren Struktur |
US10025643B2 (en) * | 2012-05-10 | 2018-07-17 | Nvidia Corporation | System and method for compiler support for kernel launches in device code |
US9134974B2 (en) * | 2012-11-12 | 2015-09-15 | Signalogic, Inc. | Source code separation and generation for heterogeneous central processing unit (CPU) computational devices |
US9619364B2 (en) | 2013-03-14 | 2017-04-11 | Nvidia Corporation | Grouping and analysis of data access hazard reports |
US9569334B2 (en) | 2013-03-14 | 2017-02-14 | Whitehat Security, Inc. | Techniques for traversing representations of source code |
US9229698B2 (en) | 2013-11-25 | 2016-01-05 | Nvidia Corporation | Method and apparatus for compiler processing for a function marked with multiple execution spaces |
US9632761B2 (en) * | 2014-01-13 | 2017-04-25 | Red Hat, Inc. | Distribute workload of an application to a graphics processing unit |
US9886736B2 (en) | 2014-01-20 | 2018-02-06 | Nvidia Corporation | Selectively killing trapped multi-process service clients sharing the same hardware context |
US10152312B2 (en) | 2014-01-21 | 2018-12-11 | Nvidia Corporation | Dynamic compiler parallelism techniques |
US9740464B2 (en) * | 2014-05-30 | 2017-08-22 | Apple Inc. | Unified intermediate representation |
US10346941B2 (en) | 2014-05-30 | 2019-07-09 | Apple Inc. | System and method for unified application programming interface and model |
US10430169B2 (en) | 2014-05-30 | 2019-10-01 | Apple Inc. | Language, function library, and compiler for graphical and non-graphical computation on a graphical processor unit |
US10241761B2 (en) * | 2014-12-29 | 2019-03-26 | Nvidia Corporation | System and method for compiler support for compile time customization of code |
US9792443B1 (en) | 2015-03-12 | 2017-10-17 | Whitehat Security, Inc. | Position analysis of source code vulnerabilities |
US10180825B2 (en) * | 2015-09-30 | 2019-01-15 | Apple Inc. | System and method for using ubershader variants without preprocessing macros |
WO2018094087A1 (en) * | 2016-11-17 | 2018-05-24 | The Mathworks, Inc. | Systems and methods for generating code for parallel processing units |
US11556452B2 (en) | 2021-03-31 | 2023-01-17 | Bank Of America Corporation | System for software compiler integrity verification |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101441569A (zh) * | 2008-11-24 | 2009-05-27 | 中国人民解放军信息工程大学 | 基于异构可重构体系结构面向任务流的新型编译方法 |
Family Cites Families (29)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5261095A (en) * | 1989-10-11 | 1993-11-09 | Texas Instruments Incorporated | Partitioning software in a multiprocessor system |
US7159212B2 (en) | 2002-03-08 | 2007-01-02 | Electronic Arts Inc. | Systems and methods for implementing shader-driven compilation of rendering assets |
GB2401217B (en) * | 2003-05-02 | 2005-11-09 | Transitive Ltd | Improved architecture for generating intermediate representations for program code conversion |
US7800620B2 (en) * | 2004-11-05 | 2010-09-21 | Microsoft Corporation | Optimizing automated shader program construction |
US20060123401A1 (en) * | 2004-12-02 | 2006-06-08 | International Business Machines Corporation | Method and system for exploiting parallelism on a heterogeneous multiprocessor computer system |
US7487496B2 (en) * | 2004-12-02 | 2009-02-03 | International Business Machines Corporation | Computer program functional partitioning method for heterogeneous multi-processing systems |
JP2006243839A (ja) * | 2005-02-28 | 2006-09-14 | Toshiba Corp | 命令生成装置及び命令生成方法 |
US9038040B2 (en) * | 2006-01-25 | 2015-05-19 | International Business Machines Corporation | Method for partitioning programs between a general purpose core and one or more accelerators |
US8161464B2 (en) * | 2006-04-11 | 2012-04-17 | International Business Machines Corporation | Compiling source code |
US8136102B2 (en) * | 2006-06-20 | 2012-03-13 | Google Inc. | Systems and methods for compiling an application for a parallel-processing computer system |
US8443348B2 (en) * | 2006-06-20 | 2013-05-14 | Google Inc. | Application program interface of a parallel-processing computer system that supports multiple programming languages |
US8136104B2 (en) * | 2006-06-20 | 2012-03-13 | Google Inc. | Systems and methods for determining compute kernels for an application in a parallel-processing computer system |
US8111260B2 (en) | 2006-06-28 | 2012-02-07 | Microsoft Corporation | Fast reconfiguration of graphics pipeline state |
US7659901B2 (en) | 2006-07-24 | 2010-02-09 | Microsoft Corporation | Application program interface for programmable graphics pipeline |
US8201159B2 (en) * | 2006-08-04 | 2012-06-12 | International Business Machines Corporation | Method and apparatus for generating data parallel select operations in a pervasively data parallel system |
GB2443277B (en) * | 2006-10-24 | 2011-05-18 | Advanced Risc Mach Ltd | Performing diagnostics operations upon an asymmetric multiprocessor apparatus |
US20080109795A1 (en) * | 2006-11-02 | 2008-05-08 | Nvidia Corporation | C/c++ language extensions for general-purpose graphics processing unit |
US8533697B2 (en) * | 2007-02-14 | 2013-09-10 | The Mathworks, Inc. | Graphical processing unit (GPU) arrays providing high computational capabilities in a computing environment |
US8789063B2 (en) * | 2007-03-30 | 2014-07-22 | Microsoft Corporation | Master and subordinate operating system kernels for heterogeneous multiprocessor systems |
US8296743B2 (en) * | 2007-12-17 | 2012-10-23 | Intel Corporation | Compiler and runtime for heterogeneous multiprocessor systems |
US9678775B1 (en) * | 2008-04-09 | 2017-06-13 | Nvidia Corporation | Allocating memory for local variables of a multi-threaded program for execution in a single-threaded environment |
US8581912B2 (en) | 2008-06-27 | 2013-11-12 | Microsoft Corporation | Dynamic subroutine linkage optimizing shader performance |
US8531471B2 (en) * | 2008-11-13 | 2013-09-10 | Intel Corporation | Shared virtual memory |
US8341602B2 (en) * | 2009-01-29 | 2012-12-25 | Microsoft Corporation | Automated verification of a type-safe operating system |
US8418155B2 (en) * | 2009-02-10 | 2013-04-09 | International Business Machines Corporation | Generating parallel SIMD code for an arbitrary target architecture |
US8209664B2 (en) * | 2009-03-18 | 2012-06-26 | Microsoft Corporation | High level programming extensions for distributed data parallel processing |
US20110314256A1 (en) * | 2010-06-18 | 2011-12-22 | Microsoft Corporation | Data Parallel Programming Model |
US8589867B2 (en) * | 2010-06-18 | 2013-11-19 | Microsoft Corporation | Compiler-generated invocation stubs for data parallel programming model |
US8839214B2 (en) * | 2010-06-30 | 2014-09-16 | Microsoft Corporation | Indexable type transformations |
-
2010
- 2010-06-22 US US12/820,240 patent/US8756590B2/en active Active
-
2011
- 2011-06-21 CN CN201110184637.7A patent/CN102298535B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101441569A (zh) * | 2008-11-24 | 2009-05-27 | 中国人民解放军信息工程大学 | 基于异构可重构体系结构面向任务流的新型编译方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102298535A (zh) | 2011-12-28 |
US20110314458A1 (en) | 2011-12-22 |
US8756590B2 (en) | 2014-06-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102298535B (zh) | 绑定数据并行设备源代码 | |
KR101900796B1 (ko) | 기민 통신 오퍼레이터 | |
CN101681294B (zh) | 用于存储器事务分组的方法和系统 | |
CN102402451B (zh) | 用户定义类型的编译时边界检查 | |
CN102495723B (zh) | 小块通信算子 | |
CN102566980B (zh) | 可扩展的数据并行语义 | |
CN106415496A (zh) | 统一中间表示 | |
US10282179B2 (en) | Nested communication operator | |
CN106415495A (zh) | 用于应用开发的编程系统和语言 | |
CN103718155A (zh) | 运行时系统 | |
CN105164641A (zh) | 扩展开发环境 | |
CN104063258A (zh) | 用于调试过程中的代码动态切换的方法和系统 | |
CN102541612B (zh) | 数据平行代码中的映射变换 | |
US10620916B2 (en) | Read-only communication operator | |
US8713039B2 (en) | Co-map communication operator | |
CN109558121A (zh) | 接口驱动程序的开发方法、装置、设备及存储介质 | |
CN101681293B (zh) | 在事务存储器系统中高效地定位事务代码块 | |
KR20240025509A (ko) | 크로스 링크 방법, 장치, 전자 설비 및 저장 매체 | |
US20200081725A1 (en) | Dynamically binding data in an application | |
CN115576604A (zh) | 一种跨平台开发系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150721 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20150721 Address after: Washington State Applicant after: Micro soft technique license Co., Ltd Address before: Washington State Applicant before: Microsoft Corp. |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |