会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 电脑编程 / 别名 / 别名化缓冲区

别名化缓冲区

阅读:640发布:2020-05-11

IPRDB可以提供别名化缓冲区专利检索,专利查询,专利分析的服务。并且本发明涉及用于将缓冲区别名化的方法、系统和计算机程序产品。本发明的实施例通过如下方式来支持缓冲区别名化:引入源程序的缓冲区访问与目标可执行物理缓冲区之间的间接等级;以及在运行时将逻辑缓冲区访问绑定到实际物理缓冲区访问。可以将多种支持缓冲区的运行时别名化的技术用在原本不允许目标可执行代码的单独定义的缓冲区之间的这样的运行时别名化的系统中。源程序中的逻辑缓冲区访问到目标可执行代码中定义的实际物理缓冲区之间的绑定被延迟直到运行时。,下面是别名化缓冲区专利的具体信息内容。

1.在包括多个处理器和系统存储器的计算机系统处的一种用于将缓冲区别名化的方法,所述多个处理器包括第一处理器类型和不同的第二处理器类型,针对不同的第二处理器类型的运行时环境阻止物理数据缓冲区的别名化,该方法包括:访问程序的动作,所述程序包括编程语言的源代码,所述源代码被配置为用于在第一处理器类型和不同的第二处理器类型上的混合执行,所述源代码定义物理缓冲区,所述源代码还包括用于通过多个逻辑视图在逻辑上访问所述物理缓冲区的指令,每个逻辑视图都对应于所述物理缓冲区中的数据的子集,所述源代码的至少一部分是以不同的第二处理器类型为目标的;

将所述源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作,第二代码定义所述逻辑缓冲区访问与所述物理缓冲区之间的间接等级;

将第二代码的执行配置在不同的第二处理器类型的运行时环境内以使用所定义的间接等级将逻辑缓冲区访问绑定到物理缓冲区的动作;以及使用所定义的间接等级来在第二代码的执行期间将所述逻辑缓冲区访问绑定到所述物理缓冲区的动作。

2.如权利要求1所述的方法,其特征在于,访问程序的动作包括访问C++程序的动作,所述C++是针对并行环境扩展的。

3.如权利要求1所述的方法,其特征在于,访问程序的动作包括访问如下程序的动作:

所述程序被配置为用于在中央处理单元(“CPU”)运行时和图形处理单元(“GPU”)运行时中的混合执行。

4.如权利要求1所述的方法,其特征在于,访问程序的动作包括访问包括用于在逻辑上访问下列各项之一的指令的程序的动作:随机存取存储器(“RAM”)和盘上的虚拟存储器。

5.如权利要求1所述的方法,其特征在于,将所述源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作包括将所述源的至少一部分转换成用于在图形处理单元(“GPU”)上执行的高级着色器语言(“HLSL”)代码的动作。

6.如权利要求1所述的方法,其特征在于,还包括:

分析第二代码以创建针对并行环境阵列缓冲区扩展的C++与相应的高级着色器语言(“HLSL”)缓冲区变量之间的映射的动作;并且其中使用所定义的间接等级来将所述逻辑缓冲区访问绑定到所述物理缓冲区的动作包括使用所述映射来将所述逻辑缓冲区访问绑定到所述物理缓冲区访问的动作。

7.如权利要求1所述的方法,其特征在于,将源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作,其中第二代码定义所述逻辑缓冲区访问与所述物理缓冲区之间的间接等级,包括转换源代码的所述至少一部分以使用动态标签来实现所述逻辑缓冲区访问与所述物理缓冲区之间的间接等级的动作。

8.如权利要求7所述的方法,其特征在于,在第二代码的执行期间使用所定义的间接等级来将所述逻辑缓冲区访问绑定到所述物理缓冲区的动作包括使用所述动态标签来将逻辑缓冲区访问复用到合适的物理缓冲区访问的动作。

9.如权利要求1所述的方法,其特征在于,将源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作,其中第二代码定义所述逻辑缓冲区访问与所述物理缓冲区之间的间接等级,包括转换源代码的所述至少一部分以将抽象接口用于逻辑缓冲区访问的动作。

