仿真指针的制作方法

文档序号:6443597阅读:256来源:国知局
专利名称:仿真指针的制作方法
技术领域
本发明涉及仿真指针。
背景技术
I.背景和相关技术计算机系统和相关技术影响社会的许多方面。的确,计算机系统处理信息的能力已转变了人们生活和工作的方式。计算机系统现在通常执行在计算机系统出现以前手动执行的许多任务(例如,文字处理、日程安排和会计等)。最近,计算机系统彼此耦合并耦合到其他电子设备以形成计算机系统和其他电子设备可以在其上传输电子数据的有线和无线计算机网络。因此,许多计算任务的执行分布在多个不同的计算机系统和/或多个不同的计算环境中。为了开发用于执行计算任务的软件应用,开发者通常编写表达软件应用的所需功能的源代码(例如,使用C++、Visual Basic等)。然后,可以将源代码编译成可执行代码 (或者可替代地在执行时间解释)。在源代码编译期间,编译器将源代码指令转换成在计算机系统上可直接执行的机器指令(例如x86指令)。在计算机系统上运行可执行代码以实现所期望的功能。在一些环境中,使用单阶段编译器来将源代码编译成可执行代码。例如,C++编译器可以将C++源代码直接编译成可在个人计算机的处理器上运行的可执行代码。在其他环境中,使用多阶段编译器来将源代码编译成可执行代码。多阶段编译器可包括多个不同的编译阶段。每个编译阶段都可以执行某个翻译、转换等以朝着将接收到的源代码编译成机器指令(例如以特定的处理器为目标)的方向前进。在另外的环境中,可以将源代码在各种不同格式之间翻译以促进随后的编译。例如,第一较高级语言的表达式和语句可以被翻译成具有较低级的中间格式的指令。随后,具有该较低级中间格式的指令可以被翻译成第二较高级语言的表达式和语句。然后,第二较高级语言的表达式和语句可以被编译。较高级语言之间的翻译可允许开发者即使在该开发者具有关于平台的较少知识的情况下仍然为该平台开发代码。理想地,在第一较高级语言的表达式和语句中所表示的功能保留在第二较高级语言的表达式和语句中。然而,可能的是,第二较高级语言缺少直接对应的功能。因此,就算可能,也更加难以保留第一较高级语言的表达式和函数的功能。更具体的示例包括使C++源代码以诸如高级着色器语言(“HLSL”)或Open CL 源代码之类的图形处理单元(“GPU”)语言为目标(targeting)以用于随后的编译和在GPU 目标上的执行。C++(以及C)编程语言定义了扁平的存储器模型,其中可以获得指向对象 (或对象的部分)的指针。无论对象(或对象的部分)是位于局部变量中、全局或静态变量中、还是诸如例如动态堆之类的自由存储(free store)中,都可以获得指针。一旦获得了指针,则该指针就可以在调用者函数与被调用者之间传递并且以各种方式来操纵。例如,可以引用指针以使得能够直接向所指向的位置写入或从所指向的位置读取。
然而,基本上所有GPU编程模型都要么缺少指针支持,要么对指针的使用加以限制。例如,HLSL缺少对指针的支持。其他GPU编程模型要求开发者在指针声明中注释该指针将指向的存储器的类型(并且因此预先得知存储器类型)。在这些其他GPU编程模型中, 到全局存储器的指针具有与到局部存储器的指针不同的类型。对指针使用的这些限制至少部分与未被完全抽象化的GPU存储器相关。因此,需要不同的操作来访问不同类型的存储器。另外,统一、无分支和合并的存储器访问提供在 GI3U上的执行。富含指针的编程模型可能导致产生反模式(anti-pattern)的代码。

