统一中间表示的制作方法

文档序号:11142226阅读:350来源:国知局
统一中间表示的制造方法与工艺

本专利文档的公开内容的一部分包含受到(版权或掩模作品权)保护的材料。由于本专利文档或本专利公开内容出现在专利与商标局专利文件或记录中,因此(版权或掩模作品权)所有人不反对任何人对本专利文档或本专利公开内容的拓制,但会以其他方式保留任何形式的所有(版权或屏蔽作品权)权利。



背景技术:

本公开整体涉及计算机编程领域。更具体地讲,但并非作为限制,本申请涉及用于编程图形和通用并行计算应用的技术,这些图形和应用可以被编译成通用中间表示,该通用中间表示可以进一步被编译以在各种图形和计算处理器上执行。

计算机和其他计算设备通常具有至少一个可编程处理元件,通常被称为中央处理单元(CPU)。它们常常还具有其他可编程处理器,其用于各种类型,诸如图形处理操作的专门处理,因此通常被称为图形处理单元(GPU)。GPU通常包括多个内核或处理元件,其被设计成在并行数据流上执行相同的指令,使得它们比通用CPU更有效,通用CPU用于其中并行处理大块数据的算法。通常,CPU充当主机,并且向GPU传递专门的并行任务。

尽管GPU一开始是为了呈现图形而开发的,并保持经常用于该目的,但当前的GPU支持一种编程范式,该编程范式允许除了将GPU用作图形处理器之外,还可将GPU用作通用并行处理单元。这种范式允许实施与通过以更一般的非面向图形的方式向GPU计算硬件赋予访问来呈现图形不相关的算法。

已经开发了几种框架用于具有CPU和GPU的异质计算平台。这些框架包括来自Apple Inc.的Metal框架,但业内可以使用其他框架。一些框架关注的是将GPU用于一般计算任务,从而允许任何应用将GPU并行处理功能用于不止图形应用。其他框架关注将GPU用于图形处理,并提供API用于呈现二维(2D)和三维(3D)图形。Metal框架支持GPU加速的高级3D图形呈现以及数据并行计算工作负载。

Metal和其他框架提供了类似C的开发环境,其中用户能够创建应用,以运行于各种不同类型的CPU、GPU、数字信号处理器(DSP)和其他处理器上。一些框架还提供了编译器和运行环境,其中可以在异质计算系统内编译和执行代码。在使用一些框架时,开发者能够使用单个统一的语言将当前使用的所有处理器确定为目标。这是通过为开发者提供以类似方式对这些架构的全部进行概念化的抽象平台模型和应用编程接口(API),以及跨异质架构支持数据和任务并行化的执行模型而实现的。Metal具有对应的着色语言以描述图形着色器和计算函数两者,这可以在构建时间期间编译并随后在运行时加载。Metal还支持Metal着色语言代码的运行时编译。

可以从主机(例如CPU)将任务卸载到计算机系统中的任何可用GPU。使用Metal或其他框架,程序员能够编写将运行于供应商已经为其提供对应的框架特有驱动程序的任何GPU上的程序。在执行Metal或其他框架程序时,一系列API调用配置该系统以便执行,嵌入式编译器编译Metal或其他框架代码,并且运行时异步地协调并行内核和着色器之间的执行。应用可以使用多个框架的功能,在该应用的框架特有部分之间共享数据。因为开发者可能不知道将执行应用的实际CPU或GPU,所以开发者不能将源代码编译成用于最终用户设备的纯二进制文件。

典型的基于框架的系统获取源代码并通过最终用户系统上的嵌入式编译器运行它,来为该系统上可用的目标GPU生成可执行代码。然后,将可执行代码或可执行代码的部分发送到目标GPU并执行。然而,开发者会更希望不必将其着色器和内核作为源代码传输,而是离线编译其着色器和内核。此外,每种源代码语言都需要最终用户设备上的能够编译源代码语言的嵌入式编译器。因此,在本领域中需要一种方法,用于向独立于源代码语言的运行环境提供软件而不暴露用于生成着色器或内核代码的源代码。



