專利名稱:仿真指針的制作方法
技術領域:
本發明涉及仿真指針。
背景技術:
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·萊瓦諾尼, 張玲莉, 朱偉榮 申請人:微軟公司