发明内容
本发明涉及用于仿真指针的方法、系统和计算机程序产品。访问较低级代码的多个指令。所述多个指令是从较高级代码的相应语句和表达式中翻译的。所述多个较低级指令包括表示来自该较高级代码的定义多个不同变量的语句和表达式的较低级指令。所述多个变量包括一个或多个指针、一组局部变量、一组共享存储器变量、以及全局存储器资源。 所述多个较低级指令还包括如下指令所述指令表示来自较高级代码的对所述一个或多个指针中的指针进行分配或解除引用的语句和表达式。该较低级代码被修改以对所述一个或多个指针的定义和使用进行仿真。所述多个较低级指令被内联到单个函数内。所述单个函数被配置为在处理器处执行时向处理器内核提供对该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识。生成指针仿真指令。所述指针仿真指令定义一个或多个数组。所述一个或多个数组用于存储该组局部变量和该组共享变量。所述指针仿真指令将每个局部变量和每个共享变量分配给所述一个或多个数组之一中的位置。所述指针仿真指令通过定义一对变量、即标签变量和偏移量变量来表示所述一个或多个指针中的每个指针。该标签变量用于存储如下的值该值用于标识出所仿真的指针指向的一个或多个数组之一或全局存储器资源。该偏移量变量对应于该标签变量,并且用于存储用于标识出数组位置的值。对于较低级代码中的将地址值分配给指针之处的每个位置而言,指针仿真指令向标签变量和相应偏移量变量中的一个或多个赋值。对标签变量和/或偏移量变量的赋值将标识出所述一个或多个数组之一或全局存储器资源内的位置以对向指针分配地址值进行仿真。对于较低级代码中的对指针进行解除引用之处的每个位置而言,指针仿真指令向所述一个或多个数组之一或全局存储器资源内的位置赋值/从该位置读取值。向位置赋值/ 从该位置读取值基于赋给标签变量的值以及赋给相应偏移量变量以对指针的解除引用进行仿真。用指针仿真指令来替换如下较低级指令所述较低级指令表示来自较高级代码的定义所述多个变量以及向所述一个或多个指针中的指针进行分配或解除引用的语句和表达式。提供本发明内容以便以简化的形式介绍将在以下的详细描述中进一步描述的一些概念。本发明内容并非旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。本发明的附加特征和优点将在以下描述中叙述,且其一部分根据本描述将是显而易见的,或可通过对本发明的实践来获知。本发明的特征和优点可通过在所附权利要求书中特别指出的工具和组合来实现和获得。本发明的这些和其他特征将通过以下描述和所附权利要求书变得更加显而易见,或可通过对下文中所述的本发明的实践来领会。