技术实现要素:

一种系统通过将源代码语言编译成统一的中间表示而将源代码语言与最终执行环境解耦,并符合一种语言模型,该语言模型既允许并行图形操作,又允许通用计算操作。然后,中间表示可被分发到最终用户计算机,其中嵌入式编译器可以将中间表示编译成以该最终用户设备中可用的CPU和GPU为目标的可执行二进制文件。该中间表示足以定义图形和非图形计算内核和着色器两者。

在安装时或稍晚,可以针对给定最终用户计算系统的特定目标硬件来编译中间表示文件。给定计算系统中的CPU或其他主机设备可以编译中间表示文件,以生成针对系统内的硬件目标,诸如GPU的指令集架构二进制文件。

在运行时,可以打开二进制文件,并从二进制文件检索一个或多个内核和着色器。然后可以将内核和着色器存储于存储器中,并且正在执行的应用可以经由运行环境向GPU递送每个内核和着色器以用于执行。

考虑本文给出的方法的以下详细描述,这些和其他特征和优点对于本领域的普通技术人员而言将变得显而易见。

附图说明

图1以框图的形式示出了根据一个实施方案的一种用于统一中间表示的计算机系统。

图2以框图的形式示出了根据一个实施方案的用于统一中间表示的开发者系统和最终用户设备的集合。

图3以框图的形式示出了根据一个实施方案的一种采用统一中间表示的多阶段编译器系统。

图4以框图的形式示出了根据一个实施方案的一种用于从中间表示文件形成可执行二进制文件的计算机系统和技术。

图5以框图的形式示出了根据一个实施方案的一种用于从中间表示文件形成可执行二进制文件的计算机系统和技术。

图6以流程图的形式示出了根据一个实施方案的一种用于生成和使用统一中间表示的技术。

具体实施方式

在以下描述中,为了解释的目的,阐述了很多具体细节以便提供对发明的彻底理解。然而,对本领域的技术人员而言显而易见的是,可以在不存在这些具体细节的情况下实践本发明。在其他实例中,结构和设备被以框图的形式示出,以便避免不必要地模糊本发明。没有下标或后缀的数字援引被理解为援引对应于所援引数字的下标和后缀的所有实例。此外,本公开中所使用的语言已主要被选择用于可读性和指导性目的,并且可能没有被选择为划定或限定本发明的主题,从而诉诸于所必需的权利要求以确定此类发明主题。在说明书中提到“一个实施方案”或“实施方案”意指在本发明的至少一个实施方案中包括的结合该实施方案描述的特定特征、结构或特性,并且多次提到“一个实施方案”或“实施方案”不应被理解为全部必然地参考相同的实施方案。

尽管以下描述中的一些是结合特定框架的实施来撰写的,但本文描述的技术不受此限制。具体地讲,一些实施方案可以使用编程语言扩展,这些扩展允许开发者控制在CPU或GPU上执行的内核和着色器使用的低层级数据结构而不需要高层级API的开销和性能惩罚。

现在参考图1,示出了根据一个实施方案的计算系统100的框图。计算系统100包括CPU 110、GPU 130。在图1所示的实施方案中,CPU 110和GPU 130包括在独立的集成电路(IC)或封装件上。然而,在其他实施方案中,CPU 110和GPU 130或它们的功能集合可以被包括在单个IC或封装件中。

此外,计算系统100还包括可以由CPU 110和GPU 130访问的系统存储器140。在各种实施方案中,计算系统100可以包括超级计算机、台式计算机、膝上型电脑、视频游戏机、嵌入式设备、手持设备(例如移动电话、智能电话、MP3播放器、相机、GPS设备或其他移动设备)或包括或被配置为包括GPU的任何其他设备。尽管图1中未示出,计算系统100还可以包括计算系统的常规元件,包括用于显示计算系统100的内容(例如图形、视频等)的显示设备(例如阴极射线管、液晶显示器、等离子体显示器等),以及输入设备(例如键盘、触摸板、鼠标等)、存储设备(例如硬盘、光盘等)和通信设备(例如网络接口)。根据需要可以包括任何其他元件。尽管被图示为由公共通信链路150耦接,但可以根据需要采用多个链路150,其中CPU 110和GPU 130连接到独立但互连的链路150。

