CN103389908A - 用于分开编译嵌入在主机代码中的设备代码的方法和系统 - Google Patents
用于分开编译嵌入在主机代码中的设备代码的方法和系统 Download PDFInfo
- Publication number
- CN103389908A CN103389908A CN2013101703917A CN201310170391A CN103389908A CN 103389908 A CN103389908 A CN 103389908A CN 2013101703917 A CN2013101703917 A CN 2013101703917A CN 201310170391 A CN201310170391 A CN 201310170391A CN 103389908 A CN103389908 A CN 103389908A
- Authority
- CN
- China
- Prior art keywords
- code
- link
- device code
- compiling
- file
- 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.)
- Pending
Links
Images
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/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/456—Parallelism detection
-
- 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)
- Stored Programmes (AREA)
Abstract
本发明的实施例提供支持异构编程环境内所使用的主机代码和设备代码的分开编译的新颖的解决方案。本发明的实施例可操作以使用分开的设备链接操作链接嵌入在多个主机对象文件内的设备代码。本发明的实施例可以从它们各自的主机对象文件提取设备代码并且之后将其链接在一起以形成经链接的设备代码。随后可以将该经链接的设备代码嵌回到通过本发明的实施例所生成的主机对象中,可以之后将该主机对象传递给主机链接器以形成主机可执行文件。因此,通过本发明的实施例,设备代码可以分成多个文件并且之后链接在一起以形成最终可执行文件。
Description
相关申请的交叉引用
本申请要求享有于2012年5月9日提交的、题目为“SEPARATECOMPILATION OF DEVICE CODE EMBEDDED IN HOST CODE”的、申请号为61/644956的美国临时专利申请的优先权和权益,其通过援引整体并入本文。该申请和与该申请同时提交的、代理人案号为NVID-P-SC-12-0176-US1的专利申请“A METHOD AND SYSTEM FORMULTIPLE EMBEDDED DEVICE LINKS IN A HOST EXECUTABLE”相关,其通过援引整体并入本文。
技术领域
本发明的实施例总地涉及图形处理单元(GPU)和用于异构环境(例如GPU和CPU)的编译器。
背景技术
软件可执行文件典型地通过编译分开的主机对象(host object)来生成,其中每个主机对象包括源代码或主机代码的各自部分(例如以诸如C、C++等高级语言所写的)。由编译器所生成的可执行文件包括可以由中央处理单元(CPU)所执行的对象代码。最近,包括CPU和图形处理单元(GPU)的主机系统已经开始利用GPU的并行处理能力来实施否则将由CPU所实施的任务。GPU执行设备代码,而CPU执行主机代码。设备代码典型地作为单个文件嵌入在主机代码中,从而创建异构编译器环境。
常规的主机链接器或编译器从多个主机对象生成可执行文件。然而,这些常规的主机链接器不能链接嵌入在多个主机对象中的设备代码,并且因此要求任何设备代码被嵌入在单个主机对象中。例如,常规的主机链接器可以从仅包含主机代码(用于由CPU执行)的第一主机对象和包含主机代码(用于由CPU执行)和设备代码(用于由GPU执行)的第二主机对象创建可执行文件。然而,因为常规的主机链接器不能适当地链接嵌入在每个主机对象中的各自的设备代码,所以常规的主机链接器不能从每个包含各自的主机代码(用于由CPU执行)和各自的设备代码(用于由GPU执行)的多个主机对象创建可执行文件。
发明内容
因此,存在对从包含各自的主机代码和各自的设备代码的多个主机对象生成可执行文件的需要。本发明的实施例提供支持在异构编程环境内所使用的主机代码和设备代码的分开编译的新颖的解决方案。本发明的实施例可操作以使用分开的设备链接操作链接嵌入在多个主机对象文件内的设备代码。本发明的实施例可以从它们各自的主机对象文件提取设备代码并且之后将其链接在一起以形成经链接的设备代码。该经链接的设备代码随后可以被嵌回到通过本发明的实施例所生成的主机对象,可以之后将该主机对象传递给主机链接器以形成主机可执行文件。因此,通过本发明的实施例,设备代码可以分成多个文件并且之后链接在一起以形成最终可执行文件
更具体地,在一个实施例中,本发明实现为生成可执行文件的方法。方法包括编译从多个不同源文件所访问的第一部分程序代码和第二部分程序代码,其中第一部分包括将由中央处理单元(CPU)所执行的指令并且第二部分代码包括将由图形处理单元(GPU)所排外地执行的指令。在一个实施例中,第二部分代码以计算统一设备架构编程语言(CUDA)的版本所写。在一个实施例中,编译的方法进一步包括分开地编译第一部分和第二部分代码。
在一个实施例中,编译的方法进一步包括生成模拟经编码实体,其中第一部分代码可操作以使用模拟经编码实体从第二部分代码访问数据。方法还包括将经编译的第一部分代码链接在一起以产生经链接的第一部分代码。方法还包括将经编译的第二部分代码链接在一起以产生经链接的第二部分代码。在一个实施例中,将第二部分代码链接在一起的方法进一步包括生成外壳主机对象文件以及将经链接的第二部分代码嵌入在外壳主机对象文件内。
在一个实施例中,将第二部分代码链接在一起的方法进一步包括区分共享公共名称的、嵌入在第二部分代码内的经编码对象。在一个实施例中,区分经编码对象的方法进一步包括生成用于共享公共名称的经编码对象的唯一标识符。此外,方法包括生成可执行文件,其中可执行文件包括经链接的第一部分代码和经链接的第二部分代码的可执行形式。
在一个实施例中,本发明实现为用于建立可执行文件的系统。系统包括用于编译从多个不同源文件所接收的第一部分代码的第一编译器,其中第一部分包括将由中央处理单元(CPU)所执行的指令。系统还包括用于编译从多个不同源文件所接收的第二部分代码的第二编译器,其中第二部分代码包括将由图形处理单元(GPU)所排外地执行的指令。在一个实施例中,第二部分代码以计算统一设备架构编程语言(CUDA)的版本所写。在一个实施例中,第一编译器和第二编译器进一步可操作以独立地编译第一部分和第二部分代码。在一个实施例中,第二编译器进一步可操作以解释模拟经编码实体,其中第一部分代码可操作以使用模拟经编码实体从第二部分代码访问数据。
系统包括用于将经编译的第一部分代码链接在一起以产生经链接的第一部分代码的第一链接模块。系统包括用于将经编译的第二部分代码链接在一起以产生经链接的第二部分代码的第二链接模块。在一个实施例中,第二链接模块进一步可操作以生成外壳主机对象文件,其中经链接的第二部分代码嵌入在外壳主机对象文件内。在一个实施例中,第二链接模块进一步可操作以区分共享公共名称的、嵌入在第二部分代码内的经编码对象。在一个实施例中,第二链接模块进一步可操作以生成用于共享公共名称的经编码对象的唯一标识符。系统还包括用于生成可执行文件的可执行文件生成模块,其中可执行文件包括经链接的第一部分代码和经链接的第二部分代码的可执行形式。
在一个实施例中,本发明实现为用于生成可执行文件的计算机实现的方法。方法包括从自多个不同源文件所接收的非设备代码部分提取设备代码部分,其中设备代码部分包括将由图形处理单元(GPU)所排外地执行的指令。在一个实施例中,设备代码部分以计算统一设备架构编程语言(CUDA)的版本所写。
在一个实施例中,提取的方法包括与非设备代码部分分开地编译设备代码部分。在一个实施例中,编译的方法进一步包括生成模拟经编码实体,其中非设备代码部分可操作以使用模拟经编码实体从设备代码部分访问数据。方法包括使用分开的链接过程与非设备代码部分分开地链接设备代码部分以产生经链接的设备代码部分。在一个实施例中,链接的方法进一步包括生成外壳主机对象文件以及将经链接的设备代码部分嵌入在外壳主机对象文件内。
在一个实施例中,链接的方法进一步包括区分共享公共名称的、嵌入在设备代码部分内的经编码对象。在一个实施例中,区分经编码对象的方法进一步包括生成用于共享公共名称的经编码对象的唯一标识符。方法还包括生成可执行文件,其中可执行文件包括经链接的设备代码部分和非设备代码部分的可执行形式。
附图说明
附图并入此说明书中并构成其中的一部分,其示出了本公开的实施例,其中相同的标记描绘相同的元素,并且附图与描述一起用于解释本公开的原理。
图1A是根据本发明实施例的示范性链接过程的框图。
图1B是根据本发明实施例的示范性编译过程的框图。
图1C提供了根据本发明实施例的用来将主机代码阴影实体映射到其相应的设备代码实体的示范性存储器分配表格或数据结构的示例。
图1D是根据本发明实施例的用来实施链接和编译操作的示范性计算机系统平台的框图。
图2描绘了根据本发明各实施例的示范性编译过程的流程图。
图3描绘了根据本发明各实施例的示范性阴影实体创建过程的流程图。
图4是根据本发明实施例的另一个示范性编译过程的框图。
图5提供了根据本发明实施例的用来追踪先前链接操作中所使用的设备代码的示范性表格或数据结构的示例。
图6描绘了根据本发明各实施例的用于生成多个嵌入式设备链接的示范性编译过程的流程图。
具体实施方式
现在将详细参考本公开的各实施例,其示例在附图中示出。虽然结合这些实施例进行描述,但是应该理解它们并非旨在将本公开限定于这些实施例。相反,本公开旨在覆盖可以包括在如所附权利要求所定义的本公开的精神和范围内的替换、修改和等同物。此外,在本公开的下面的详细描述中,阐述了大量具体细节以提供对本公开的透彻理解。然而,应该理解本公开可以没有这些具体细节而实现。在其他实例中,没有详细描述公知的方法、步骤、部件和电路以免对本公开的方面造成不必要的混淆。
关于过程,呈现和论述了以下详细描述的一部分。尽管在本文以描述该过程的示范性操作的图片(例如图2、3和6)的形式公开了其操作和排序,但是这类操作和排序是示范性的。实施例很适合实施各种其他操作或本文图片的流程图中所述的操作的变形,以及以除本文所描绘和所描述的顺序之外的顺序实施。
如本申请中所使用的,术语控制器、模块、系统等等旨在指代计算机相关的实体,具体地,指代硬件、固件、硬件和软件的组合、软件或者执行中的软件。例如,模块可以是但不限于是在处理器上运行的进程、集成电路、对象、可执行文件、执行的线程、程序和或计算机。通过示例的方式,在计算设备上运行的应用和计算设备二者都可以是模块。一个或多个模块可以驻留在执行的线程和/或进程内,并且部件可以定位在一个计算机上和/或分布在两个或两个以上计算机之间。此外,这些模块可以从具有其上所存储的各种数据结构的各种计算机可读介质执行。
关于图1A,经编译的主机代码(例如经编译的主机代码112)可以是使用人类可读的计算机语言介质(例如C、C++、FORTRAN)所写的并且能够由微处理器(例如CPU)所执行的指令集。此外,经编译的设备代码(例如经编译的设备代码114)可以是使用人类可读的计算机语言介质(例如计算统一设备架构(CUDA))所写的并且能够由图形处理单元(例如GPU)所执行的指令集。经编译的主机代码和经编译的设备代码二者都可以是可重新定位的并且能够嵌入到主机对象文件中。另外,主机对象文件(例如主机对象110)可以是存储使用编译器所生成的并且能够用作到链接器程序(例如主机链接器150和设备链接器130)的输入的可重新定位的机器代码(例如主机对象110的经编译的主机代码112和经编译的设备代码114)的容器文件。
设备链接器130可以实现为从一个或多个对象文件接收设备代码作为输入并且生成另一个主机对象文件以包含经链接的设备代码的指令集。主机链接器150可以实现为从一个或多个对象文件接收对象代码作为输入并且输出可用于与其他主机对象文件的附加链接的结果可执行图像或可共享对象文件的指令集。根据一个实施例,主机链接器150可以能够当实施链接操作时从设备链接器130接收输出作为输入。根据一个实施例,设备链接器130可以在主机链接器150的执行之前对设备代码实施链接操作。根据本发明的一个实施例,主机链接器150可以在设备链接器130的执行之前对对象文件实施链接操作。
如由图1A所描绘的实施例所示出的,设备链接器130和主机链接器150可以组合使用以从每个包括各自的设备代码的多个主机对象生成可执行文件。例如,主机对象110可以包括经编译的主机代码112和经编译的设备代码114,而主机对象120可以包括经编译的主机代码122和经编译的设备代码124。根据一个实施例,设备链接器130可以对与主机链接器150相同的对象文件(例如主机对象110和主机对象120)实施链接操作。因此,设备链接器130可以链接经编译的设备代码114和经编译的设备代码124以创建经链接的设备代码145。在一个实施例中,经链接的设备代码145可以嵌入在主机对象140中,其中主机对象140可以是“虚拟(dummy)”主机对象或“外壳(shell)”。
主机链接器150可以生成可执行文件160作为链接主机对象110(例如包括经编译的主机代码112)、主机对象120(例如包括经编译的主机代码122)和主机对象140(例如包括经链接的设备代码145)的结果。可执行文件160可以包括经链接的设备代码145和经链接的主机代码165。在一个实施例中,经链接的主机代码165可以通过或响应于经编译的主机代码122和主机代码112的链接来创建。
在一个实施例中,主机链接器150可以当实施链接操作时将经编译的设备代码(例如114、124等)和/或经链接的设备代码(例如145)视为数据段。根据一个实施例,主机链接器150可以在经编译的主机代码(例如112、114等)或主机对象(例如110、120、140等)的链接期间忽略经编译的设备代码(例如114、124等)和/或经链接的设备代码(例如145)。在一个实施例中,经编译的设备代码114和经编译的设备代码124可以是或包括可重新定位的设备代码。此外,根据一个实施例,经链接的设备代码145可以是或包括可执行设备代码。
本发明的实施例可以使用多个设备代码入口点(“内核”)从程序的主机代码部分进入程序的设备代码部分。在某些场景下,这些入口点可以共享相同的可执行设备代码(例如能够并行执行的函数)。因此,本发明的实施例可以初始化主机对象文件以调用通用例程来访问经链接的设备代码(例如经链接的设备代码145),其之后可以允许每个入口点引用该经链接的设备代码。以此方式,相同的可执行设备代码集仍然可以对要求对其进行访问的主机代码是可访问的。
此外,本发明的实施例可以在分开的编译期间维护主机代码和设备代码之间的可见性,以致位于设备代码内的设备实体(例如全局函数、设备和常变量、纹理、表面)仍然可以对主机代码是可访问的。对于设备代码内存在的每个设备实体,可以在主机代码内创建模拟或“阴影”实体以使得主机代码能够获得访问并且从相应的设备实体收集数据。根据一个实施例,可以在预编译阶段期间创建这些阴影实体。
例如,关于图1B所描绘的实施例,源文件107和108可以每个包括未经编译的主机代码(例如分别为112-1和122-1)和未经编译的设备代码(例如分别为114-1和124-1)。未经编译的设备代码114-1可以包括设备实体114-2和114-3,设备实体114-2和114-3可以编码为未经编译的设备代码114-1之外的实体可访问的全局函数或变量。响应于这些设备实体中的每一个,可以创建相应的阴影实体并将其传递到主机编译器118。
根据一个实施例,阴影实体112-2和112-3可以在被送入主机编译器118之前在未经编译的主机代码112-1内生成以维护(分别地)到未经编译的设备代码114-1的设备实体114-2和114-3的逻辑链接。此外,可以给予阴影实体112-2和112-3和与每个阴影实体相对应的设备实体相同的链接类型。例如,如果设备实体114-2和114-3被指派为“静态”类型,则阴影实体112-2和112-3也可以被给予“静态”类型。以类似的方式,未经编译的主机代码122-1的阴影实体122-2和122-3可以在被送入主机编译器118之前以上述方式与未经编译的设备代码124-1的设备实体124-2和124-3(分别地)一致地生成。此外,设备代码编译器116可以继续编译未经编译的设备代码114-1和124-1,包括前述的设备实体。
除接收未经编译的主机代码112-1和122-1以外,主机代码编译器118可以附加地接收由设备代码编译器116所生成的结果输出以产生主机对象110和120。因此,经编译的主机代码112可以接收阴影实体112-2和112-3,而经编译的主机代码122可以接收阴影实体122-2和122-3。因此,一旦初始化并执行,经编译的主机代码112就可以访问来自存储在经编译的设备代码114中的设备实体114-2和114-3的数据,然而经编译的主机代码122可以访问来自存储在经编译的设备代码124中的设备实体124-2和124-3的数据。
此外,关于图1C所描绘的实施例,表格300可以是存储在存储器中的表格,其用来在代码执行期间将所创建的每个阴影实体映射到存储器中的地址。根据一个实施例,一旦执行主机对象文件,就可以执行存储在主机对象文件内的注册码,其将阴影实体的地址映射到设备实体的名称。
另外,本发明的实施例还可以解决在阴影实体的映射期间的涉及来自共享同一名称的分开的文件的设备实体的名称冲突。例如,根据一个实施例,来自不同模块的共享同一名称的两个不同的设备实体,每个具有“静态”链接类型,其可以附有唯一前缀到“静态”链接设备实体的名称的每个实例,从而使得设备实体在最终经链接的设备图像(例如图1A的经链接的设备代码145)中可唯一地标识。
计算机系统环境
图1D示出了根据本发明的一个实施例的计算机系统100。计算机系统100描绘了根据本发明实施例的基本计算机系统的部件,其提供用于某基于硬件的和基于软件的功能性的执行平台。一般地,计算机系统100包括至少一个CPU101、系统存储器115和至少一个图形处理器单元(GPU)110。
CPU101可以经由桥部件/存储器控制器(未示出)耦连到系统存储器115或者可以经由CPU101内部的存储器控制器(未示出)直接耦连到系统存储器115。GPU110可以耦连到显示器112。一个或多个附加GPU可以可选地耦连到系统100以进一步增大其计算能力。GPU110耦连到CPU101和系统存储器115。GPU110可以实现为独立部件、设计为经由连接器(例如AGP槽、PCI-Express槽等)耦连到计算机系统100的独立图形卡、独立集成电路裸片(die)(例如直接安装在主板上)或者实现为包括在计算机系统芯片集部件(未示出)的集成电路裸片内的集成GPU。此外,可以包括本地图形存储器114用于GPU100以实现高带宽图形数据存储。
CPU102和GPU110还可以集成到单个集成电路裸片中并且CPU和GPU可以共享各种资源,诸如指令逻辑、缓冲区、功能单元等等,或者可以提供分开的资源用于图形和通用操作。GPU可以进一步集成到核心逻辑部件中。
系统100可以实现为例如具有耦连到专用图形渲染GPU110的强大通用CPU101的桌面计算机系统或服务器计算机系统。在这类实施例中,可以包括部件,其增加外围总线、专业音频/视频部件、IO设备等等。应该理解GPU110的并行架构可以具有相对于CPU101的显著的性能优势。
图2呈现了根据本发明的各实施例的、提供示范性计算机实现的编译过程的流程图。
在步骤206,将两个或两个以上的主机对象文件送入设备代码链接器程序,每个主机对象文件包含能够由GPU读并执行的设备代码对象。
在步骤207,设备代码链接器程序对包含在在步骤206被送入设备链接器程序的每个主机对象文件内的设备代码对象进行操作,以产生经链接的设备代码。当对主机对象文件进行操作时,设备代码链接器忽略不包含设备代码的对象。
在步骤208,将在步骤207期间所生成的结果经链接的设备代码嵌回到由设备代码链接器程序所创建的充当“虚拟”主机对象或“外壳”的主机对象文件中。主机对象文件可以处在用作用于主机链接器程序的输入的情况中。
在步骤209,主机链接器程序对在步骤206被送入设备链接器程序的主机对象文件以及在步骤208期间所生成的主机对象文件进行操作。主机链接器程序生成包含能够由计算机系统的GPU所执行的经链接的设备代码的可执行形式以及能够由计算机系统的CPU所执行的经链接的主机代码的可执行形式的文件。
图3呈现了根据本发明的各实施例的、提供示范性计算机实现的阴影实体创建过程的流程图。
在步骤306,在预编译阶段期间从包括包含设备实体的设备代码和主机代码二者的源文件读主机代码中可访问的设备实体。
在步骤307,对于在步骤306所确定的每个设备实体,创建相应的模拟或“阴影”实体并且将其传递到主机代码编译器。这些相应的阴影实体可以维护到其各自的设备实体的逻辑链接并且可以被给予与每个阴影实体相对应的设备实体相同的链接类型。
在步骤308,设备代码编译器接收并编译在步骤306用作输入的源文件的设备代码。之后将结果输出送入主机代码编译器。
在步骤309,主机代码编译器对在步骤306用作输入的源文件的主机代码以及在步骤308由设备编译器所生成的结果输出进行操作,该主机代码包括在步骤307所传递到主机编译器的阴影实体。
在步骤310,主机代码编译器生成主机对象文件,其封装经编译形式的设备代码以及主机代码二者,设备代码包括在步骤306所确定的设备实体,主机代码包括在步骤307所创建的每个设备实体的相应阴影实体。
在主机可执行文件中嵌入多个设备链接的示范性方法
本发明的实施例可以支持以允许分组(“文件集”)被分开地链接的方式对设备代码进行自然独立分组。例如,在大型工程设置中,可以是一个文件集包含用于处理第一任务(例如图像处理)的设备代码,同时另一文件集可以处理与第一任务独立的第二任务(例如并行计算)。来自不同分组的设备代码在编译或链接过程期间可以不直接交互,并且因此可以不相互影响。因此,本发明的实施例使得第一文件组能够链接到一起以形成经链接的设备代码的一个可执行形式,而第二文件组可以分开地链接到一起成为经链接的设备代码的另一个可执行形式。之后可以将这些可执行形式放置并打包在其中CPU和GPU可以访问其各自的文件并实施其各自的任务的同一个可执行文件内。
如图4所描绘的实施例所示出的,设备链接器(例如设备链接器130-1和130-2)和主机链接器(例如主机链接器150)可以组合使用,以生成包括“设备链接”或经链接的设备代码的这些多个部分的可执行文件。多个设备链接可以在可产生最佳代码生成的链接操作的实施期间增大分析精度。此外,以由本发明的实施例所描述的方式嵌入多个设备链接通过允许设备链接独立于由外部供应商所进行的其他设备链接的任何用户知识而发生来支持供应商库的链接。
关于图4,文件集600可以包含可逻辑地相互相关并且功能上与文件集700不同的代码。例如,文件集600的主机对象110和120可以包含用于在图像处理过程中使用的代码,而文件集700的主机对象130和150可以包含用于在并行计算中使用的指令。因此,文件集600和文件集700在编译或链接期间可以不直接交互,并且因此可以不相互影响。
设备链接器130-1可以链接经编译的设备代码140和经编译的设备代码124以创建经链接的设备代码145(例如如以上所论述的)。此外,设备链接器130-2可以链接经编译的设备代码134和经编译的设备代码154以创建经链接的设备代码245(例如与以上所论述的经链接的设备代码145的生成相类似的)。根据一个实施例,设备链接器130-1和设备链接器130-2可以是在分开的时间所唤起的同一链接器。经链接的设备代码(例如145和245)的每个部分可以是分别由设备链接器130-1和130-2所生成的各自的主机对象的一部分或者嵌入在其中。
之后,主机链接器150可以生成可执行文件160作为链接主机对象110(例如包括经编译的主机代码112)、主机对象120(例如包括经编译的主机代码122)、主机对象130(例如包括经编译的主机代码132)、主机对象150(例如包括经编译的主机代码152)、主机对象140(例如包括经链接的设备代码145)和主机对象240(例如包括经链接的设备代码245)的结果。可执行文件160可以包括经链接的主机代码(例如165)和经链接的设备代码(例如145、245等)的至少一部分。在一个实施例中,经链接的主机代码165可以通过或响应于主机代码112、122、132和152的链接创建。因此,可以创建包括经链接的主机代码(例如165)和经链接的设备代码(例如145、245等)的多个部分的可执行文件(例如160)。
此外,本发明的实施例可以通过使用唯一标识符来唯一地标识所链接的每个设备代码对象。通过使用唯一标识符,本发明的实施例可以提供对设备代码对象将不被链接到同一可执行文件内的两个不同的经链接的设备代码中的更好保证。以此方式,本发明的实施例可以提供确保嵌入在主机对象内的设备代码可以根据常规的编程语言(例如C++)的协议被唯一地标识并链接的保障。
图5呈现了根据本发明实施例的、设备代码对象如何可以被唯一地标识的示范性描述。设备链接器表格400可以是存储在存储器中的表格,其唯一地标识由设备链接器130在链接操作的实施期间所使用的每个设备代码连同这些实体所相关联的主机对象(“主机对象祖先(ancestor)”)。设备链接器130可以生成唯一标识符用于参与设备链接过程的每个设备对象(例如“module_id”列)。
根据一个实施例,设备驱动器130可以参考设备链接器表格400以确定哪些设备对象已经参与链接过程。可以由主机链接器150阻止已经被标识为先前参与者的那些设备对象参与主机链接操作。因此,可以阻止对建立包含先前参与者的可执行文件的尝试成功。例如,关于设备链接器表格400,考虑主机对象110(包含经编译的设备代码114)和主机对象120(包含经编译的设备代码124)链接到一起以产生经链接的设备代码145,可以阻止主机对象110和120二者参与随后的设备链接操作。如果主机对象110和包含其自己的经编译的设备代码(未画出)的另一个主机对象文件阐述为输入以由设备链接器130所链接,则设备链接器130可以参考设备链接器器表格400并确定主机对象110已经是先前链接操作的参与者(例如经链接的设备代码145)。因此,设备链接器130可以忽略主机对象110并且仅链接包含先前未被链接的代码的对象。
图6呈现了根据本发明的各实施例的、提供示范性的计算机实现的设备代码编译过程的流程图。
在步骤406,将属于用作输入的多个主机对象文件集之中的文件集的每个主机对象文件送入设备代码链接器程序。
在步骤407,设备代码链接器程序搜索被分派给在步骤406所送入的每个主机对象文件的唯一标识码(例如module_id),以确定主机对象文件是否已经参与先前的设备代码链接过程。
在步骤408,关于由设备代码链接器所接收的主机对象文件是否已经参与先前的设备代码链接过程做出确定。如果主机对象文件尚未参与先前的设备代码链接操作,那么设备代码链接器程序对嵌入在在步骤406被送入设备链接器程序的主机对象文件内的设备代码进行操作,如步骤410所详细描述的。如果主机对象文件之一已经参与先前的设备代码链接操作,那么妨碍该主机对象文件参与当前的设备链接操作,如步骤409中所详细描述的。
在步骤409,已经确定在步骤406所送入的主机对象文件已经参与先前的设备代码链接操作,并且因此妨碍其参与当前的设备链接操作。
在步骤410,已经确定主机对象文件尚未参与先前的设备代码链接操作,并且因此设备代码链接器程序对包含在被送入设备代码链接器程序的主机对象文件内的设备代码进行操作并且产生经链接的设备代码。设备代码链接器程序将结果经链接的设备代码嵌入到由设备代码链接器程序所生成的主机对象文件内。
在步骤411,为在步骤410期间所使用的每个主机对象文件分派唯一标识码(例如module_id),其提供关于由设备代码链接器程序使用存储在存储器中的表格所追踪的当前链接操作的信息。
在步骤412,主机链接器程序产生嵌入在在步骤406被送入设备代码链接器程序的相同主机对象文件内的主机代码以及嵌入在在步骤410所生成的主机对象文件内的经链接的设备代码的可执行形式。
在步骤413,主机链接器程序生成封装在步骤412所生成的每个可执行的文件的可执行文件。
虽然前述公开使用具体的框图、流程图和示例阐述了各实施例,但是本文所描述和/或所示出的每个框图部件、流程图步骤、操作和/或部件可以使用宽范围的硬件、软件或固件(或其任意组合)配置来独立地和/或共同地实现。此外,包含在其他部件内的部件的任意公开应该视为示例,因为其他架构可以实现以达到相同的功能。
本文所描述和/或所示出的过程参数和步骤的顺序仅通过示例的方式给出。例如,虽然本文所描述和/或所示出的步骤可以以特定的次序显示或论述,但是这些步骤不一定需要按所示出或所论述的次序实施。本文所描述和/或所示出的各示范性方法还可以省略本文所描述和/或所示出的步骤中的一个或多个或者在所公开的步骤之外包括附加的步骤。
虽然在本文中已经在全功能计算系统的上下文中描述和/或示出了各实施例,但是这些示范性实施例可以以各种各样的形式分布为程序产品,不管用来实际实行分布的计算机可读介质的特定类型。本文所公开的实施例还可以使用实时某些任务的软件模块实现。这些软件模块可以包括脚本、批或可以存储在计算机可读存储器介质上或在计算系统中的其他可执行文件。这些软件模块可以将计算系统配置为实施本文所公开的示范性实施例中的一个或多个。本文所公开的软件模块中的一个或多个可以在云计算环境中实现。云计算环境可以经由互联网提供各种服务和应用。这些基于云的服务(例如软件即服务、平台即服务、基础设施即服务)可以通过Web浏览器或其他远程接口访问。本文所描述的各种功能可以通过远程桌面环境或任意其他基于云的计算环境提供。
出于解释的目的,前面的描述已经关于具体实施例进行了描述。然而,以上示例性的论述不旨在是详尽的或将本发明限定于所公开的确切形式。基于以上公开的许多修改和变化是可能的。选择并描述实施例以更好地解释本发明的原理和其实际应用,从而使得本领域技术人员能够更好地利用本发明和各实施例,包括如可能适合所设想的特定使用的各种修改。
因此,描述了根据本发明的实施例。虽然本公开已经以特定实施例进行了描述,但是应该理解本发明不应该解释为由这类实施例所限制,而应该根据以下权利要求进行解释。
Claims (20)
1.一种生成可执行文件的方法,所述方法包括:
编译从多个不同源文件所访问的第一部分程序代码和第二部分程序代码,其中所述第一部分包括将由中央处理单元(CPU)所执行的指令并且所述第二部分代码包括将由图形处理单元(GPU)所排外地执行的指令;
将经编译的所述第一部分代码链接在一起以产生经链接的第一部分代码;
将经编译的所述第二部分代码链接在一起以产生经链接的第二部分代码;以及
生成所述可执行文件,其中所述可执行文件包括所述经链接的第一部分代码和所述经链接的第二部分代码的可执行形式。
2.如权利要求1所述的方法,其中所述编译进一步包括分开地编译所述第一部分和所述第二部分代码。
3.如权利要求2所述的方法,其中所述编译进一步包括生成模拟经编码实体,其中所述第一部分代码可操作以使用所述模拟经编码实体从所述第二部分代码访问数据。
4.如权利要求1所述的方法,其中所述第二部分代码以计算统一设备架构编程语言(CUDA)的版本所写。
5.如权利要求1所述的方法,其中所述将所述第二部分代码链接在一起进一步包括生成外壳主机对象文件以及将所述经链接的第二部分代码嵌入在所述外壳主机对象文件内。
6.如权利要求1所述的方法,其中所述将所述第二部分代码链接在一起进一步包括区分共享公共名称的、嵌入在所述第二部分代码内的经编码对象。
7.如权利要求6所述的方法,其中所述区分经编码对象进一步包括生成用于共享所述公共名称的所述经编码对象的唯一标识符。
8.一种用于建立可执行文件的系统,所述系统包括:
第一编译器,用于编译从多个不同源文件所接收的第一部分代码,其中所述第一部分包括将由中央处理单元(CPU)所执行的指令;
第二编译器,用于编译从所述多个不同源文件所接收的第二部分代码,其中所述第二部分代码包括将由图形处理单元(GPU)所排外地执行的指令;
第一链接模块,用于将经编译的所述第一部分代码链接在一起以产生经链接的第一部分代码;
第二链接模块,用于将经编译的所述第二部分代码链接在一起以产生经链接的第二部分代码;以及
可执行文件生成模块,用于生成所述可执行文件,其中所述可执行文件包括所述经链接的第一部分代码和所述经链接的第二部分代码的可执行形式。
9.如权利要求8所述的系统,其中所述第一编译器和第二编译器进一步可操作以独立地编译所述第一部分和所述第二部分代码。
10.如权利要求9所述的系统,其中所述第二编译器进一步可操作以解释模拟经编码实体,其中所述第一部分代码可操作以使用所述模拟经编码实体从所述第二部分代码访问数据。
11.如权利要求8所述的系统,其中所述第二部分代码以计算统一设备架构编程语言(CUDA)的版本所写。
12.如权利要求8所述的系统,其中所述第二链接模块进一步可操作以生成外壳主机对象文件,其中所述经链接的第二部分代码嵌入在所述外壳主机对象文件内。
13.如权利要求8所述的系统,其中所述第二链接模块进一步可操作以区分共享公共名称的、嵌入在所述第二部分代码内的经编码对象。
14.如权利要求8所述的系统,其中所述第二链接模块进一步可操作以生成用于共享所述公共名称的所述经编码对象的唯一标识符。
15.一种生成可执行文件的计算机实现的方法,所述方法包括:
从自多个不同源文件所接收的非设备代码部分提取设备代码部分,其中所述设备代码部分包括将由图形处理单元(GPU)所排外地执行的指令;
使用分开的链接过程与所述非设备代码部分分开地链接所述设备代码部分以产生经链接的设备代码部分;以及
生成所述可执行文件,其中所述可执行文件包括所述经链接的设备代码部分和所述非设备代码部分的可执行形式。
16.如权利要求15所述的方法,其中所述提取进一步包括与所述非设备代码部分分开地编译所述设备代码部分。
17.如权利要求16所述的方法,其中所述编译进一步包括生成模拟经编码实体,其中所述非设备代码部分可操作以使用所述模拟经编码实体从所述设备代码部分访问数据。
18.如权利要求15所述的方法,其中所述设备代码部分以计算统一设备架构编程语言(CUDA)的版本所写。
19.如权利要求15所述的方法,其中所述链接进一步包括生成外壳主机对象文件以及将所述经链接的设备代码部分嵌入在所述外壳主机对象文件内。
20.如权利要求15所述的方法,其中所述链接进一步包括区分共享公共名称的、嵌入在所述设备代码部分内的经编码对象。
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201261644956P | 2012-05-09 | 2012-05-09 | |
US61/644,956 | 2012-05-09 | ||
US13/850,207 | 2013-03-25 | ||
US13/850,207 US9483235B2 (en) | 2012-05-09 | 2013-03-25 | Method and system for separate compilation of device code embedded in host code |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103389908A true CN103389908A (zh) | 2013-11-13 |
Family
ID=49475715
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2013101703917A Pending CN103389908A (zh) | 2012-05-09 | 2013-05-09 | 用于分开编译嵌入在主机代码中的设备代码的方法和系统 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN103389908A (zh) |
DE (1) | DE102013208418A1 (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105426226A (zh) * | 2015-11-24 | 2016-03-23 | 无锡江南计算技术研究所 | 一种异构代码融合的编译和生成方法 |
CN105740036A (zh) * | 2014-12-29 | 2016-07-06 | 辉达公司 | 用于支持代码的编译时间定制的编译器的系统和方法 |
CN107783782A (zh) * | 2016-08-25 | 2018-03-09 | 萨思学会有限公司 | 用于节点装置基于gpu的并行处理的编译 |
US10102015B1 (en) | 2017-06-22 | 2018-10-16 | Microsoft Technology Licensing, Llc | Just in time GPU executed program cross compilation |
US10241766B2 (en) | 2017-06-22 | 2019-03-26 | Microsoft Technology Licensing, Llc | Application binary interface cross compilation |
US10289393B2 (en) | 2017-06-22 | 2019-05-14 | Microsoft Technology Licensing, Llc | GPU-executed program sequence cross-compilation |
US10657698B2 (en) | 2017-06-22 | 2020-05-19 | Microsoft Technology Licensing, Llc | Texture value patch used in GPU-executed program sequence cross-compilation |
CN116893818A (zh) * | 2023-07-24 | 2023-10-17 | 太初(无锡)电子科技有限公司 | 高兼容性的异构编译方法及异构编译器 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080109795A1 (en) * | 2006-11-02 | 2008-05-08 | Nvidia Corporation | C/c++ language extensions for general-purpose graphics processing unit |
US20100153934A1 (en) * | 2008-12-12 | 2010-06-17 | Peter Lachner | Prefetch for systems with heterogeneous architectures |
CN101937343A (zh) * | 2010-09-17 | 2011-01-05 | 上海交通大学 | 异构多核虚拟执行环境的后端翻译框架实现的方法 |
WO2011053303A1 (en) * | 2009-10-30 | 2011-05-05 | Intel Corporation | Two way communication support for heterogenous processors of a computer platform |
US20110314458A1 (en) * | 2010-06-22 | 2011-12-22 | Microsoft Corporation | Binding data parallel device source code |
-
2013
- 2013-05-07 DE DE201310208418 patent/DE102013208418A1/de active Pending
- 2013-05-09 CN CN2013101703917A patent/CN103389908A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080109795A1 (en) * | 2006-11-02 | 2008-05-08 | Nvidia Corporation | C/c++ language extensions for general-purpose graphics processing unit |
US20120066668A1 (en) * | 2006-11-02 | 2012-03-15 | Nvidia Corporation | C/c++ language extensions for general-purpose graphics processing unit |
US20100153934A1 (en) * | 2008-12-12 | 2010-06-17 | Peter Lachner | Prefetch for systems with heterogeneous architectures |
WO2011053303A1 (en) * | 2009-10-30 | 2011-05-05 | Intel Corporation | Two way communication support for heterogenous processors of a computer platform |
US20110314458A1 (en) * | 2010-06-22 | 2011-12-22 | Microsoft Corporation | Binding data parallel device source code |
CN101937343A (zh) * | 2010-09-17 | 2011-01-05 | 上海交通大学 | 异构多核虚拟执行环境的后端翻译框架实现的方法 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105740036A (zh) * | 2014-12-29 | 2016-07-06 | 辉达公司 | 用于支持代码的编译时间定制的编译器的系统和方法 |
US10241761B2 (en) | 2014-12-29 | 2019-03-26 | Nvidia Corporation | System and method for compiler support for compile time customization of code |
CN105740036B (zh) * | 2014-12-29 | 2019-04-23 | 辉达公司 | 用于支持代码的编译时间定制的编译器的系统和方法 |
CN105426226A (zh) * | 2015-11-24 | 2016-03-23 | 无锡江南计算技术研究所 | 一种异构代码融合的编译和生成方法 |
CN105426226B (zh) * | 2015-11-24 | 2018-07-06 | 无锡江南计算技术研究所 | 一种异构代码融合的编译和生成方法 |
CN107783782A (zh) * | 2016-08-25 | 2018-03-09 | 萨思学会有限公司 | 用于节点装置基于gpu的并行处理的编译 |
US10102015B1 (en) | 2017-06-22 | 2018-10-16 | Microsoft Technology Licensing, Llc | Just in time GPU executed program cross compilation |
US10241766B2 (en) | 2017-06-22 | 2019-03-26 | Microsoft Technology Licensing, Llc | Application binary interface cross compilation |
US10289393B2 (en) | 2017-06-22 | 2019-05-14 | Microsoft Technology Licensing, Llc | GPU-executed program sequence cross-compilation |
US10657698B2 (en) | 2017-06-22 | 2020-05-19 | Microsoft Technology Licensing, Llc | Texture value patch used in GPU-executed program sequence cross-compilation |
CN116893818A (zh) * | 2023-07-24 | 2023-10-17 | 太初(无锡)电子科技有限公司 | 高兼容性的异构编译方法及异构编译器 |
Also Published As
Publication number | Publication date |
---|---|
DE102013208418A1 (de) | 2013-11-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103389908A (zh) | 用于分开编译嵌入在主机代码中的设备代码的方法和系统 | |
US9632761B2 (en) | Distribute workload of an application to a graphics processing unit | |
CN111566616B (zh) | 多处理器系统的编程流程 | |
CN101799760B (zh) | 生成任意目标架构的并行单指令多数据代码的系统和方法 | |
US9134974B2 (en) | Source code separation and generation for heterogeneous central processing unit (CPU) computational devices | |
Nugteren et al. | Introducing'Bones' a parallelizing source-to-source compiler based on algorithmic skeletons | |
DE202008017916U1 (de) | Virtuelle Architektur und virtueller Befehlssatz für die Berechnung paralleler Befehlsfolgen | |
CN101673391A (zh) | 流水线化的图像处理引擎 | |
Giorgi et al. | Axiom: A scalable, efficient and reconfigurable embedded platform | |
US11900088B2 (en) | Method for generating a binding between a C/C++ library and an interpreted language, and carrying out the method to transform a three- dimensional (3D) model | |
JP6967597B2 (ja) | 設定可能な数のアクティブなコアを有する画像処理プロセッサおよびサポートする内部ネットワーク | |
CN104423948B (zh) | 自动化脚本运行方法及装置 | |
Montella et al. | Virtualizing high-end GPGPUs on ARM clusters for the next generation of high performance cloud computing | |
Genius et al. | Virtual yet precise prototyping: An automotive case study | |
CN105279007B (zh) | 多核处理器的模拟方法及装置 | |
TW201419149A (zh) | 用於將嵌入於主機碼之裝置碼個別編譯的方法與系統 | |
CN105183485A (zh) | 一种可视化软硬件协同开发方法 | |
CN111803950B (zh) | 网页游戏的数据处理方法、装置、电子设备及存储介质 | |
US20170300330A1 (en) | Isa extensions for synchronous coalesced accesses | |
TW201413588A (zh) | 用於主機可執行檔中多個嵌入裝置連結的方法與系統 | |
CN103389896A (zh) | 用于主机可执行文件中多个嵌入式设备链接的方法和系统 | |
zu Berge et al. | CAMPVis A Game Engine-inspired Research Framework for Medical Imaging and Visualization | |
US8694975B2 (en) | Programming system in multi-core environment, and method and program of the same | |
Ahmed | OpenCL framework for a CPU, GPU, and FPGA Platform | |
Truscan et al. | A model-based design process for the segbus distributed architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20131113 |