10.如权利要求9所述的方法,其特征在于,在第二代码的执行期间使用所定义的间接等级来将所述逻辑缓冲区访问绑定到所述物理缓冲区的动作包括在执行期间动态链接到所述物理缓冲区访问的动作。

11.在包括多个处理器和系统存储器的计算机系统处的一种用于将缓冲区别名化的方法,所述多个处理器包括第一处理器类型和不同的第二处理器类型,针对所述不同的第二处理器类型的运行时环境阻止物理数据缓冲区的别名化,该方法包括:访问程序的动作,所述程序包括编程语言的源代码,所述源代码被配置为用于在第一处理器类型和不同的第二处理器类型上的混合执行,所述源代码定义物理缓冲区,所述源代码还包括用于通过多个逻辑视图在逻辑上访问所述物理缓冲区的指令,每个逻辑视图都对应于所述物理缓冲区中的数据的子集,所述源代码的至少一部分是以不同的第二处理器类型为目标的;

将所述源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作,第二代码定义提供所述逻辑缓冲区访问与所述物理缓冲区之间的间接等级的动态标签;

分析第二代码以创建所述逻辑缓冲区访问与所述物理缓冲区访问之间的映射的动作;

将第二代码的执行配置在不同的第二处理器类型的运行时环境内以使用动态标签将逻辑缓冲区访问绑定到物理缓冲区的动作;以及使用所述动态标签来在第二代码的执行期间将所述逻辑缓冲区访问绑定到所述物理缓冲区的动作。

12.如权利要求12所述的方法,其特征在于,将所述源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作包括将所述源代码的至少一部分转换成用于在图形处理单元(“GPU”)上执行的高级着色器语言(“HLSL”)代码的动作。

13.如权利要求11所述的方法,其特征在于,访问程序的动作包括访问如下程序的动作:所述程序被配置为用于在中央处理单元(“CPU”)运行时和图形处理单元(“GPU”)运行时中的混合执行。

14.在包括多个处理器和系统存储器的计算机系统处的一种用于将缓冲区别名化的方法,所述多个处理器包括第一处理器类型和不同的第二处理器类型,针对所述不同的第二处理器类型的运行时环境阻止物理数据缓冲区的别名化,该方法包括:访问程序的动作,所述程序包括编程语言的源代码,所述源代码被配置为用于在第一处理器类型和不同的第二处理器类型上的混合执行,所述源代码定义物理缓冲区,所述源代码还包括用于通过多个逻辑视图在逻辑上访问所述物理缓冲区的指令,每个逻辑视图都对应于所述物理缓冲区中的数据的子集,所述源代码的至少一部分是以不同的第二处理器类型为目标的;

将所述源代码的至少一部分转换成针对不同的第二处理器类型的第二代码的动作,第二代码定义提供所述逻辑缓冲区访问与所述物理缓冲区之间的间接等级的抽象接口;

将第二代码的执行配置在不同的第二处理器类型的运行时环境内以使用所定义的抽象接口的具体实现将逻辑缓冲区访问绑定到物理缓冲区的动作;以及在第二代码的执行期间将所述抽象接口动态链接到所述具体实现以促进物理缓冲区访问的动作。

15.如权利要求14所述的方法,其特征在于,访问程序的动作包括访问包括用于在逻辑上访问下列各项之一的指令的程序的动作:随机存取存储器(“RAM”)和盘上的虚拟存储器。

说明书全文

别名化缓冲区