GPU 130通过执行某些特殊函数,诸如图形处理任务和数据并行一般计算任务来辅助CPU 110,通常能够比CPU 110在软件中执行它们更快。

GPU 130通过链路150与CPU 110和系统存储器140耦接。链路150可以是计算机系统中使用的任何类型的总线或通信结构,包括外围部件接口(PCI)总线、加速图形端口(AGP)总线、PCI快速(PCIE)总线或另一种链路,包括非总线链路。如果采用多个链路150,它们可以是不同类型的。

除了系统存储器140之外,计算系统100可以包括耦接到GPU 130以及链路150的本地存储器120。本地存储器120可以由GPU 130用于提供对特定数据(诸如被频繁使用的数据)的访问,这种访问比数据存储在系统存储器140中可能的速度更快。本地存储器120还可以由CPU 110用于提供对诸如本地存储器120中存储的二进制文件的数据的访问。在一些实施方案中,可以为CPU 110和GPU 130使用独立的本地存储器,而不是共享公共本地存储器120。

尽管图1中示出了单个CPU 110和GPU 130,但各实施方案可以根据需要采用任意数量的CPU 110和GPU 130。在采用多个CPU 110和GPU 130时,CPU 110和GPU 130中的每个都可以是不同类型和架构的。此外,计算机系统100可以采用一个或多个专用协处理器设备(图1中未示出),诸如密码协处理器,其可以根据需要利用链路150或其他链路耦接到CPU 110和GPU 130中的一个或多个。

现在转向图2,示出了分布式计算环境的一个实施方案的框图。

可以编程控制主应用210以在任何最终用户设备230A/230B上执行。在开发者系统220上将用于应用210的源代码编译成可以在最终用户设备230A或230B中的任一个上执行的形式(在下文中更详细地描述),即使最终用户设备230A包含多个处理器240,其每个具有多个并行处理元件250,而最终用户设备230B仅包含单个处理器240,该处理器具有不同数量的并行处理元件250。在该实施方案中,应用210最终执行所在的处理器240可以具有不同架构和操作特性。处理器240可以是任何期望类型的处理器,例如CPU、GPU、现场可编程门阵列或专用集成电路,只要该类型处理器240有适当的驱动程序即可。尽管图2中为了清晰仅示出了两个最终用户设备230A/B,但可以使用任意数量的最终用户设备230,其每个都可以具有任意数量的处理器250和任意数量的并行处理元件250。

开发者设备220还可以包括一个或多个处理器(图2中未示出),其可以与应用210预期操作所在的处理器240相同或不同。开发者设备220可以经由各种类型的连接耦接到每个最终用户设备230A/B,所述连接包括直接连接、总线连接、局域网(LAN)连接、互联网连接等。或者,可以使用物理介质在开发者系统220和最终用户设备230A/B之间进行传输。在另一个替代方案中,从开发者系统220向最终用户设备230A/B分发软件可以通过中间分布服务器260,诸如云服务器。最终用户设备,诸如最终用户设备230B可以从中间分布服务器260请求软件;另选地,中间分布服务器260可以向最终用户设备230B推送软件。在开发者是向服务器260托管的应用商店提供应用的第三方时,应用商店的运营者可以在允许将应用软件从服务器260分发之前测试应用软件,以符合为应用商店定义的政策和标准,包括验证应用不构成或包含恶意软件。

应用程序210在运行于最终用户设备230A/B上时可以包括Metal内核和着色器以及其他内核和着色器。如本文所用,术语“内核”和“着色器”是指在诸如Metal的框架内的目标设备(例如GPU)上执行的程序中声明的函数。可以采用Clang、C、C++或能够表达框架结构和函数的任何其他语言编写用于内核或着色器的源代码。源代码在开发者系统220上被编译成中间表示,然后被分发到最终用户设备230A/B,其中中间表示被编译以形成能够运行于处理元件250上的内核或着色器的可执行形式。在一些实施方案中,可以将要由最终用户设备230A/B执行的内核和着色器分解成多个工作负载,并可以将工作负载并行发送到不同的处理元件250。

