專利名稱:具有低爭用和負擔均衡的并行xsl轉換的方法和裝置的制作方法
具有低爭用和負擔均衡的并行XSL轉換的方法和裝置
背景技術:
XML樣式表語言轉換(XSLT)已經成為用于在不同應用領域中處理和 /或轉換XML文件的最流行的語言之一。
可擴展樣式表語言轉換(XSLT)是一種用于將可擴展標識語言(XML) 文件轉換為其它文件的語言。典型地,XSLT處理器需要可擴展樣式表語言 (XSL)文件和輸入XML文件作為輸入。利用該XSL文件中的定義,XSLT 處理器可以將該輸入XML文件轉換為另一個文件。生成的輸出文件的格式 可以是XML或者另一種格式。例如,可以根據超文本標識語言(HTML) 對生成的輸出文件編排格式,或者其可以是純文本文件。典型地,XSLT不 強制任何執(zhí)行順序,即,可以按照任意不固定的順序執(zhí)行在處理輸入XML 文件的過程中由XSLT處理器所執(zhí)行的指令。然而,執(zhí)行XSLT會在時間、 存儲器和計算資源方面開銷較大。
通過實例方式舉例說明本發(fā)明的實施例,并不局限于附圖,其中相同
的參考標號表示對應的、類似的或相似的元件,其中
圖1示出了根據本發(fā)明一些實施例的示例性方框圖2示出了根據本發(fā)明一些實施例的任務創(chuàng)建的示例性分級,以及根
據本發(fā)明一些實施例的示例性堆棧;
圖3示出了根據本發(fā)明一些實施例的輸出生成器的示例性操作;以及
圖4示出了根據本發(fā)明一些實施例的示例性偽代碼。
應當注意,為了舉例說明的簡單和清楚起見,不必要按照比例畫出圖
中所示出的元件。例如,為了清楚,相對于其它元件,可以放大一些元件
的尺寸。
具體實施例方式
在下面的詳細描述中,提出了大量具體細節(jié),以便提供對本發(fā)明實施 例的全面理解。然而,本領域普通技術人員應該理解,可以在沒有這些具 體細節(jié)的情況下實現本發(fā)明的實施例。在其它實例中,沒有詳細描述公知 的方法、步驟、組件和電路,以避免遮掩本發(fā)明的實施例。
通常,本文將數據處理看作是一系列前后一致的作用于數據產生期望 結果的動作或操作。這包括物理量的物理操作。通常,盡管不是必須,這 些量采取電或磁信號的形式,所述電或磁信號能夠被存儲、傳輸、合并、 比較以及進行其它操作。主要由于普遍使用的原因,已經多次證明,將這 些信號稱為比特、數值、元素、符號、字符、項、數字等是便利的。然而 應當理解,全部這些以及相似術語將與適當的物理量相關聯,并且僅僅是 應用于這些量的便利標記。
除非特別聲明,否則應當注意,如從下面論述中顯而易見的,在本說 明書的全部論述中,利用如"處理"、"計算"、"推算"、"確定"等術語, 來描述計算機或計算系統(tǒng)、或者相似電子計算設備的動作和/或處理,其將 在計算系統(tǒng)的寄存器和/或存儲器中表示為諸如電子這樣的物理量的數據, 操作和/或轉換為其它數據,所述其它數據類似地表示為計算系統(tǒng)的存儲器、 寄存器或者其它這樣的信息存儲、傳輸或顯示設備中的物理量。
本發(fā)明的實施例可以包括用于執(zhí)行本文所述操作的裝置。該裝置可以 根據期望的用途具體構造,或者其可以包括由存儲在計算機中的計算機程 序選擇性地激活或配置的通用計算機。所述計算機程序可以存儲在計算機 可讀存儲介質中,例如但不限于,任意類型的磁盤,包括軟盤、光盤、
CD-ROM、磁光盤、只讀存儲器(ROM)、隨機訪問存儲器(RAM)、電可 編程只讀存儲器(EPROM)、電可擦寫可編程只讀存儲器(EEPROM)、磁 或光卡,或者適用于存儲電子指令并且能夠被耦合到計算機系統(tǒng)總線上的 任意其它類型介質。
本文所提出的處理和顯示,不是固有地與任意特定計算機或其它裝置 相關。可以使用具有與本文的教導一致的程序的不同通用系統(tǒng),或者可以 證實,構造更加專用的裝置以執(zhí)行期望的方法是便利的。下面的描述中將 呈現出多種所述系統(tǒng)的期望結構。此外,沒有參照任何編程語言對本發(fā)明 的實施例進行描述。應當注意,多種編程語言可以用于實現如本文所描述
的發(fā)明教導。
除非明確聲明,否則本文所描述的方法實施例不局限于具體順序或次 序。此外, 一些所描述的方法實施例或其元件,能夠在相同時間點發(fā)生或 執(zhí)行。
根據本發(fā)明的實施例,并行XSLT轉換可以減少時間和內存開銷,同 時可能提高對計算資源的利用。現在參照圖1,其示出了根據本發(fā)明實施例 的示例性流程。XSL文件110可以用于輸入到XSLT編譯器120。編譯器 120可以基于XSL文件110,生成可執(zhí)行計算機代碼130。 XML文件140 可以用于輸入到執(zhí)行150,所述執(zhí)行150可以是代碼130的可執(zhí)行實例。輸 出文件160可以是執(zhí)行150的輸出。根據本發(fā)明的一些實施例,執(zhí)行150 可以包括多個執(zhí)行模塊。
在本發(fā)明的一些實施例中,編譯器120可以解析輸入的XSL文件110, 以及可以進一步識別多個指令或多組指令,其例如作為單個任務可以組合 在一起并且與其它指令分開執(zhí)行。任務可以包括一個指令集,其可以與構 成文件110的其它指令分開并獨立地執(zhí)行。通過多個執(zhí)行模塊,例如通過 多個執(zhí)行線程,或者多個適當的硬件模塊,可以同時并行地執(zhí)行多個任務。 編譯器120還可以在代碼130中插入可執(zhí)行代碼,以將多個指令或多組指 令轉換成為多個分開的任務。在本發(fā)明的一些實施例中,編譯器120可以 檢測或識別這種可分開或獨立指令,并且在代碼130中插入代碼,以將這 些獨立增令轉換成為多個分開的任務。
獨立指令可以是不依靠在所述指令的代碼之外定義的變量的指令,而 且還對其它指令不具有流程依賴性。流程依賴性的一個實例是一個指令依 賴另一個指令的輸出或執(zhí)行。例如,指令X需要指令Y的輸出作為輸入。 因此,作為多個獨立的任務來執(zhí)行指令X和Y會導致兩個任務,從而例如 通過同時運行的兩個不同線程來同時執(zhí)行兩個指令,或者兩個不同硬件模 塊同時執(zhí)行指令X和Y。然而,因為在指令Y的執(zhí)行完成之前,指令Y的 輸出是不完整的或不可用的,所以指令X可能被提供無效的或不正確的輸 入。因此,指令X和Y被看作是相依賴的,而不是彼此獨立的。應當注意, 指令X和Y相對其它指令可以是獨立的。
另一個依賴性的實例可以是,指令A依靠例如變量C,變量C被前一
個指令例如指令B修改。因此,在這種情況下,如果將指令A和B轉換成 為兩個分開的任務,然后例如通過兩個分開的執(zhí)行模塊來獨立地執(zhí)行這兩 個任務,那么指令A的執(zhí)行可能被提供不正確的變量C。
根據本發(fā)明的實施例,提供了一種機制以確保相依賴的指令按照適當 的順序執(zhí)行。例如,本發(fā)明的實施例可以要求指令Y在指令X之前執(zhí)行, 或者要求在執(zhí)行指令A的任務幵始執(zhí)行之前,完成執(zhí)行指令B的任務。
獨立指令的實例可以是XSL指令,例如但不限于xsl:for-each和 xsl:apply-templates,其可以在XML文件的節(jié)點集合或節(jié)點序列中的多個節(jié) 點之間循環(huán),并且還可以對每個節(jié)點執(zhí)行一些指令。因為這些指令是相互 獨立的,所以可以將它們轉換成為可以獨立以及可能同時執(zhí)行的多個任務。 除了預先己知為獨立的XSL指令之外,例如上述的xsl:for-each和 xsl:apply-templates,編譯器120可以解析或檢查文件110,査找指令,以及 可以進一步檢查這些指令的特性,例如但不限于,流程依賴性和/或變量依 賴性。依據這樣的特性,編譯器120可以將一個或多個指令組成單個任務。 例如,如果在幾個指令之間識別出一些依賴性,則可以將這幾個指令組成 單個任務。例如,在許多指令使用相同變量的情況下,編譯器120可以將 這些指令和所述變量的定義一起組成一個任務。
在本發(fā)明的一些實施例中,任務可以嵌套。例如, 一個任務可以在另 一個任務內部創(chuàng)建。例如,在xsl:for-each指令內部出現的xsl:apply-templates 指令,可以在為xsl:for-each指令創(chuàng)建的任務內部,創(chuàng)建xsl鄰ply-templates 指令的任務。除插入代碼外,所述代碼用于創(chuàng)建可以由不同執(zhí)行模塊同時 并行執(zhí)行的任務,編譯器120也可以創(chuàng)建后續(xù)任務。后續(xù)任務可以執(zhí)行動 作,例如但不限于,釋放分配的內存、操作堆、釋放指針、或任意其它可 能需要的后續(xù)動作。例如,當首次遇到xsl:apply-templates指令時,會為模 版分配內存,以及需要保存上下文??梢詫sl:apply-templates結構轉換為 多個任務,所述多個任務可以由不同執(zhí)行模塊依次執(zhí)行;然而,需要將已 分配的內存釋放,以及需要將保存的上下文恢復。因此,可以由后續(xù)任務 完成這些動作,在執(zhí)行xsl:apply-templates結構的任務終止之后,執(zhí)行所述 后續(xù)任務??梢詣?chuàng)建全局后續(xù)任務,用于沒有組成在任何任務中的執(zhí)行指 令和所需要的其它動作。全局后續(xù)任務可以執(zhí)行諸如例如釋放已分配的內存、恢復上下文、釋放指針、和/或恢復堆這樣的動作,以及可能沒有組成
在任何任務中的執(zhí)行指令。編譯器120可以選擇將一個或多個指令留在全 局后續(xù)任務中,例如,任務創(chuàng)建的系統(tǒng)開銷相當高的輕量指令。全局后續(xù) 任務可以是最后執(zhí)行的任務。
在本發(fā)明的一些實施例中,轉換XML文件可以由多個執(zhí)行模塊來實 現。根據本發(fā)明的實施例,執(zhí)行模塊的數量可以是任意適當的數值,例如, 以提供靈活性。例如,線程的數量可以是多處理器平臺的處理器的數量, 或者其可以是任意適當的數值,例如適用于特定多任務操作系統(tǒng)環(huán)境的數 值。在本發(fā)明的其它實施例中,由編譯器120生成的代碼可以嵌入到硬件 中,在該情況下,可以根據適當的因素選擇執(zhí)行硬件模塊的數量。
在本發(fā)明的一些實施例中,執(zhí)行模塊可以具有或者關聯于任務堆棧。 任務堆棧可以包含一個或多個將要被執(zhí)行的任務。執(zhí)行模塊可以將任務置 于其堆棧中執(zhí)行,例如,可以將由執(zhí)行模塊創(chuàng)建的任務置于與該執(zhí)行模塊 關聯的堆棧中。執(zhí)行模塊可以從堆棧中取回任務。例如,執(zhí)行模塊可以從 與其關聯的堆棧中取回任務,并執(zhí)行它們。根據本發(fā)明的一些實施例,執(zhí) 行模塊可以從另一個執(zhí)行模塊的任務堆棧中取回任務。例如,空閑執(zhí)行模 塊可以掃描其它執(zhí)行模塊的堆棧,并且基于該掃描,可以為其取回任務以 執(zhí)行。例如基于包括多于預定數量任務的堆?;蛄硪粎底龀鰪哪膫€堆棧 中取回任務的決定。在該情況下,執(zhí)行模塊可以從另一個執(zhí)行模塊的堆棧 中取回一個或多個任務,例如取回一半任務。執(zhí)行模塊還可以將取回的任 務置于其自身的堆棧中,以及進一步地從其堆棧中取回這些任務,并執(zhí)行 這些任務。執(zhí)行模塊,尤其,空閑執(zhí)行模塊從其它執(zhí)行模塊的堆棧中取回 任務的能力,使得能夠負荷均衡執(zhí)行,因為執(zhí)行任務的負荷可以由多個執(zhí) 行模塊共享或均衡。
根據本發(fā)明的一些實施例,當執(zhí)行模塊執(zhí)行用于創(chuàng)建任務的代碼時, 該執(zhí)行模塊可以創(chuàng)建多個任務以及與其關聯的后續(xù)任務。該執(zhí)行模塊可以 進一步將后續(xù)任務以及所創(chuàng)建的任務按照相反的順序置于其堆棧中。例如, 循環(huán)N個節(jié)點的xsl:for-each結構,可以產生N個任務。在這種情況下,執(zhí) 行模塊可以創(chuàng)建N個任務和一個后續(xù)任務,該N個任務的每個任務可能實 現xsl:for-each結構的一次循環(huán)??梢允紫葘⒃摵罄m(xù)任務置于堆棧中,接下 來是第一個任務,然后是第二個任務,等等,以及最后將第N個任務置于 堆棧中。根據本發(fā)明的實施例,當執(zhí)行模塊從其堆棧中取回任務時,它首 先取回置于堆棧中的最后一個任務,例如,在上面實例中,首先取回第N 個任務,可能接下來是第(N—l)個任務,等等。在最后或者該多個關聯 任務之后,取回并執(zhí)行所述后續(xù)任務。例如,在循環(huán)任務的情況下,例如 xsl:for-each和xsl:apply-templates,在構成該循環(huán)的全部多個關聯任務執(zhí)行 完成之后,取回并執(zhí)行該后續(xù)任務。
根據本發(fā)明的實施例,在一些環(huán)境下,執(zhí)行模塊可以禁止從與其它執(zhí) 行模塊關聯的堆棧中取回某些任務。例如,在本發(fā)明的一些實施例中,執(zhí) 行模塊可以禁止從另一執(zhí)行模塊的堆棧中提取后續(xù)任務,從而確保后續(xù)任 務的執(zhí)行可以留給創(chuàng)建所述后續(xù)任務的執(zhí)行模塊來執(zhí)行。將后續(xù)任務的執(zhí) 行留給創(chuàng)建該后續(xù)任務的執(zhí)行模塊,可以利于減少執(zhí)行開銷并且提高執(zhí)行 本地化。后續(xù)任務可以具有與其關聯的上下文,其形式為例如,初始化的 變量、初始化的指針、分配的內存等。允許執(zhí)行模塊取回后續(xù)任務,會引 起上下文拷貝,這代價很高。此外,允許創(chuàng)建后續(xù)任務的執(zhí)行模塊執(zhí)行所 述后續(xù)任務,可以提高代碼執(zhí)行的本地化,這是提高處理器的緩存命中所 期望的,從而通過重復使用存儲在處理器緩存中的變量、數據和/或指令, 來提高效率。
由于典型地,后續(xù)任務會在與其關聯的全部其它任務執(zhí)行之后執(zhí)行, 所以將計數器與后續(xù)任務相關聯,其中該計數器的數值可以反映在后續(xù)任 務可以執(zhí)行之前,需要執(zhí)行的任務的數量。在后續(xù)任務和關聯任務創(chuàng)建之 后,可以將該計數器初始化為關聯任務的數量。隨著每個關聯任務的執(zhí)行, 還可以減小該計數器。在本發(fā)明的一些實施例中,執(zhí)行模塊可以在執(zhí)行所 述后續(xù)任務之前,驗證所述計數器的數值為零。
根據本發(fā)明的實施例,執(zhí)行模塊可以從另一個執(zhí)行模塊的堆棧中取回 一個以上任務。例如,執(zhí)行模塊可以取回另一個執(zhí)行模塊堆棧中的一組連 續(xù)任務,例如一半任務,以及可以進一步將取回的任務置于其自身的堆棧 中用于執(zhí)行。根據本發(fā)明的實施例,取回一組連續(xù)的任務可以利于提高執(zhí) 行代碼本地化,并且因此,例如,由于取回的多個連續(xù)任務調用將要執(zhí)行
的相同代碼,可能提高處理器緩存命中的事實,提高了效率。
根據本發(fā)明的一些實施例,從另一個執(zhí)行模塊的堆棧中取回任務的執(zhí) 行模塊,可以從所述堆棧的底部取回任務,即,擁有所述堆棧的執(zhí)行模塊 最后執(zhí)行的任務。因為堆棧中相鄰的任務很可能共享相同的執(zhí)行代碼,并 且因為堆棧的擁有者正從該堆棧的頂部開始執(zhí)行任務,所以從堆棧的底部 取回任務,可以提高擁有該堆棧的執(zhí)行模塊的代碼本地化。此外,取回多 個任務可以減少執(zhí)行模塊需要從其它執(zhí)行模塊的堆棧中取回任務的次數, 因此可能減少與從堆棧到堆棧移動任務相關聯的系統(tǒng)開銷。因為當嘗試取 回的次數較小時,執(zhí)行模塊爭用相同任務的可能性較小,所以通過取回多 個任務,可以相應降低取回的數量,也可以減少爭用。
現在參照圖2A,其示出了根據本發(fā)明實施例的任務堆棧,以及圖2B, 其示出了根據本發(fā)明實施例的任務創(chuàng)建分級(hierarchy)的實例。所述分級 和堆棧是執(zhí)行模塊執(zhí)行創(chuàng)建多個任務的代碼,例如在n個節(jié)點之間循環(huán)的 xsl:for-each結構的結果。執(zhí)行模塊可以創(chuàng)建n個任務A (1)到A (n)和 后續(xù)任務A (cnt)。執(zhí)行模塊可以進一步將任務A (1)到A (n)和后續(xù)任 務A (cnt)置于其任務堆棧中。執(zhí)行模塊可以進一步取回任務A (1),并 執(zhí)行該任務。然而,任務A (1)包含在m個節(jié)點之間循環(huán)的xsl:for-each 結構,以及用于創(chuàng)建m個任務的代碼,所述m個任務實現該xsl:for-each 結構。執(zhí)行模塊可以創(chuàng)建m個任務B (1)到B (m)和后續(xù)任務B (cnt)。 執(zhí)行模塊可以進一步將任務B (1)到B (n)和后續(xù)任務B (cnt)置于其 任務堆棧中。執(zhí)行模塊可以進一步取回任務B (1),并開始執(zhí)行該任務。 任務B (1)包含用于創(chuàng)建如任務C (1)和其后續(xù)任務C (cnt)所示的另 一個任務的代碼。圖2A示出如何將在上述情形下創(chuàng)建的任務放置在任務堆 棧中。如圖所示,可以按照相反的順序將任務放置在堆棧中,即,首先執(zhí) 行最后創(chuàng)建的任務,而且,在從所述堆棧中提取出全部其它相互關聯的任 務之后,執(zhí)行后續(xù)任務。擁有堆棧的執(zhí)行模塊可以從堆棧的頂部取回任務, 同時其它執(zhí)行模塊可以從堆棧的底部取回任務。
根據萬維網聯盟(W3C) XSLT規(guī)范,在隱含動態(tài)上下文中執(zhí)行每個 XSLT指令。該上下文可以包括上下文節(jié)點、參數和變量綁定、命名空間范 圍等,以及具體執(zhí)行上下文信息。當執(zhí)行模塊創(chuàng)建一系列任務時,其不需 要拷貝上下文信息。代替地,執(zhí)行模塊可以創(chuàng)建該上下文的引用,并將該
引用封裝到任務中。如果另一個執(zhí)行模塊取回該任務,則可以拷貝該上下 文。如果創(chuàng)建任務的執(zhí)行模塊是執(zhí)行該任務的執(zhí)行模塊,則不需要拷貝上 下文,只要該創(chuàng)建任務的執(zhí)行模塊在其內存中具有該上下文。
除隱含動態(tài)上下文之外,執(zhí)行XSLT指令可依賴于,例如XPath和減 變量的內容。根據XSLT規(guī)范,可以通過一系列XSLT指令計算變量內容以 及XPath,所述XSLT指令又包含復雜指令,以及調用操作系統(tǒng),例如 "document()"以打開文件。該調用和計算可以暫停執(zhí)行模塊的執(zhí)行。例如, 訪問外部設備可以暫停執(zhí)行,直到該訪問操作完成。根據本發(fā)明的實施例, 編譯器120可以檢測所述情形。編譯器120可以為暫停執(zhí)行的各個指令創(chuàng) 建分開的任務,并可以進一步創(chuàng)建特定的同步后續(xù)任務。同步后續(xù)任務依 賴于由其它任務計算的變量或XPath。當要執(zhí)行同步后續(xù)任務時,可以將其 從堆棧中提取出來,但不是執(zhí)行它,而是檢査相關聯的計數器。隨著每個 與所述同步后續(xù)任務關聯的任務執(zhí)行完成,減少該關聯計數器,并當該關 聯計數器的數值達到零時,執(zhí)行所述同步后續(xù)任務。
如上文所描述的XML文件的并行轉換,可以要求輸出串行化。例如, 需要將多個執(zhí)行模塊的輸出組合在一起,以便構成輸出文件160。組合多個 執(zhí)行模塊的多個輸出需要例如根據輸入文件110來將所述輸出進行排序。 根據本發(fā)明的一些實施例,每個執(zhí)行模塊具有與其關聯的輸出對象。執(zhí)行 模塊可以指定一個輸出對象作為當前輸出對象,并可以進一步將其輸出指 向到該當前輸出對象。從另一個執(zhí)行模塊的堆棧中取回任務的執(zhí)行模塊, 可以創(chuàng)建其它執(zhí)行模塊的當前輸出對象的拷貝,并可以進一步將新創(chuàng)建的 輸出對象鏈接到擁有從其中取回任務的堆棧的執(zhí)行模塊的當前輸出對象。 執(zhí)行模塊可以進一步將新創(chuàng)建的輸出對象指定為其當前輸出對象,并將輸 出指向到該輸出對象。如上所述,任務可以嵌套在任務中,因此當執(zhí)行模 塊從另一個執(zhí)行模塊的堆棧中取回任務時,其要確定所取回的任務是否與 由擁有所述堆棧的執(zhí)行模塊或者由也具有從該堆棧取回的任務的另一個執(zhí) 行模塊執(zhí)行的任務,處于相同的嵌套級別。如果嵌套級別不相同,則該執(zhí) 行模塊創(chuàng)建任務柵欄(barrier)。任務柵欄可以用于將各個嵌套級別的輸出 進行分組。
串行化處理可以包括,根據輸出對象之間的鏈接,遍歷輸出對象列表,
并收集與輸出對象關聯的數據。串行處理使用任務柵欄,以便識別各個嵌
套級別的輸出?,F在參照圖3A、圖3B和圖3C,其示出了根據本發(fā)明一些 實施例創(chuàng)建的輸出對象和任務柵欄的實例。
在圖3A中,執(zhí)行模塊310可具有包含任務的堆棧。輸出對象310A是 執(zhí)行模塊310的當前輸出對象。執(zhí)行模塊320具有從執(zhí)行模塊310的堆棧 中取回的任務。執(zhí)行模塊320具有創(chuàng)建的任務柵欄310B。執(zhí)行模塊320進 一步將輸出對象310A拷貝到輸出對象320A,并進一步將輸出對象320A 指定為其當前輸出對象。執(zhí)行模塊320進一步將輸出對象320A鏈接到輸出 對象31 OA和任務柵欄31 OB 。
在圖3B中,執(zhí)行模塊330可具有從執(zhí)行模塊310的堆棧中取回的任務。 執(zhí)行模塊330進一步將輸出對象310A拷貝到輸出對象330A,以及進一步 將輸出對象330A指定為其當前輸出對象。執(zhí)行模塊330去耦合輸出對象 320A和輸出對象310A之間的鏈接。執(zhí)行模塊330進一步將輸出對象330A 鏈接到輸出對象310A,并將輸出對象330A鏈接到輸出對象320A。
在圖3C中,執(zhí)行模塊340可具有從執(zhí)行模塊310中取回的任務。執(zhí)行 模塊340檢測其取回的任務的嵌套級別不同于執(zhí)行模塊320和執(zhí)行模塊330 取回的任務的嵌套級別。因此,執(zhí)行模塊340創(chuàng)建任務柵欄310C。執(zhí)行模 塊340將輸出對象310A拷貝到輸出對象340A。執(zhí)行模塊340進一步去耦 合輸出對象330A和輸出對象310A之間的鏈接。執(zhí)行模塊340進一步將輸 出對象310A鏈接到輸出對象340A,執(zhí)行模塊340進一步將輸出對象340A 鏈接到任務柵欄310C。執(zhí)行模塊340進一步將任務柵欄310C鏈接到輸出 對象330A。
現在參照圖4,其示出了示例性偽代碼,該偽代碼實現本發(fā)明實施例的 一些組件。圖4A示出了實現執(zhí)行模塊的主循環(huán)的示例性偽代碼。如圖所示, 執(zhí)行模塊從其自己的堆棧中連續(xù)取回任務,并且如果該執(zhí)行模塊的堆棧是 空的,則其掃描其它執(zhí)行模塊的堆棧。如果在另一個執(zhí)行模塊的堆棧中查 找到任務,則該執(zhí)行模塊可以取回其中一些任務,將它們置于它自己的堆 棧中,并執(zhí)行這些任務。應當注意,在圖4A中描述的偽代碼沒有示出全部 步驟或細節(jié)。此外,應當注意,盡管所示的偽代碼可以取回單個任務,但 是執(zhí)行模塊可以預定義或動態(tài)計算取回任務的數量。圖4B示出實現從另一
個執(zhí)行模塊的堆棧中取回任務的示例性偽代碼。圖4C示出實現由 xsl:apply-templates結構或xsl:for-each結構創(chuàng)建多任務以及執(zhí)行所創(chuàng)建的任 務的示例性偽代碼。
盡管本文示出并描述了本發(fā)明的某些特征,但是本領域普通技術人員 將會想到很多修改、替代、變換以及等效。因此,應當理解,所附權利要 求書旨在本發(fā)明精神的最大范圍內,覆蓋全部這種修改和變換。
權利要求
1、一種方法,包括生成可執(zhí)行代碼,以便當被執(zhí)行時,所述代碼將可擴展樣式表語言(XSL)文件中的多個指令轉換為多個任務,并執(zhí)行所述多個任務;通過多個執(zhí)行模塊來并發(fā)地執(zhí)行所述可執(zhí)行代碼,其中,提供XML文件作為輸入,并且其中,每個執(zhí)行模塊執(zhí)行所述可執(zhí)行代碼;以及根據所述多個執(zhí)行模塊的多個輸出,生成一個或多個輸出文件。
2、 如權利要求l所述的方法,其中,所述多個執(zhí)行模塊是多個執(zhí)行線程。
3、 如權利要求l所述的方法,其中,所述多個執(zhí)行模塊是多個硬件模塊。
4、 如權利要求l所述的方法,其中,生成所述可執(zhí)行代碼包括 在所述XSL文件中,查找xsl:for-each和xsl:apply-templates指令,以及生成所述可執(zhí)行代碼,以便當被執(zhí)行時,所述代碼將所述查找的 xsl:for-each和xsl:apply-templates指令的每一個轉換為多個任務。
5、 如權利要求l所述的方法,其中,生成所述可執(zhí)行代碼包括 在所述XSL文件中,查找多個獨立指令,以及生成所述可執(zhí)行代碼,以便當被執(zhí)行時,所述代碼將所述查找的多個 獨立指令轉換為一個或多個任務。
6、 如權利要求l所述的方法,其中,當被執(zhí)行時所述多個任務中的至 少一些創(chuàng)建附加任務。
7、 如權利要求l所述的方法,其中,所述多個執(zhí)行模塊包括第一執(zhí)行模塊,將任務置于第一堆棧中,并進一步從所述第一堆棧的 頂部取回任務以用于執(zhí)行;以及第二執(zhí)行模塊,從所述第一堆棧的底部取回任務,將所述取回的任務 置于第二堆棧中,并從所述第二堆棧的頂部取回任務以用于執(zhí)行。
8、 如權利要求7所述的方法,其中,所述多個執(zhí)行模塊基于至少一個 負荷均衡參數,在所述多個執(zhí)行模塊之間分配所述任務的執(zhí)行。
9、 如權利要求7所述的方法,其中所述第一和第二執(zhí)行模塊將執(zhí)行輸 出指向各自的第一和第二輸出對象,其中,將基于從所述第一堆棧取回的 任務生成的第二輸出對象鏈接到第一輸出對象,以及其中生成所述輸出文 件包括根據所述鏈接收集來自所述第一和第二輸出對象的輸出。
10、 一種用于計算機系統(tǒng)中的制造產品,所述制造產品包括計算機可 用介質,其具有嵌于所述介質中的計算機可讀程序代碼裝置,所述程序代 碼包括計算機可讀程序代碼,當被執(zhí)行時,所述計算機可讀程序代碼致使 計算機生成可執(zhí)行代碼,以便當被執(zhí)行時,所述代碼將可擴展樣式表語言 (XSL)文件中的多個指令轉換為多個任務,并執(zhí)行所述多個任務;通過多個執(zhí)行模塊并發(fā)地執(zhí)行所述可執(zhí)行代碼,其中,提供XML文件 作為輸入,并且其中,每個執(zhí)行模塊執(zhí)行所述可執(zhí)行代碼;以及 根據所述多個執(zhí)行模塊的多個輸出,生成一個或多個輸出文件。
11、 如權利要求10所述的產品,其中,當被執(zhí)行時,所述計算機可讀程序代碼致使計算機通過以下步驟生成所述可執(zhí)行代碼在所述XSL文件中,查找xsl:for-each和xsl:apply-templates指令,以及生成所述可執(zhí)行代碼,以便當被執(zhí)行時,所述代碼將所述査找的 xsl:for-each和xsl:apply-templates指令的每一個轉換為多個任務。
12、 如權利要求10所述的產品,其中,當被執(zhí)行時,所述計算機可讀程序代碼致使計算機通過以下步驟生成所述可執(zhí)行代碼在所述XSL文件中,査找多個獨立指令,以及生成所述可執(zhí)行代碼,以便當被執(zhí)行時,所述代碼將所述査找的多個 獨立指令轉換為一個或多個任務。
13、 如權利要求10所述的產品,其中,當被執(zhí)行時,所述多個任務中 的至少一些創(chuàng)建附加任務。
14、 如權利要求10所述的產品,其中,所述多個執(zhí)行模塊包括 第一執(zhí)行模塊,將任務置于第一堆棧中,并進一步從所述第一堆棧的頂部取回任務以用于執(zhí)行;以及第二執(zhí)行模塊,從所述第一堆棧的底部取回任務,將所述取回的任務 置于第二堆棧中,并從所述第二堆棧的頂部取回任務以用于執(zhí)行。
15、 如權利要求14所述的產品,其中所述第一和第二執(zhí)行模塊將執(zhí)行 輸出指向各自的第一和第二輸出對象,其中,將基于從所述第一堆棧取回 的任務生成的第二輸出對象鏈接到第一輸出對象,以及其中生成所述輸出 文件包括根據所述鏈接收集來自所述第一和第二輸出對象的輸出。
全文摘要
一種方法,用于通過多個執(zhí)行模塊來并行轉換XML文件,以及根據該XML文件的語義順序來串行化輸出。
文檔編號G06F17/22GK101350007SQ20081013061
公開日2009年1月21日 申請日期2008年6月25日 優(yōu)先權日2007年6月26日
發(fā)明者B·卡洪, H·P·措伊, Q·張, T·李, U·卡列金, Y·孫 申請人:英特爾公司