[0001] 背景
[0002] 1.背景和相关技术
[0003] 计算机系统及相关技术影响社会的许多方面。的确,计算机系统处理信息的能力已转变了人们生活和工作的方式。现在,计算机系统通常执行在计算机系统出现以前手动执行的许多任务(例如,文字处理、日程安排、帐目管理等)。最近,计算机系统彼此耦合并耦合到其他电子设备以形成计算机系统及其他电子设备可在其上传输电子数据的有线和无线计算机网络。因此,许多计算任务的执行分布在多个不同的计算机系统和/或多个不同的计算环境中。
[0004] 一些运行时环境使用缓冲区别名化(aliasing)来提供编程抽象。缓冲区别名化将一个或多个物理缓冲区抽象成逻辑缓冲区,所述逻辑缓冲区每个都表示底层物理缓冲区的子集。缓冲区别名化使得程序员能够开发出算法,而不必关心作为(例如输入或输出)参数传递给算法的缓冲区是属于不同物理缓冲区还是相同物理缓冲区。
[0005] 然而,其他运行时环境不允许单独定义的缓冲区之间的运行时缓冲区别名化。在这些环境中,缓冲区访问是通过引用底层物理缓冲区来进行的。
[0006] 另外,情况可能是,为一个运行时环境开发的软件的部分最终是在不同的软件环境中执行的,比如例如在具有不同类型的处理器的多处理器环境中执行。因此,包括缓冲区别名化指令的代码的一部分可以被开发以供在支持缓冲区别名化的第一运行时环境(例如通用中央处理单元“CPU”)中执行。然而在运行时,代码的该部分可能例如被分配给不允许缓冲区别名化的不同的第二运行时环境(例如图形处理单元(“GPU”))。第二运行时环境不知道如何执行缓冲区别名化指令。因此,在遇到缓冲区别名化指令时,第二运行时环境可能导致代码的该部分停止按预期工作并且可能导致异常,或者可能导致某种其他类型的错误。
[0007] 概述
[0008] 本发明涉及用于将缓冲区别名化的方法、系统和计算机程序产品。计算机系统包括多个处理器,其包括第一处理器类型和不同的第二处理器类型。用于第二处理器类型的运行时环境不允许物理缓冲区的别名化。
[0009] 计算机系统访问程序。该程序包括某编程语言的源代码。该源代码被配置为用于在第一处理器类型和第二处理器类型上执行,其中该源代码的至少一部分是以第二处理器类型为目标的。该源代码定义一个或多个物理缓冲区并且包括用于通过多个逻辑视图在逻辑上访问一个或多个物理缓冲区的指令。每个逻辑视图都对应于物理缓冲区中的数据的子集。
[0010] 至少一部分源代码被转换成用于不同的第二处理器类型的第二代码。第二代码定义逻辑缓冲区访问与底层物理缓冲区访问之间的间接(indirection)等级。第二代码的执行被配置在不同的第二处理器类型的运行时环境中以使用所定义的间接等级将逻辑缓冲区访问绑定到物理缓冲区。所定义的间接等级被用于在第二代码的执行期间将逻辑缓冲区访问绑定到物理缓冲区。
[0011] 提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
[0012] 本发明的附加特征和优点将在以下描述中叙述,并且其一部分根据本描述将是显而易见的,或者可通过对本发明的实践来获知。本发明的特征和优点可通过在所附权利要求书中特别指出的工具和组合来实现和获得。本发明的这些以及其他特征、优点和特征将根据以下描述和所附权利要求而变得更显而易见,或者可通过如此后阐述的对本发明的实践而获知。
[0013] 附图简述
[0014] 为了描述可以获得本发明的上文所列举的及其他优点和特征的方式,将通过参考附图中所示的本发明的各具体实施例来呈现上文简要描述的本发明的更具体的描述。可以理解,这些附图仅描述本发明的典型实施例,从而不被认为是对其范围的限制,本发明将通过使用附图用附加特征和细节来描述和说明,在附图中:
[0015] 图1示出了促进缓冲区别名化的示例计算机架构。
[0016] 图2示出了用于将缓冲区别名化的示例方法的流程图。
[0017] 图3A示出了使用动态标签来提供关于间接的等级。
[0018] 图3B示出了使用抽象接口和动态链接来提供间接等级。
[0019] 详细描述
[0020] 本发明涉及用于将缓冲区别名化的方法、系统和计算机程序产品。计算机系统包括多个处理器,其包括第一处理器类型和不同的第二处理器类型。用于第二处理器类型的运行时环境不允许物理缓冲区的别名化。计算机系统访问程序。该程序包括某编程语言的源代码。该源代码被配置为用于在第一处理器类型和第二处理器类型上的混合执行,其中该源代码的至少一部分是以第二处理器类型为目标的。该源代码定义一个或多个物理缓冲区并且包括用于通过多个逻辑视图在逻辑上访问一个或多个物理缓冲区的指令。每个逻辑视图都对应于物理缓冲区中的数据的子集。
[0021] 至少一部分源代码被转换成用于不同的第二处理器类型的第二代码。第二代码定义逻辑缓冲区访问与底层物理缓冲区访问之间的间接(indirection)等级。第二代码的执行被配置在不同的第二处理器类型的运行时环境中以使用所定义的间接等级将逻辑缓冲区访问绑定到物理缓冲区。所定义的间接等级被用于在第二代码的执行期间将逻辑缓冲区访问绑定到物理缓冲区。
[0022] 本发明的实施例包括用于提供间接等级的各种机制。在一些实施例中,使用动态标签来提供间接等级。动态标签可以包括在所生成的可执行代码(例如第二代码)中以用于将逻辑缓冲区访问复用到合适的物理缓冲区访问。在其他实施例中,使用抽象接口和动态链接来提供间接等级。抽象接口被包括在用于逻辑缓冲区访问的所生成的可执行代码(例如第二代码)中。在运行时,可执行代码被动态地链接到合适的物理缓冲区访问。
[0023] 本发明的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如举例而言一个或多个处理器和系统存储器的计算机硬件,如以下更详细讨论的。本发明范围内的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是计算机存储介质(设备)。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种显著不同的计算机可读介质:计算机存储介质(设备)和传输介质。
[0024] 计算机存储介质(设备)包括RAM、ROM、EEPROM、CD-ROM、固态驱动器(SSD)(如基于RAM)、闪存、相变存储器(PCM)、其他类型的存储器、其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。
[0025] “网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应被包括在计算机可读介质的范围内。
[0026] 此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(设备)(或反之亦然)。例如,通过网络或数据链接接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质(设备)。因而,应当理解,计算机存储介质(设备)可被包括在还利用(甚至主要利用)传输介质的计算机系统组件中。
[0027] 计算机可执行指令例如包括,当在处理器上执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令例如可以是二进制代码、诸如汇编语言之类的中间格式指令或者甚至是源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题内容,但可以理解,所附权利要求书中定义的主题内容不必限于上述特征或动作。更具体而言,上述特征和动作是作为实现权利要求的示例形式而公开的。
[0028] 本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括具有以下一个或多个的组合:个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统(包括有一个或多个中央处理单元(“CPUs”)以及例如图形处理单元(“GPUs”)或加速器的一个或多个协作处理器的系统)、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备二者中。
[0029] 图1示出了促进将缓冲区别名化的示例计算机架构100。参考图1,计算机架构100包括代码转换器101、物理缓冲区102、处理器运行时141以及处理器运行时142。所描绘的组件中的每一个通过系统总线(或作为系统总线的一部分)和/或诸如例如局域网(“LAN”)、广域网(“WAN”)以及甚至因特网等网络(或作为网络的一部分)彼此连接。因此,所描绘的计算机系统中的每一个以及任何其他连接的计算机系统及其组件都可以创建消息相关数据并通过系统总线和/或网络交换消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他更高层协议,诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等)。
[0030] 一般而言,代码转换器101被配置为将代码转换为包括间接指令,所述间接指令促进处理器运行时中的缓冲区别名化,其中所述处理器运行时原本不允许单独定义的缓冲区之间的缓冲区别名化。在一些实施例中,间接指令包括用于将逻辑缓冲区访问复用到实际物理缓冲区的动态标签。在其他实施例中,间接指令包括用于逻辑缓冲区访问的抽象接口。抽象接口在运行时被动态链接到物理缓冲区访问。
[0031] 物理缓冲区102可以是计算机架构100内的系统存储器位置(例如RAM的一部分)、虚拟存储器位置(例如盘上)、或者不同的第二存储器类型可访问的专用存储器中的存储器位置。
[0032] 计算机架构100可以包括多个处理器运行时,其包括处理器运行时141和处理器运行时142。每个处理器运行时都可以对应于不同的处理器,比如例如通用处理器(例如中央处理单元(“CPU”)或专用处理器(例如图形处理单元(“GPU”)))。每个处理器运行时都可以被配置为具有在代码执行时所使用的各种(及不同)的属性。例如,一些处理器运行时本机地支持缓冲区别名化,而其他处理器运行时不允许缓冲区别名化。
[0033] 例如,为并行环境扩展的C++提供了设备缓冲区的以“array(阵列)”或“array_view(阵列_视图)”类型形式的抽象。“array”或“array_view”类型的实例是要在设备上执行的代码的输入和输出并且可以作为参数在运行时被传递给该设备代码。每个array或array_view实例都可以提供对实际底层物理缓冲区资源(例如在以 为目标时为 缓冲区资源)的子集的访问。当为针对并行环境内核函数扩展的C++生成可执
行代码时,编译器在所生成的可执行代码中为内核的每个array或array_view参数定义缓冲区变量。
[0034] 情况可以是,为并行环境代码扩展的C++的部分被翻译成高级着色器语言(“HLSL”)以供在GPU上执行。例如,针对并行环境扩展的C++可以以 平台为目标。因此,为并行环境array或array_view访问扩展的C++可以被直接翻译成相应的高级着色器语言(“HLSL”)缓冲区访问。然而, 不允许缓冲区别名化。因此,将相同的 缓冲区资源绑定到多个HLSL缓冲区变量也是不允许的。因此,用户基本
上不能在运行时将具有相同底层 缓冲区资源的array或array_view实例作为实
际参数传递给针对并行环境内核扩展的C++。
[0035] 图2示出了用于将缓冲区别名化的示例方法200的流程图。方法200将参考计算机架构100的组件和数据来描述。
[0036] 方法200包括访问程序的动作,该程序包括编程语言的源代码,该源代码被配置为用于在第一处理器类型和不同的第二处理器类型上的混合执行,该源代码定义映射到物理缓冲区的array或array_view(数据的逻辑视图),该源代码还包括用于通过多个逻辑视图在逻辑上访问该物理缓冲区的指令,每个逻辑视图都对应于该物理缓冲区中的数据的子集,该源代码的至少一部分是以该不同的第二处理器类型为目标的(动作201)。例如,代码转换器101可以访问较高级代码111。较高级代码111可以被配置为用于处理器运行时141(例如支持缓冲区别名化的CPU环境)中和处理器运行时142(例如不允许缓冲区别名化的GPU环境)中的混合执行。例如,其他代码114可以被指定用于在处理器运行时141中执行,并且作为目标(targeted)的代码112可以被指定用于在处理器运行时142中执行。
较高级代码111可以定义物理缓冲区102。逻辑缓冲区访问指令113通过逻辑视图102A和
102B来抽象对物理缓冲区102的访问。
[0037] 方法200包括将源代码的至少一部分转换成针对不同的第二处理器类型的第二代码,该第二代码定义逻辑缓冲区访问与物理缓冲区之间的间接等级(动作202)。例如,代码转换器102可以转换作为目标的代码112转换以包括间接指令123。间接指令123可以定义逻辑缓冲区视图102A和102B与物理缓冲区102之间的间接等级。
[0038] 方法200包括如下动作:将第二代码的执行配置在不同的第二处理器类型的运行时环境内以使用所定义的间接等级将逻辑缓冲区访问绑定到物理缓冲区(动作203)。在较低级代码121的执行期间,作为目标的代码112可以被传递给处理器运行时142。处理器运行时142可以配置作为目标的代码的执行以使用间接指令将逻辑缓冲区访问113绑定到物理缓冲区102。处理器运行时142可以分析逻辑缓冲区访问指令113以确定通过逻辑视图(例如102A和103B)访问的物理缓冲区(例如102)。处理器运行时142可以生成间接数据131以在模拟缓冲区别名化方面帮助间接指令。
[0039] 方法200包括使用所定义的间接等级来在第二代码的执行期间将逻辑缓冲区访问绑定到物理缓冲区的动作(动作204)。例如,处理器运行时142可以在作为目标的代码112的执行期间使用间接指令123将逻辑缓冲区访问113绑定103到物理缓冲区102。间接指令123可以是指用于将逻辑视图102A和102B映射到物理缓冲区102内的相应位置的间接数据131。
[0040] 各种不同的技术可以被(例如针对并行环境扩展的C++)编译器和运行时用于促进原本不被允许的缓冲区别名化。例如,可以使用技术来使得针对并行环境扩展的C++的程序员能够将具有相同底层物理 缓冲区资源的array或array_view实例作为参数传递给针对并行环境内核扩展的C++,即使该内核参数中的一个或多个被声明为可写入的。
如所述那样,array或array_view实例的别名化可以通过在所生成的可执行代码中引入源array或源array_view的缓冲区访问与底层HLSL缓冲区访问之间的间接等级来实现。
array或array_view访问到合适HLSL缓冲区变量的实际绑定是在运行时发生的。
[0041] 一种用于实现间接的技术是使用动态标签。图3A示出了将动态标签用于间接等级。编译器生成的代码可以包括分支代码301。当array302被接收时,分支代码可以对动态标签值执行以选择缓冲区303、304和306之一。在运行时期间,输入逻辑视图被检查以寻找别名化,并且每个逻辑视图都被分配动态标签值以将共享中的逻辑视图访问重定向到合适的物理缓冲区(311)。用所生成的动态标签值输入来启动经编译的着色器(312)。
[0042] 例如,下面的程序(例如较高级代码111)包括缓冲区别名化:
[0043]
[0044] 使用动态标签,编译器(例如代码转换器121)定义与源内核的每个array参数相对应的HLSL缓冲区变量。从在运行时传递给经编译的HLSL代码的动态标签表(通过分析在先代码而生成的)中读取array缓冲区与所映射到的实际HLSL缓冲区之间的绑定。动态标签表包含针对并行环境array的缓冲区所扩展的C++与相应HLSL缓冲区变量之间的映射。针对每个array访问,编译器都对该array的动态标签值生成switch语句,其中在所生成的代码中定义每个HLSL缓冲区变量的case语句。
[0045] 编译器可以从示例程序中生成将动态标签用于间接的代码。例如,编译器可以从示例程序中生成如下代码:
[0046]
[0047]
[0048] 运行时(例如处理器运行时142)通过检查每个实际array/array_view或参数以寻找读-写别名化来填充动态标签表,其中其他array/array_view参数在运行时被传递给内核。如果针对该array/array_view检测到别名化,则从别名中挑选可写入的arrays/array_view之一,并且相应的HLSL缓冲区变量被绑定到别名化的arrays/arracy_view底层的 缓冲区。别名化的arrays/arrary_view中的每一个到HLSL缓冲区映射的条目都被设置为绑定到 缓冲区资源的HLSL缓冲区变量的索引(整数ID)。与所有其他别名化的arrays/array_view相对应的HLSL缓冲区变量被绑定到NULL(空)。
[0049] 针对示例程序,所生成表为:
[0050] Array“f1”->0(第一HLSL缓冲区变量的索引)
[0051] Array“f2”->0(第一HLSL缓冲区变量的索引)
[0052] 另一用于实现间接的技术是使用抽象接口和动态链接。图3B示出了将抽象接口和动态链接用于间接等级。编译器生成代码可以包括使用针对array/array_view缓冲区访问的抽象接口的着色器(351)。在运行时期间,检查代码以寻找运行时array/array_view参数中的别名化(361)。array访问接口实例被绑定到与合适的HLSL缓冲区相对应的实现(362)。
[0053] 当使用抽象接口和动态绑定时,编译器定义与资源内核的每个array参数相对应的HLSL缓冲区变量、以及用于访问每个array参数的底层缓冲区的抽象接口。附加地,生成array/array_view缓冲区访问接口的具体实现,其对应于在所生成的代码中所定义的每个HLSL缓冲区变量。所生成的代码中的array/array_view缓冲区访问接口的实例中的每个都在运行时被绑定到与合适HLSL缓冲区变量相对应的实现(取决于对在运行时传递给内核的实际array/array_view参数执行的别名化检查)。
[0054] 在运行时(例如处理器运行时142),检查每个实际array/array_view参数以寻找读-写别名化,其中其他array/arry_view参数被传递给内核。如果针对该array/array_view检测到别名化,则从别名中挑选可写入的arrays/array_view之一,并且相应的HLSL缓冲区变量被绑定到底层 缓冲区。而且,针对别名化arrays/array_view中的每一个的array_buffer(阵列_缓冲区)访问被绑定到与所选HLSL缓冲区变量相对应的接口的具体实现。与其他别名化的arrays/array_view相对应的HLSL缓冲区变量被绑定到NULL(空)。
[0055] 为并行环境扩展的C++提供了设备缓冲区的以“array”类型形式的抽象。“array”类型的实例是要在设备上执行的代码的输入和输出并且可以作为参数在运行时被传递给该设备代码。每个array实例都提供对实际底层物理DirectX缓冲区资源的子集的访问。当为针对并行环境内核函数扩展的C++生成可执行代码时,编译器在所生成的可执行代码中为内核的每个array参数定义缓冲区变量。然而,由于在HLSL缓冲区变量中的任一个为可写入的情况下DirectX不允许将相同的DirectX缓冲区资源绑定到多个HLSL缓冲区变量,因此用户不能将具有相同底层DirectX缓冲区资源的array实例作为实际参数在运行时传递给内核。
[0056] HLSL动态链接可以用于支持缓冲器别名化。例如,如果着色器需要访问三个缓冲区:
[0057] RWStructuredBuffer_GV_buffer_rw_0:register(u0);
[0058] StructuredBuffer_GV_buffer_ro_0:register(t0);
[0059] StructuredBuffer_GV_buffer_ro_1:register(t1);
[0060] 替代于生成代码以直接读取/写入缓冲区,通过两个接口来提供访问。
[0061] 一个接口抽象只读缓冲区,另一个接口抽象读-写缓冲区。
[0062]
[0063] 对于RWStructuredBuffer,生成两个类,一个实现ROBufferInterface,并且一个实现RWBufferInterface:
[0064]
[0065]
[0066] 对于ROStructuredBuffer,生成实现ROBufferInterface的一个类:
[0067]
[0068] 其他代码通过Buffer_0、Buffer_1和Buffer_2、而不是_GV_buffer_rw_0、_GV_buffer_ro_0和_GV_buffer_ro_1来访问缓冲区。
[0069] 当运行时检测到别名化的输入时,运行时检测相应的着色器。然后,运行时配置Buffer_x到接口的实现的绑定。表1描绘了各个不同元素之间的示例映射:
[0070]
[0071]
[0072] 表1
[0073] 如表1中所描绘的那样,array0和array1使用相同的底层 缓冲区(Buf0)。这是运行时所检测到的别名化。然后,运行时将“array2”绑定到类BufferClass_0_RO。BufferClass_0_RO实现ROBufferInterface并且将_GV_buffer_rw_0用于“array2”。结果,在运行时,_GV_buffer_rw_0被用于array0和array2二者。
[0074] 编译器可以确定每个隙(slot)并且使所述隙对运行时可用以用于绑定到类的实例。
[0075] 因此,本发明的实施例通过如下方式来支持缓冲区别名化:引入源程序的缓冲区访问与目标可执行物理缓冲区之间的间接等级;以及在运行时将逻辑缓冲区访问绑定到实际物理缓冲区访问。可以将多种支持缓冲区的运行时别名化的技术用在原本不允许目标可执行代码中的单独定义的缓冲区之间的这样的运行时别名化的系统中。源程序中的逻辑缓冲区访问到目标可执行代码中定义的实际物理缓冲区之间的绑定被延迟直到运行时。
[0076] 本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用