现在参考图3,示出了根据一个实施方案的三阶段编译器系统300的实施方案的框图。编译器系统300是三阶段设计,其主要部件是前端310、优化器320和后端330。前端解析源代码,检查其错误,并构建语言特有的抽象语法树(AST)以表示源代码。AST被转换成中间表示以在优化器320中进行优化,并且后端330使用中间表示产生可执行二进制文件。

优化器320负责进行很宽范围的变换,以尝试改善代码的运行时,诸如消除冗余的计算,并且很大程度上取决于语言和目标。后端330(也称为代码发生器)然后将代码映射到目标指令集。除了生成正确代码之外,后端330还负责生成好的代码,该代码利用被支持架构的不常见特征。编译器后端的公共部分包括指令选择、寄存器分配和指令调度。三阶段编译器系统的行业标准一直是LLVM系统(LLVM一开始称为“低级虚拟机”,但当前仅是个缩写,因为LLVM技术不限于虚拟机)。LLVM三阶段编译器系统的一个优点是后端阶段330可以与前端310和优化器阶段320分开,使得每个阶段可以在不同计算机上执行。在下文所述的一些实施方案中,后端阶段330是在最终用户计算机上执行的,而前端阶段310和优化器阶段320是在开发者计算机上执行的。于是,开发者可以将优化器320产生的优化IR 322传输到最终用户以由嵌入式后端阶段330安装和执行,从而产生可执行文件而不将源代码暴露到最终用户计算机。

如图3所示,前端阶段310可以被配置为允许将多种源语言,诸如语言A 312、语言B 314、Metal 316或任何其他语言318编译成IR并由优化器320优化。在一些实施方案中,为每种源代码语言提供独立的前端阶段310;在其他实施方案中,可以使用单个前端阶段310将多种源代码语言编译成IR 322。

通过将后端阶段330分离出去,可以为不同的处理器提供不同的后端阶段。于是,可以根据采用的后端阶段330将公共IR 322处理成用于GPU 1(332)、GPU 2(334)、CPU 1(336)或CPU 2(338)的可执行代码。这样将源代码从目标处理器解耦允许开发新的源代码语言,诸如下文所述,同时重复使用现有的优化器阶段320和后端阶段330。类似地,采用新型GPU或CPU可以通过提供新的后端阶段330来完成,该新的后端阶段为新的目标CPU或GPU处理IR 322,而不需要改变前端310或优化器320。

现在参考图4,示出了实施后端阶段330的最终用户设备230A/B上的运行环境的一个实施方案400的框图。可以由最终用户设备230A/B获得包括执行特定类型处理(例如视频编辑、媒体处理、图形处理)的代码的软件库412,例如,下载或包括在从开发者系统220或中间计算系统分布的安装包中。在包括在安装包中之前,软件库412从采用某种源代码语言的源代码(例如Metal,Objective C等)被编译到取决于设备的中间表示文件。中间表示文件402符合定义中间表示(IR)的语言模型。在一个实施方案中,IR语言模型可以是LLVM IR语言模型的扩展,诸如下文更详细描述的AIR语言模型。分布AIR文件402而不是源代码可以防止对原始源代码的不期望的访问或修改。

AIR文件402可以包括在用于各种类型的最终用户计算系统的安装包中。在一个实施方案中,在安装时,AIR文件402可以由在最终用户设备执行的CPU 410上的后端编译器阶段330编译成二进制文件406。在一些实施方案中,嵌入式编译器后端阶段330可以在从中间语言(IL)文件生成二进制代码406之前,从AIR文件402生成另一个IL文件。嵌入式后端编译器330可以包括对于目标设备(例如GPU 420)而言特有的技术细节。