为了描述可获得本发明的上述和其他优点和特征的方式,将通过参考附图中示出的本发明的具体实施例来呈现以上简要描述的本发明的更具体描述。可以理解,这些附图仅描述本发明的典型实施例,从而不被认为是对其范围的限制,本发明将通过使用附图用附加特征和细节来描述和说明,在附图中图I示出了促进仿真指针的示例性计算机架构。图2示出了用于对指针进行仿真的示例性方法的流程图。
具体实施例方式本发明涉及用于仿真指针的方法、系统和计算机程序产品。访问较低级代码的多个指令。所述多个指令是从较高级代码的相应语句和表达式中翻译的。所述多个较低级指令包括如下较低级指令所述较低级指令表示来自该较高级代码的定义多个不同变量的语句和表达式。所述多个变量包括一个或多个指针、一组局部变量、一组共享存储器变量、以及全局存储器资源。所述多个较低级指令还包括如下指令所述指令表示来自较高级代码的对所述一个或多个指针中的指针进行分配或解除引用(dereference)的语句和表达式。该较低级代码被修改以对所述一个或多个指针的定义和使用进行仿真。所述多个较低级指令被内联(inline)到单个函数中。该单个函数被配置为在处理器处执行时向处理器内核(kernel)提供对该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识。生成指针仿真指令。所述指针仿真指令定义一个或多个数组。所述一个或多个数组用于存储该组局部变量和该组共享变量。所述指针仿真指令将每个局部变量和每个共享变量分配给所述一个或多个数组之一中的位置。所述指针仿真指令通过定义一对变量、即标签变量和偏移量变量来表示所述一个或多个指针中的每个指针。该标签变量用于存储如下的值该值用于标识出所仿真的指针指向的一个或多个数组之一或全局存储器资源。该偏移量变量对应于该标签变量,并且用于存储用于标识出数组位置的值。对于较低级代码中的将地址值分配给指针之处的每个位置而言,指针仿真指令向标签变量和相应偏移量变量中的一个或多个赋值。对标签变量和/或偏移量变量的赋值将标识出所述一个或多个数组之一或全局存储器资源内的某位置以仿真向指针分配地址值。 对于较低级代码中的对指针进行解除引用之处的每个位置而言,指针仿真指令向所述一个或多个数组之一或全局存储器资源内的某位置赋值/从该位置读取值。向某位置赋值/从该位置读取值基于赋给标签变量的值以及赋给相应偏移量变量的值以对指针的解除引用进行仿真。用指针仿真指令来替换如下较低级指令所述较低级指令表示来自较高级代码的定义所述多个变量以及向所述一个或多个指针中的指针进行分配或解除引用的语句和表达式。
本发明的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器等计算机硬件,这在下面予以更详细讨论。本发明范围内的各实施例还包括用于携带或存储计算机可执行指令和/或数据结构的物理介质和其他计算机可读介质。这些计算机可读介质可以是通用或专用计算机系统能够访问的任何可用介质。存储计算机可执行指令的计算机可读介质是计算机存储介质(设备)。携带计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种完全不同类型的计算机可读介质计算机存储介质(设备)和传输介质。计算机存储介质(设备)包括RAM、ROM、EEPROM、CD-ROM、DVD或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置(软件)的且可由通用或专用计算机访问的任何其他介质。“网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应被包括在计算机可读介质的范围内。此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(设备)(或反之亦然)。例如,通过网络或数据链接接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如, “NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质(设备)。因而,应当理解,计算机存储介质(设备)可被包括在还利用 (甚至主要利用)传输介质的计算机系统组件中。计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可位于本地和远程存储器存储设备两者中。图I示出了促进指针仿真的示例性计算机架构100。参考图1,计算机架构100 包括代码翻译器101、内联模块103、以及指针仿真模块102。所描绘的组件中的每一个可通过诸如例如局域网(“LAN”)、广域网(“WAN”)和甚至因特网等网络(或可作为网络的一部分)彼此连接。因此,所描绘的组件中的每一个以及任何其他连接的计算机系统及其组件都可以创建消息相关数据并通过网络交换消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他更高层协议,诸如传输控制协议(“TCP”)、超文本传输协议 (“HTTP”)、简单邮件传输协议(“SMTP”)等)。一般而言,代码翻译器101被配置为将(第一格式的)较高级代码的表达式和语句翻译(例如编译)成较低级代码的指令。该较高级代码可以以诸如例如C++、Visual Basic等等之类的通用编程语言。该较低级代码可以是该较高级代码的中间表示(“IR”), 该中间表示捕捉关于(第一格式的)较高级代码的表达式和语句的合适信息。还可以生成捕捉(第一格式的)较高级代码的表达式和语句的控制流的控制流图(“CFG”)。内联模块103被配置为把将由内核调用的所有方法内联到单个函数中。该单个函数向内核提供对以可传递方式被声明并由该内核使用的共享和局部变量以及全局存储器资源的静态知识(或者编译时知识)。在一些实施例中,内联模块103被包括在指针仿真模块102内或者是指针仿真模块102的一部分。一般而言,指针仿真模块102被配置为将定义和使用指针的较低级代码(IR指令) 用对指针的定义和使用进行仿真的另一较低级代码(其他IR指令)来替换。如所述那样, 指针仿真模块102包括替换指令生成器104和指令替换模块106。替换指令生成器104被配置为生成用于指针定义和指针使用的替换仿真指令。替换指令生成器104可以接收包含指针定义和指针使用的经内联的较低级代码(例如IR指令)。替换指令生成器104可以生成指针仿真指令(例如仿真IR指令)来对指针定义和指针使用进行仿真。指针仿真指令可以包括数组定义、变量分配、标签变量定义、偏移量变量定义、指针定义指令、指针分配指令、以及指针解除引用指令。指令替换模块106被配置为用指针仿真指令替换指针定义和指针使用。指令替换模块106可以接收经内联的较低级代码和指针仿真指令。经内联的较低级代码可以包含指针定义和指针使用。指令替换模块106可以用经内联的较低级代码内的指针仿真指令来替换指针定义、分配和解除引用指令。然后,包含指针仿真指令的经内联的较低级代码可以被进一步翻译或编译成其他代码格式。在一些实施例中,经内联的较低级代码被翻译成(与用于生成较低级代码的格式相同或不同格式的)较高级代码的表达式和状态。例如,经内联的IR指令可以被翻译成 DirectX( “DX”)、C++、Visual Basic等等的高级着色器语言(“HLSL”)。在其他实施例中,经内联的较低级代码被编译。例如,经内联的IR指令可以被编译成HLSL字节代码。图2示出了用于对指针进行仿真的示例性方法200的流程图。方法200将参考计算机体系结构100的组件和数据来描述。代码翻译器101可以访问较高级代码111 (例如DPC++源代码)。较高级代码111 包括表示指针定义114和指针使用116的语句和表达式112。指针定义可以包括具有定义指针的较高级语言的语句,诸如例如“int *p; ”。指针使用可以包括以较高级语言的对指针进行分配的语句,诸如例如“P = &a” (向指针变量“P”分配变量“a”的地址);以及对指针进行解除引用的指令,诸如例如“*P = 8 ; ”(定位P所引用的存储器地址并且将该位置设置为寻址到8)。代码翻译器101可以将较高级代码111翻译成较低级代码121 (例如 IR)。尽管为不同格式,但是较低级代码121包括表示指针定义114和指针使用116的指令 122。
10
方法200包括访问较低级代码的多个指令的动作,所述较低级代码的多个指令是从较高级代码的相应语句和表达式翻译而来的,所述多个较低级指令包括表示来自该较高级代码的定义多个不同变量的语句和表达式的较低级指令,所述多个变量包括一个或多个指针、一组局部变量、一组共享存储器变量、以及全局存储器资源,所述多个较低级指令还包括表示来自该较高级代码的向所述一个或多个指针中的指针进行分配或解除引用的语句和表达式的指令。例如,指针仿真模块102可以访问较低级代码121。较低级代码121包括从语句和表达式112翻译的指令122。指令122包括表示来自语句和表达式112的多个变量定义的较低级指令。所述多个所定义的变量包括一个或多个指针(例如指针定义114)、 一组局部变量、一组共享存储器变量、以及全局资源。指令122包括表示向所述一个或多个指针中的指针进行分配和/或解除引用的较低级指令(例如指针使用116)。方法200包括修改该较低级代码以对所述一个或多个指针的定义、分配和解除引用进行仿真的动作(动作202)。例如,指针仿真模块102可以访问较低级代码121。指针仿真模块102可以修改较低级代码121以对指针定义114和指针使用116进行仿真。指针使用116可以包括对指针进行赋值和解除引用。对指针定义、指针分配和指针解除引用进行仿真可以在不使用较高级代码111的指针特性的情况下实现。动作202包括将所述多个较低级指令内联到单个函数内的动作,该单个函数被配置为在处理器处执行时向处理器内核提供对该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识(动作203)。例如,内联模块103可以访问较低级代码121。内联模块103可以将较低级代码121内联到经内联的较低级代码123内。经内联的较低级代码123可以是单个函数。该单个函数可以向处理器(例如GPU)内核提供对语句和表达式 112中所表示的该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识。动作202包括生成指针仿真指令的动作(动作204)。例如,替换指令生成器104 可以访问包括指针定义114和指针使用116的指令122。替换指令生成器104可以生成用于对指针定义114和指针使用116进行仿真(例如不必使用较高级代码111的指针特性) 的指针仿真指令131。生成指针仿真指令131可以包括定义一个或多个数组,所述一个或多个数组用于存储该组局部变量和该组共享变量。一般而言,数组可以用于映射到以其他方式不能直接被索引化的存储器。例如,替换指令生成器104可以生成数组定义132。数组定义132可以定义一个或多个数组以用于存储语句和表达式112中所定义的该组局部变量和该组共享变量。在合适时,还可以为全局变量定义数组。在一些实施例中,为该组局部变量定义一个数组,并且为该组共享存储器变量定义一个数组。在其他实施例中,为该组局部变量定义两个或更多个数组。例如,可以为使用已知(例如编译时)偏移量被解除引用的局部变量定义第一局部数组。可以为其他局部变量定义第二局部数组。同样,可以为该组共享存储器变量定义两个或更多个数组。例如,可以为使用已知偏移量被解除引用的共享存储器变量定义第一共享存储器数组。可以为其他共享存储器变量定义第二共享存储器数组。在另外的实施例中,为每个局部变量以及为每个共享存储器变量定义唯一的数组。数组定义的各个组合也是可能的。例如,可以为共享存储器变量定义共享存储器数组, 可以为使用已知偏移量被解除引用的局部变量定义局部数组,或者为每个其他局部变量定义唯一的局部数组。生成指针仿真指令131可以包括将每个局部变量和每个共享变量分配给所述一个或多个数组之一中的位置。例如,替换指令生成器104可以生成变量分配133。变量分配 133可以每个局部变量和每个共享存储器变量分配给由数组定义132所定义的数组之一中的位置。向数组的分配可以包括向与其他变量共享的数组的分配、或者向变量的唯一数组的分配。一般而言,可以定义一对变量来表示指针。生成指针仿真指令131可以包括通过定义一对变量来表示所述一个或多个指针中的每个。定义一对变量可以包括定义标签变量,该标签变量用于存储如下的值该值用于标识出所仿真的指针指向的一个或多个数组之一或全局存储器资源。例如,替换指令生成器104可以生成标签变量定义134。标签变量定义134定义标签变量,所述标签变量用于存储用于标识出变量定义132所定义的数组的值。定义一对变量还可以包括定义对应于该标签变量的偏移量变量,该偏移量变量用于存储用于标识出数组位置的值。例如,替换指令生成器104可以生成标签偏移量变量定义136。偏移量变量定义136定义偏移量变量,所述偏移量变量用于存储用于标识出数组定义132所定义的数组内的位置的值。生成指针仿真指令131可以包括针对该较低级代码中的向指针分配地址值之处的每个位置,向所述标签变量和相应偏移量变量中的一个或多个赋值以标识出所述一个或多个数组之一或全局存储器资源内的位置以仿真向指针分配地址值。例如,替换指令生成器104可以生成指针分配指令137。针对指令122中的向指针分配地址值之处的每个位置, 指针分配指令137向标签变量和/或偏移量变量赋值以标识出由数组定义132所定义的数组中的位置。生成指针仿真指令131可以包括针对该较低级代码中的对指针进行解除引用之处的每个位置,基于向标签变量所赋的值以及向相应偏移量变量所赋的值向所述一个或多个数组之一或全局存储器资源中的位置赋值/从该位置读取值以仿真对指针的解除引用。 例如,替换指令生成器104可以生成指针解除引用指令138。针对指令122中的对指针进行解除引用之处的每个位置,基于标签变量定义134中所定义的标签变量的值以及偏移量变量定义136中所定义的偏移量变量的值向数组定义132中所定义的数组之一中的位置赋值。动作202包括用指针仿真指令来替换如下较低级指令的动作所述较低级指令表示来自该较高级代码的定义所述多个变量以及向所述一个或多个指针中的指针进行分配或解除引用的语句和表达式(动作205)。例如,指令替换模块106可以访问内联较低级代码123和指针仿真指令131。指令替换模块106可以用指针仿真指令131替换指针定义114 和指针使用116。指针仿真模块102可以输出经内联的较低级代码123以用于进一步处理, 比如例如翻译成HLSL源代码或者编译成HLSL字节代码。仿真代码可以用于仿真任何数目的其他指针操作,包括指针算数、指针比较(例如‘ = =、‘>’等等)以及不同指针类型之间的强制转换(例如int*到float*)。本发明的各实施例还可以用于仿真以多种不同源代码语言所定义和使用的指针。 例如,本发明的各实施例包括访问数据并行C++( “DPC++”)源代码。DPC++源代码可以包括定义和使用(例如分配和解除引用)一个或多个指针的表达式和语句。DPC++源代码被翻译成IR指令。IR指令表示来自DPC++源代码的指针定义和指针使用。IR指令被内联到单个函数中。生成指针仿真指令以仿真来自DPC++源代码的指针定义和指针使用。指针仿真指令与来自DPC++源代码的指针定义和指针使用一致(但是未实际定义或使用来自DPC++特性集合的指针)。指针仿真指令被插入到经内联的IR指令中,从而替换来自DPC++源代码的指针定义和指针使用。然后,包含指针仿真指令的经内联的IR指令可以被翻译成HLSL 源代码和/或被编译成HLSL字节代码。基于包含指针仿真指令的IR指令的HLSL字节代码可以在缺少指针支持或限制指针使用的图形处理单元(“GPU”)环境中执行。例如,在以下代码段中
权利要求
1.一种在包括一个或多个处理器和系统存储器的计算机系统处的用于对指针进行仿真的方法,所述方法包括访问从较高级代码(111)的相应语句和表达式(112)中翻译的较低级代码(121)的多个较低级指令(122)的动作,所述多个较低级指令(122)包括表示来自该较高级代码的定义多个不同变量的语句和表达式的较低级指令,所述多个变量包括一个或多个指针(114)、 一组局部变量、一组共享存储器变量、以及全局存储器资源,所述多个较低级指令还包括表示来自该较高级代码的向所述一个或多个指针中的指针(116)进行分配或解除引用的语句和表达式的指令;修改较低级代码(121)以对所述一个或多个指针的定义(114)和使用(116)进行仿真的动作,包括将所述多个较低级指令内联到单个函数(123)中的动作,所述单个函数被配置为在所述处理器处执行时向处理器内核提供对该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识;生成指针仿真指令(131)的动作,所述指针仿真指令定义一个或多个数组(132),所述一个或多个数组用于存储该组局部变量和该组共享变量;将每个局部变量和每个共享变量分配给所述一个或多个数组(133)之一中的位置;通过定义一对变量来表示所述一个或多个指针中的每个指针,包括定义标签变量(134),所述标签变量用于存储如下的值该值用于标识出所仿真的指针指向的一个或多个数组之一或全局存储器资源;以及定义对应于所述标签变量的偏移量变量(133),所述偏移量变量用于存储用于标识出数组位置的值;针对该较低级代码中的向指针分配地址值之处的每个位置,向所述标签变量和相应偏移量变量中的一个或多个赋值以标识出所述一个或多个数组之一或全局存储器资源内的位置以仿真向指针(137)分配地址值;针对该较低级代码中的对指针进行解除引用之处的每个位置,基于向标签变量所赋的值以及向相应偏移量变量所赋的值向所述一个或多个数组之一或全局存储器资源中的位置赋值以仿真对指针(138)的解除引用;以及用指针仿真指令(131)来替换如下较低级指令的动作所述较低级指令表示来自该较高级代码的定义所述多个变量(114)以及向所述一个或多个指针中的指针(116)进行分配或解除引用的语句和表达式。
2.如权利要求I所述的方法,其特征在于,生成以第二格式的定义一个或多个数组的语句和表达式的动作包括生成以第二格式的定义局部数组和共享存储器数组的语句和表达式的动作,所述局部数组用于存储该组局部变量,所述共享存储器数组用于存储该组共享存储器变量。
3.如权利要求2所述的方法,其特征在于,生成以第二格式的将该组局部变量中的每个局部变量和该组共享存储器变量中的每个共享存储器变量分配给所述一个或多个数组之一中的位置的语句和表达式的动作包括生成以第二格式的如下语句和表达式的动作所述语句和表达式将该组局部变量分配到所述局部数组中并且将该组共享存储器变量分配到所述共享存储器数组中。
4.如权利要求所述I的方法,其特征在于,生成以第二格式的定义一个或多个数组的语句和表达式的动作包括生成以第二格式的定义第一局部数组和第二局部数组的语句和表达式的动作,第一局部数组用于存储来自该组局部变量的使用已知偏移量被解除引用的局部变量,第二局部数组用于存储来自该组局部变量的其他局部变量。
5.如权利要求所述I的方法,其特征在于,基于向标签变量所赋的值以及向相应偏移量变量所赋的值向所述一个或多个数组之一或全局存储器资源中的位置赋值以仿真对指针的解除引用的动作包括生成swi tch语句结构的动作,所述swi tch语句结构根据由所述标签变量定义所定义的标签变量中的一个或多个的值、以及根据由所述偏移量变量定义所定义的偏移量变量中的一个或多个的值进行条件判断。
6.如权利要求5所述的方法,其特征在于,还包括对所生成仿真代码执行数据流分析的动作;静态地标识出一些标签值从不在解除引用仿真指令处被分配给标签变量的动作;以及通过从所述switch语句结构中移除至少一个switch case来优化所述switch语句结构的动作。
7.一种供在计算机系统处使用的计算机程序产品,所述计算机程序产品用于实现一种用于对指针进行仿真的方法,所述计算机程序产品包括其上存储有计算机可执行指令的一个或多个计算机存储介质,所述指令在处理器处执行时致使所述计算机系统执行所述方法,所述方法包括以下动作访问较低级代码(121)的多个指令(122),所述较低级代码(121)是从较高级代码 (111)的相应语句和表达式(112)中翻译的,所述多个较低级指令(122)包括表示来自该较高级代码的定义多个不同变量的语句和表达式的较低级指令,所述多个变量包括一个或多个指针(114)、一组局部变量、一组共享存储器变量、以及全局存储器资源,所述多个较低级指令还包括表示来自该较高级代码的向所述一个或多个指针中的指针(116)进行分配或解除引用的语句和表达式的指令;修改较低级代码(121)以对所述一个或多个指针的定义(114)和使用(116)进行仿真,包括将所述多个较低级指令内联到单个函数(123)中,所述单个函数被配置为在所述处理器处执行时向处理器核心提供对该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识;生成指针仿真指令(131),所述指针仿真指令定义一个或多个数组(132),所述一个或多个数组用于存储该组局部变量和该组共享变量;将每个局部变量和每个共享变量分配给所述一个或多个数组(133)之一中的位置; 通过定义一对变量来表示所述一个或多个指针中的每个,包括定义标签变量(134),所述标签变量用于存储如下的值该值用于标识出所仿真的指针指向的一个或多个数组之一或全局存储器资源;以及定义对应于所述标签变量的偏移量变量(133),所述偏移量变量用于存储用于标识出数组位置的值;针对该较低级代码中的向指针分配地址值之处的每个位置,向所述标签变量和相应偏移量变量中的一个或多个赋值以标识出所述一个或多个数组之一或全局存储器资源内的位置以仿真向指针(137)分配地址值;针对该较低级代码中的对指针进行解除引用之处的每个位置,基于向标签变量所赋的值以及向相应偏移量变量所赋的值向所述一个或多个数组之一或全局存储器资源中的位置赋值以仿真对指针(138)的解除引用;以及用指针仿真指令(131)来替换如下较低级指令所述较低级指令表示来自该较高级代码的定义所述多个变量(114)以及向所述一个或多个指针中的指针(116)进行分配或解除引用的语句和表达式。
8.—种在包括一个或多个处理器和系统存储器的计算机系统处的用于对C++指针进行仿真的方法,所述方法包括访问C++源代码的中间表示(121)的动作,所述中间表示包括表示来自所述C++源代码的定义多个不同变量的语句和表达式(112)的较低级指令(122),所述多个变量包括一个或多个指针(114)、一组局部变量、一组共享存储器变量、以及全局存储器资源,所述中间表示还包括表示来自所述C++源代码的向所述一个或多个指针(116)中的指针进行分配或解除引用的语句和表达式的较低级指令;修改中间表示(121)以对所述一个或多个指针的定义和使用进行仿真的动作,包括 将所述中间表示内联到单个函数(123)中的动作,所述单个函数被配置为在所述处理器处执行时向处理器内核提供对该组局部变量、该组共享存储器变量、以及该全局存储器资源的直接知识;生成指针仿真指令(131)的动作,所述指针仿真指令定义一个或多个数组(132),所述一个或多个数组用于存储该组局部变量和该组共享变量;将每个局部变量和每个共享变量分配给所述一个或多个数组(133)之一中的位置; 通过定义一对变量来表示所述一个或多个指针中的每个指针,包括定义标签变量(134),所述标签变量用于存储如下的值该值用于标识出所仿真的指针指向的一个或多个数组之一或全局存储器资源;以及定义对应于所述标签变量的偏移量变量(136),所述偏移量变量用于存储用于标识出数组位置的值;针对该较低级代码中的向指针分配地址值之处的每个位置,向所述标签变量和相应偏移量变量中的一个或多个赋值以标识出所述一个或多个数组之一或全局存储器资源内的位置以仿真向指针(137)分配地址值;针对该较低级代码中的对指针进行解除引用之处的每个位置,基于向标签变量所赋的值以及向相应偏移量变量所赋的值向所述一个或多个数组之一或全局存储器资源中的位置赋值以仿真对指针(138)的解除引用;以及用指针仿真指令(131)来替换如下较低级指令的动作所述较低级指令表示来自所述 C++源代码的定义所述多个变量(114)以及向所述一个或多个指针中的指针(116)进行分配或解除弓I用的语句和表达式。
9.如权利要求8所述的方法,其特征在于,还包括在用所述指针仿真指令替换所述较低级指令以后,将包括所述指针仿真指令的中间表示翻译成高级着色器语言(“HLSL”)源代码的动作。
10.如权利要求8所述的方法,其特征在于,还包括在用所述指针仿真指令替换所述较低级指令以后,将包括所述指针仿真指令的中间表示编译成高级着色器语言(“HLSL”) 字节代码以供在图形处理单元(“GPU”)上执行的动作。
全文摘要
本发明涉及仿真指针。本发明涉及用于仿真指针的方法、系统和计算机程序产品。可以通过如下方式来仿真指针用<变量#,偏移量>对替换该指针;以及用根据标签的switch和switch主体替换每个解除引用站点,该switch主体对该指针所指向的相应变量执行仿真的指针访问。可以使用数据流优化来减少switch的数目和/或减少在每个仿真的指针访问站点处需要考虑的case的数目。
文档编号G06F9/34GK102609243SQ20111044590
公开日2012年7月25日 申请日期2011年12月27日 优先权日2010年12月27日
发明者A·L·布利斯, J·L·拉普, Y·莱瓦诺尼, 张玲莉, 朱伟荣 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1