设备特有的二进制文件406可以由CPU 410缓存或可以通过其他方式访问以供稍晚使用。用于从AIR文件402生成二进制文件406的编译器330可以作为GPU 420的驱动程序文件包的部分被提供给CPU 410。如本文所用,术语“二进制文件”是指软件的经过编译的可执行版本,通常被结构化为内核和着色器的库。二进制文件406可以以特定目标设备为目标,诸如GPU 420,并且内核和着色器可以从二进制文件检索并由GPU 420执行。在一些实施方案中,内核和着色器的至少一些可以由CPU 410执行。在最终用户设备中存在多个CPU 410或GPU 420时,它们可以是不同类型的,并且来自为第一目标设备编译的二进制文件406的内核和着色器不可以在第二目标设备上执行。二进制文件406也可以称为指令集架构(ISA)二进制文件。

设备特有的二进制文件406可以包括多个可执行内核和着色器。内核和着色器可以已经是编译的可执行形式,使得可以将它们传输到GPU 420并执行,而无需经过即时(JIT)编译阶段。在软件应用412访问特定内核或着色器时,可以从存储器检索或在存储器中存储特定内核或着色器。因此,为了将来访问相同的内核或着色器,可以从存储器检索而不是从二进制文件406检索内核或着色器。在另一个实施方案中,内核或着色器可以存储于GPU 420内的存储器中,使得在下次执行内核或着色器时可以迅速访问内核或着色器。

软件开发套件(SDK)库(.lib)文件SDK.lib 414可以由软件应用412用于提供经由动态链接库SDK.dll 416对二进制文件406的访问。SDK.dll 416可以用于从软件应用412在运行时访问二进制文件406,并且SDK.dll 416可以与AIR文件402一起被分发到最终用户计算系统。软件应用412可以利用SDK.lib 414经由SDK.d1l 426,通过作出适当的应用编程接口(API)调用来访问二进制文件406。

SDK.lib 414可以包括多个函数,用于访问二进制文件406中的内核和着色器。这些函数可以包括打开函数、获取程序函数和关闭函数。打开函数可以打开二进制文件406并从二进制文件406向CPU 410内的存储器中加载主索引表。获取程序函数可以从主索引表选择单个内核或着色器,并从二进制文件406向用于CPU 410的存储器中复制内核或着色器。关闭函数可以释放打开函数使用的资源。

在一些实施方案中,在调用打开函数时,软件应用412可以确定是否已经利用最新的驱动程序编译了二进制文件406。如果CPU 410已经安装了新的驱动程序,并且如果编译器已经从先前的驱动程序编译了二进制文件406,那么可以利用新的编译器编译原始AIR文件402以形成新的二进制文件406。在一个实施方案中,仅可以重新编译已经被调用的个体内核或着色器。在另一个实施方案中,可以重新编译内核和着色器的整个库。在另一个实施方案中,重新编译可以不在运行时发生。相反,安装器可以识别CPU 410中存储的所有二进制文件,并且在安装新驱动程序时,安装器可以在CPU 410不忙时在背景中重新编译AIR文件402。

在一个实施方案中,CPU 410可以操作运行环境418,诸如Metal运行环境,该运行环境工作于应用412和GPU 420之间。在这样的实施方案中,软件应用412可以包括API,诸如Metal API,用于访问Metal运行环境418。

在一些实施方案中,AIR文件402可以被生成为未加密的AIR文件,然后在被分发到最终用户设备230A/B之前被加密。向最终用户分发加密的AIR文件402可以提供对用于应用210的源代码的额外保护,并可以防止未经授权的用户对AIR文件402进行反向工程以生成用于应用210的源代码的近似结果。形成和分发加密的AIR文件402可以是可用于特定库和特定安装包的一个选项。例如,应用210的软件开发者可以决定使用加密来为其源代码提供额外的保护,而不同应用的开发者可以选择不使用加密。

在利用加密时,后端编译器330可以包括嵌入式解密器404,该解密器被配置为对加密的AIR文件解密。编译器330可以对加密的AIR文件402解密,然后执行编译以形成未加密的二进制文件406,该二进制文件可以被存储于CPU 410的本地存储器(未示出)中以供稍晚使用。在另一个实施方案中,未加密的二进制文件406可以被存储于CPU 410外部的另一存储器(未示出)中。在一些实施方案中,AIR文件402可以并入AIR文件402是否加密的指示符。

现在参考图5,示出另一个计算系统的一部分的一个实施方案的框图。源代码510可以表示可以由系统500利用的任意数量的库以及内核和着色器。在一个实施方案中,可以将源代码510编译成AIR 522。AIR 522可以对于GPU 530A–N相同。在一个实施方案中,AIR 522可以由独立的编译器编译成二进制文件526A–N。在CPU 520上执行的第一编译器(未示出)可以将AIR 522编译成二进制文件526A。二进制文件526A可以以GPU 530A为目标,GPU 530A可以具有第一类型的微架构。类似地,在CPU 520上执行的第二编译器(未示出)可以将同一AIR 522编译成二进制文件526N。二进制文件526N可以以GPU 530N为目标,GPU 530N可以具有与GPU 530A的第一类型微架构不同的第二类型的微架构。

二进制文件526A-N表示可以生成的任意数量的二进制文件,并且GPU 530A-N表示可以包括在计算系统500中的任意数量的GPU。二进制文件526A-N还可以包括任意数量的内核和着色器,并且来自源代码510的不同内核和着色器可以被包括在不同二进制文件内。例如,源代码510可以包括多个内核和着色器。第一内核或着色器可以预期在GPU 530A上执行,因此第一内核或着色器可以被编译成以GPU 530A为目标的二进制文件526A。来自源代码510的第二内核或着色器可以预期在GPU 530N上执行,因此第二内核或着色器可以被编译成以GPU 530N为目标的二进制文件526N。可以重复这一过程,使得任意数量的内核和着色器可以包括在二进制文件526A内,并且任意数量的内核和着色器可以包括在二进制文件526N内。来自源代码510的一些内核和着色器可以被编译并包括在两个二进制文件中,一些内核和着色器可以仅被编译成二进制文件526A,其他内核或着色器可以仅被编译成二进制文件526N,并且其他内核和着色器可以不被包括到二进制文件526A或二进制文件526N中。可以针对任意数量的二进制文件重复这个过程,每个二进制文件可以包含源自源代码510的内核和着色器的子集或全体。在其他实施方案中,其他类型的设备(例如FPGA、ASIC)可以用于计算系统500内并且可以被一个或多个二进制文件526A-N确定为目标。

尽管图5示出单个源代码510和单个AIR 522,可以编译多个源代码文件510以产生多个AIR文件或模块522,AIR文件或模块522然后可以被链接到着色器或内核的单个库中。该应用然后可以加载AIR代码的这个库并编译其希望用于GPU可执行二进制文件526的着色器和内核。

现在转向图6,示出了用于使用中间表示提供库的技术的一个实施方案的流程图。尽管图6中未示出,但这个实施方案中的步骤是按照相继次序显示的,其他实施方案可以同时以不同于图示的次序执行一个或多个框,或可以省去一个框。还可根据需要来执行其他附加组成部分。

技术600可以开始于框610,其中将库的源代码编译成AIR。在一个实施方案中,可以采用Metal编写源代码。在其他实施方案中,可以采用其他语言编写源代码。在一个实施方案中,AIR IR可以是如下所述LLVM IR的扩展。在框620中,可以向计算系统100,通常为最终用户计算系统传输AIR文件402。可以经由任何形式的通信,无线的或有线的,通过电子方式执行传输,或可以通过在某种物理介质上存储AIR文件402来物理地执行传输。尽管本文书写为“介质”,但本领域的技术人员将认识到,可以根据需要采用多种物理介质,一起形成用于传输AIR 402的介质。任何所需的格式都可以用于在物理介质上存储AIR文件402。如图1所示,计算系统100可以包括多个处理器,包括一个或多个CPU 110和一个或多个GPU 130。计算系统可以下载AIR文件402,该AIR文件402可以是安装软件包的部分,或可以利用用于向计算系统100传输AIR文件402的各种其他方法中的任一种。中间云服务器可以用于AIR文件402的中间存储和检索,以向计算机系统100递送。

可以在框630中由计算系统的主处理器接收AIR文件402。在一个实施方案中,主处理器可以是CPU 110。在其他实施方案中,主处理器可以是数字信号处理器(DSP)、片上系统(SoC)、微处理器、GPU等。在框640中,可以由在CPU上执行的编译器将AIR文件402编译成二进制文件406。二进制文件406可以以计算系统100内的特定目标处理器(例如GPU 130)为目标。或者,二进制文件406可以以计算系统外部的设备或处理器为目标。二进制文件406可以包括多个内核和着色器,其中每个内核和着色器可以直接在特定目标处理器上执行。在一些实施方案中,内核和着色器可以是利用GPU 130或具有并行架构的其他设备的并行处理能力的函数。二进制文件406可以存储于CPU本地存储器、系统存储器或另一存储位置内,诸如连接到CPU 110的存储设备。称二进制文件406为“文件”不应被解释为暗示任何特定文件格式、组织或存储方式。

如图5那样,图6为了清晰起见示出了单个被编译成单个AIR文件402的源代码文件,AIR文件然后被编译成二进制文件406。可以提供各种实施方式用于将多个AIR文件402链接到着色器和内核的库中,然后可以由应用从库中加载期望的内核和着色器以形成GPU可执行二进制文件406。

在一个实施方案中,CPU可以在框650中执行软件应用,该软件应用可以与运行环境(例如Metal环境)交互以调度要由一个或多个目标处理器执行的特定任务。在其他实施方案中,该应用可以提供其自己的运行环境。为了执行这些任务,该软件应用可以调用对应于来自二进制文件406的内核和着色器的一个或多个函数。在执行函数调用时,可以由应用在框660中生成对内核或着色器的请求。响应于生成针对内核或着色器的请求,该应用可以调用一个或多个API调用,以在框670中从二进制文件406检索内核或着色器。在内核和着色器与二进制文件406分开存储(诸如通过在存储器中缓存)的实施方案中,可以从适当的存储位置检索内核或着色器而无需访问二进制文件406。

如果在框660中未生成针对内核或着色器的请求,那么软件应用可以继续执行并可以准备好在生成对内核或着色器的请求时作出响应。在已经在框670中从二进制文件406检索内核或着色器之后,可以在框680中向特定目标处理器提供内核或着色器。可以通过各种方式,包括作为字符串或在缓冲区中,向特定目标处理器提供内核或着色器。然后,可以由特定目标处理器在框690中执行内核或着色器。在完成框690之后或与执行内核或着色器并行地,软件应用可以继续在CPU上执行,直到在框660中生成针对内核或着色器的另一个请求。可以针对由计算系统使用的任何多个库将步骤610-640重复多次。尽管用于执行内核和着色器的目标处理器通常是GPU,但内核和着色器也可以根据需要在CPU或GPU、CPU和其他设备的组合上执行。

AIR文件402包含符合AIR语言模型的指令,该AIR语言模型是在各种LLVM文献中描述的LLVM IR的扩展。AIR和LLVM IR是基于静态单分配(SSA)的表示。AIR被设计成三种不同形式:存储器内编译器IR,适于由加载器或JIT编译器加载的磁盘上比特代码表示,以及人可读的语言表示。以下是人可读的表示的高层级描述。用于AIR的后端编译器330通常提供了验证关卡以验证AIR文件402形成得很好。

LLVM IR仅仅能够描述计算内核和着色器,并且LLVM IR不提供在GPU上执行图形操作需要的任何函数表示。AIR语言模型是统一IR语言模型,其上结合了LLVM IR语言模型的一些或所有函数,但包括用于并行图形操作以及并行通用计算操作的指令。在一些实施方案中,仅支持LLVM IR内在指令的子集。

在一个实施方案中,以具有@air.前缀的人可读形式命名AIR函数,以将它们与LLVM函数区分开。AIR语言模型的一些实施方案支持的函数包括如下表1中所列的一般群组:

表1

例如,以下是使用单精度浮点色值在一维中从深度纹理采样的示例纹理函数:

在另一个实施例中,以下是查询纹理宽度的纹理查询函数:

declare i32

@air.get_width_texture_buffer_1d(

%struct._texture_buffer_1d_t addrspace(1)*%tex)

在另一个实施例中,以下函数将一些框架定义的精确度和范围要求与快速弛豫数学匹配:

declare T@air.fast_acos.type(T%x)

declare T@air.fast_acosh.type(T%x)

declare T@air.fast_asin.type(T%x)

declare T@air.fast_asinh.type(T%x)

AIR语言模型以及将源代码编译成AIR文件402为开发者提供了针对图形和通用计算软件两者编译其源代码的一种方式,从而不需要将源代码递送到最终用户设备,仅需要递送AIR文件402。此外,因为编译的后端部分可以在最终用户设备上在安装时或稍晚执行,所以可以向不同的能够进行并行处理的GPU或CPU提供相同的AIR文件402来执行,包括在已经将源代码编译成AIR之后开发的GPU或CPU。此外,因为AIR语言模型与源代码语言无关,所以可以开发不同的编译器前端来生成AIR文件402,允许供应商或开发者为其他源代码语言开发前端,而不改变优化器或后端编译步骤中的AIR处理。

表示并体现所述技术和机制的程序指令和/或数据库可以存储于机器可读存储介质上。程序指令可以包括机器可读指令,该机器可读指令在由机器执行时使得机器执行本文所述的技术动作。

机器可读存储介质可以包括可以由计算机在使用期间访问的任何存储介质,以向计算机提供指令和/或数据,并可以包括物理介质的多个实例,如同它们是单个物理介质一样。例如,计算机可访问存储介质可包括诸如磁性或光学介质的存储介质,诸如磁盘(固定或可拆卸)、磁带、CD-ROM、DVD-ROM、CD-R、CD-RW、DVD-R、DVD-RW或蓝光。存储介质还可以包括易失性或非易失性存储器介质,诸如RAM(例如同步动态RAM(SDRAM)、双数据率(DDR、DDR2、DDR3等)SDRAM、低功率DDR(LPDDR2等)SDRAM、存储器总线DRAM(RDRAM)、静态RAM(SRAM))、ROM、可经由外围接口,诸如USB接口访问的非易失性存储器(例如闪速存储器)等。存储介质可以包括微机电系统(MEMS)以及可以经由诸如网络和/或无线链路的通信介质访问的存储介质。

在其他实施方案中,表示所述技术和机制的程序指令可以是诸如Verilog或VHDL的硬件设计语言(HDL)中的硬件功能的行为级别描述或寄存器传输级别(RTL)描述。该描述可以由合成工具读取,该合成工具可以合成该描述以产生包括来自合成库的逻辑门列表的网表。该网表包括一组逻辑门,这些逻辑门还表示包括该系统的硬件的功能。然后可放置并路由网表,以产生用于描述要应用到掩模的几何形状的数据集。然后可在各种半导体制造步骤中使用掩模,以产生与系统对应的半导体电路或电路。另选地,计算机可访问存储介质上的数据库可以是期望的网表(具有或没有合成库)或数据集。在计算机可访问存储介质可以承载系统的表示的同时,其他实施方案可以根据需要承载系统的任何部分的表示,包括IC、任意一组程序(例如API、DLL或编译器)或程序的部分。

可以由各个实施方案使用或结合各个实施方案使用的硬件部件、处理器或机器的类型包括ASIC、FPGA、微处理器或任何集成电路。此类处理器可以通过利用经处理的HDL指令(此类指令能够被存储于计算机可读介质上)的结果来配置制造过程而制造。此类处理的结果可以是掩模作品,该掩模作品然后被用于半导体制造过程中,以制造实施本文所述方法和机制的各方面的处理器。

应当理解,以上描述旨在是例示性的而非限制性的。例如,可彼此结合地使用上述实施方案。在回顾以上描述时,很多其他的实施方案对于本领域的技术人员而言将是显而易见的。因此应当参考所附权利要求以及命名此类权利要求的等同形式的完整范围来确定本发明的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1