本發(fā)明涉及執(zhí)行程序代碼的方法并且涉及對(duì)應(yīng)裝置。
背景技術(shù):
計(jì)算機(jī)技術(shù)的目前趨勢(shì)是,計(jì)算機(jī)系統(tǒng)配備有諸如多處理器核心這樣的并行處理能力。而且,應(yīng)用被移至因特網(wǎng),例如,作為web應(yīng)用。在某種程度上,web應(yīng)用可以被視為針對(duì)新應(yīng)用的多系統(tǒng)平臺(tái),因?yàn)樗鼈兛紤]到在各種web瀏覽器中執(zhí)行應(yīng)用,其又可以運(yùn)行在各種計(jì)算系統(tǒng)上。
然而,使用并行處理能力出現(xiàn)幾個(gè)問題。具體來說,有效利用并行處理能力可能需要專門設(shè)計(jì)的程序代碼,而且可能需要顯著努力來提供這種“并行化”程序代碼。在開發(fā)并行化程序代碼時(shí)可能出現(xiàn)的示例性問題是將一問題分解成并行部分,利用該可用并行處理能力來定標(biāo)問題(例如:“如果該問題可以在四個(gè)處理器核心上以一特定速度處理,那么,當(dāng)八個(gè)處理器核心可用時(shí),性能會(huì)加倍嗎?”),或者調(diào)試該并行化程序代碼。
對(duì)于程序代碼開發(fā)者來說,按透明方式處理這種問題的一個(gè)已知方法是,被稱為“線程級(jí)推測(cè)(Thread-Level Speculation)”的概念。對(duì)于線程級(jí)推測(cè)的情況下,在執(zhí)行該程序代碼期間調(diào)用的函數(shù)在一新線程中執(zhí)行,例如,在分離處理器核心上運(yùn)行。如果這種在新線程中執(zhí)行該函數(shù)造成沖突,那么,執(zhí)行回退,并接著在現(xiàn)有線程中執(zhí)行該函數(shù),典型地講,在由其調(diào)用該函數(shù)的線程中。
然而,無論何時(shí)調(diào)用函數(shù)都需要能夠執(zhí)行回退可能導(dǎo)致顯著的存儲(chǔ)器使用,因?yàn)樵陂_始在該新線程中執(zhí)行該函數(shù)時(shí),該系統(tǒng)的狀態(tài)需要加以存儲(chǔ)。
因此,需要一種考慮到在多個(gè)線程中有效執(zhí)行程序代碼的技術(shù)。
技術(shù)實(shí)現(xiàn)要素:
根據(jù)實(shí)施方式,提供了一種方法。根據(jù)所述方法,處理器裝置在一個(gè)或更多個(gè)線程中執(zhí)行程序代碼。所述程序代碼可以是基于腳本的web應(yīng)用,例如,基于JavaScript。所述處理器裝置在所述線程中的一個(gè)線程中檢測(cè)函數(shù)的調(diào)用,并且在另一線程中執(zhí)行所述函數(shù)。而且,所述處理器裝置在如下各項(xiàng)之間執(zhí)行選擇:當(dāng)在所述另一線程中開始執(zhí)行所述函數(shù)時(shí),保存所述處理器裝置的狀態(tài),與當(dāng)在所述另一線程中開始執(zhí)行所述函數(shù)時(shí),不保存所述處理器裝置的所述狀態(tài)。響應(yīng)于與在所述另一線程中執(zhí)行所述函數(shù)有關(guān)的沖突,所述處理器裝置可以執(zhí)行回退至所述處理器裝置的最后保存狀態(tài),并且在調(diào)用所述函數(shù)的所述線程中執(zhí)行該函數(shù)。
根據(jù)實(shí)施方式,所述選擇取決于所執(zhí)行的回退的數(shù)量。而且,所述選擇可以取決于當(dāng)前由所述處理器裝置執(zhí)行的函數(shù)的數(shù)量。例如,響應(yīng)于所述函數(shù)數(shù)量小于一閾值(例如,三),所述處理器裝置可以選擇保存所述狀態(tài)的選項(xiàng),以及響應(yīng)于所述函數(shù)的數(shù)量等于或大于所述閾值,所述處理器裝置可以選擇不保存所述狀態(tài)的選項(xiàng)。
根據(jù)實(shí)施方式,所述選擇取決于所述函數(shù)的深度。具體來說,所述選擇可以取決于對(duì)所述函數(shù)的深度與當(dāng)前正執(zhí)行的另一函數(shù)的深度的比較。例如,所述處理器裝置可以確定當(dāng)前由所述處理器裝置執(zhí)行的多個(gè)函數(shù),并且創(chuàng)建所述多個(gè)函數(shù)的深度的經(jīng)排序的列表。接著,所述處理器裝置可以根據(jù)所述另一函數(shù)在所述列表中的位置來選擇所述另一函數(shù)的所述深度。所述列表中的所述位置可以取決于所執(zhí)行的回退的數(shù)量。例如,這種相關(guān)性可以使得,隨著所執(zhí)行的回退的數(shù)量增加,所述列表中的所述位置可以朝著所述列表的、對(duì)應(yīng)于更高深度的端部移動(dòng)。響應(yīng)于所述函數(shù)的深度小于所述另一函數(shù)的深度,所述處理器裝置可以選擇保存所述狀態(tài)的選項(xiàng)。響應(yīng)于所述函數(shù)的深度等于或大于所述另一函數(shù)的深度,所述處理器裝置可以選擇不保存所述狀態(tài)的選項(xiàng)。
根據(jù)另一實(shí)施方式,提供了一種裝置。所述裝置包括可操作以存儲(chǔ)程序代碼的存儲(chǔ)器。而且,所述裝置包括處理器裝置,其可操作以在一個(gè)或更多個(gè)線程中執(zhí)行所述程序代碼。例如,所述處理器裝置可以包括具有多個(gè)核心的處理器甚或多個(gè)單核或多核處理器。而且,所述處理器裝置可以支持通過單個(gè)處理器核心執(zhí)行多個(gè)線程。所述程序代碼可以是基于腳本的web應(yīng)用,例如,基于JavaScript。所述處理器裝置被配置成,在所述線程中的一個(gè)線程中檢測(cè)函數(shù)的調(diào)用,并且在另一線程中執(zhí)行所述函數(shù)。而且,所述處理器裝置被配置成在如下各項(xiàng)之間執(zhí)行選擇:當(dāng)在所述另一線程中開始執(zhí)行所述函數(shù)時(shí),保存所述處理器裝置的狀態(tài);與當(dāng)在所述另一線程中開始執(zhí)行所述函數(shù)時(shí),不保存所述處理器裝置的所述狀態(tài)。根據(jù)實(shí)施方式,所述處理器裝置還可以被配置成,檢測(cè)與在所述另一線程中執(zhí)行所述函數(shù)有關(guān)的沖突,并且響應(yīng)于這種沖突,執(zhí)行回退至所述處理器裝置的最后保存狀態(tài),并且在調(diào)用所述函數(shù)的所述線程中執(zhí)行該函數(shù)。
根據(jù)實(shí)施方式,所述選擇取決于執(zhí)行回退的數(shù)量。而且,所述選擇可以取決于當(dāng)前由所述處理器裝置執(zhí)行的函數(shù)的數(shù)量。例如,響應(yīng)于所述函數(shù)的數(shù)量小于一閾值(例如,三),所述處理器裝置可以選擇保存所述狀態(tài)的選項(xiàng),而響應(yīng)于所述函數(shù)的數(shù)量等于或大于所述閾值,所述處理器裝置可以選擇不保存所述狀態(tài)的選項(xiàng)。
根據(jù)實(shí)施方式,所述選擇取決于所述函數(shù)的深度。具體來說,所述選擇可以取決于對(duì)所述函數(shù)的深度與當(dāng)前正執(zhí)行的另一函數(shù)的深度的比較。例如,所述處理器裝置可以確定當(dāng)前通過所述處理器裝置執(zhí)行的多個(gè)函數(shù),并且創(chuàng)建所述多個(gè)函數(shù)的深度的經(jīng)排序的列表。接著,所述處理器裝置可以根據(jù)所述另一函數(shù)在所述列表中的位置來選擇所述另一函數(shù)的深度。所述列表中的所述位置可以取決于所執(zhí)行的回退的數(shù)量。例如,這種相關(guān)性可以使得,隨著所執(zhí)行的回退的數(shù)量增加,所述列表中的所述位置可以朝著所述列表的、對(duì)應(yīng)于更高深度的端部移動(dòng)。響應(yīng)于所述函數(shù)的深度小于所述另一函數(shù)的深度,所述處理器裝置可以選擇保存所述狀態(tài)的選項(xiàng)。響應(yīng)于所述函數(shù)的深度等于或大于所述另一函數(shù)的深度,所述處理器裝置可以選擇不保存所述狀態(tài)的選項(xiàng)。
下面,參照附圖來更詳細(xì)地描述本發(fā)明的上述和另一些實(shí)施方式。
附圖說明
圖1示意性地例示了根據(jù)本發(fā)明的實(shí)施方式的裝置。
圖2示出了用于例示根據(jù)本發(fā)明的實(shí)施方式的方法的流程圖。
圖3示出了用于例示根據(jù)本發(fā)明的實(shí)施方式的方法的另一處理的流程圖。
具體實(shí)施方式
下面,對(duì)本發(fā)明的示例性實(shí)施方式進(jìn)行更詳細(xì)描述。必須明白的是,下面的描述僅出于例示本發(fā)明的原理的目的而給出,而非按限制性意義進(jìn)行。相反地,本發(fā)明的范圍僅通過所附權(quán)利要求書來限定,而非通過此后描述的示例性實(shí)施方式來限制。
所例示的實(shí)施方式涉及通過具有并行處理能力的處理器裝置來執(zhí)行程序代碼。該處理器裝置例如可以是多核處理器,即,配備有多個(gè)程序核心的處理器,其支持并行執(zhí)行多個(gè)線程,例如,對(duì)應(yīng)處理器核心上的每個(gè)線程。而且,該處理器裝置可以包括多個(gè)單核或多核處理器。更進(jìn)一步,該處理器裝置可以支持通過單一處理器核心并行執(zhí)行多個(gè)線程,例如利用如針對(duì)由Intel Corporation制造的某些處理器所提供的超線程技術(shù)。
該處理器裝置可以是各種計(jì)算機(jī)系統(tǒng)的一部分,舉例來說,諸如智能電話或平板計(jì)算機(jī)這樣的移動(dòng)裝置的處理器模塊。然而,該處理器裝置還可以在其它種類裝置中加以利用。
圖1示意性地例示了這種裝置100的示例性結(jié)構(gòu)。在圖1的實(shí)施例中,假定該裝置是支持針對(duì)無線網(wǎng)絡(luò)的無線電連接的移動(dòng)裝置。
如所示的,裝置100包括無線電接口110。而且,裝置100包括配備有多個(gè)處理器核心141、142、143、144的處理器140。該多核處理器140是上述處理器裝置的示例。
而且,該裝置包括聯(lián)接至處理器140的存儲(chǔ)器150。該存儲(chǔ)器150包括具有要通過處理器140執(zhí)行的程序代碼的程序代碼模塊160、170。在該例示例中,這些程序代碼模塊包括應(yīng)用代碼模塊160和操作系統(tǒng)代碼模塊170。
該應(yīng)用代碼模塊160可以包括要通過處理器140執(zhí)行的應(yīng)用的程序代碼,如基于腳本的web應(yīng)用,例如,基于JavaScript。應(yīng)用代碼模塊160的程序代碼還可以動(dòng)態(tài)地從因特網(wǎng)下載。操作系統(tǒng)代碼模塊170可以包括該裝置的操作軟件,包括用于通過處理器控制執(zhí)行該應(yīng)用的代碼,例如,采用腳本執(zhí)行引擎的形式。這種腳本執(zhí)行引擎例如可以是web瀏覽器應(yīng)用的一部分。
要明白的是,如圖1所示的結(jié)構(gòu)僅僅是示例性的,并且該裝置100還可以包括沒有例示的其它部件,例如,用于實(shí)現(xiàn)用戶接口或其它通信接口的結(jié)構(gòu)或程序代碼模塊。而且,要明白的是,所示結(jié)構(gòu)的詳細(xì)實(shí)現(xiàn)可以改變。例如,存儲(chǔ)器150可以包括:只讀存儲(chǔ)器(ROM)、隨機(jī)存取存儲(chǔ)器(RAM)、閃速存儲(chǔ)器、磁存儲(chǔ)部等。
在如下進(jìn)一步例示的實(shí)施例中,處理器裝置(例如,多核處理器140)用于執(zhí)行一應(yīng)用的程序代碼,如在應(yīng)用代碼模塊160中的web應(yīng)用。該程序代碼被假定成為,基于腳本的web應(yīng)用的程序代碼,例如,基于JavaScript。為使能夠透明使用該處理器裝置的并行處理能力,該處理器裝置支持線程級(jí)推測(cè)。
該裝置被假定成為是事件驅(qū)動(dòng)的。當(dāng)應(yīng)用中出現(xiàn)一事件(例如,鼠標(biāo)點(diǎn)擊或其它用戶輸入)時(shí),這種事件典型地對(duì)應(yīng)于函數(shù)調(diào)用。當(dāng)處理器裝置遇到應(yīng)用中的函數(shù)調(diào)用時(shí),其首先嘗試在新線程中運(yùn)行該函數(shù)(即,推測(cè)在該新線程中成功執(zhí)行該函數(shù))。如果存在有關(guān)在該新線程中執(zhí)行該函數(shù)的沖突,則該處理器裝置返回至推測(cè)之前的狀態(tài)(即,執(zhí)行回退),并且在不推測(cè)的情況下重新執(zhí)行該函數(shù),例如,通過在調(diào)用該函數(shù)的同一線程中執(zhí)行該函數(shù)。為使能夠?qū)崿F(xiàn)這種回退,處理器裝置保存推測(cè)之前的狀態(tài)。推測(cè)還可以嵌套,即,在一線程中推測(cè)地執(zhí)行的函數(shù)可以調(diào)用另一函數(shù),其在又一線程中推測(cè)地執(zhí)行。
如在此例示的概念基于對(duì)于某些應(yīng)用(例如,基于JavaScript的web應(yīng)用)來說沖突非常稀少的觀察。例如,某一應(yīng)用的程序代碼的執(zhí)行可以涉及5000次推測(cè),其中僅3%導(dǎo)致回退。因此,對(duì)于每一個(gè)推測(cè)來說,可能不需要保存該狀態(tài),而僅針對(duì)這些推測(cè)的一部分需要保存該狀態(tài)。在所示的概念中,當(dāng)開始在新線程中推測(cè)執(zhí)行函數(shù)時(shí),這根據(jù)由處理器裝置所執(zhí)行的選擇來加以考慮。具體來說,處理器裝置在其中通過該處理器裝置保存開始執(zhí)行該函數(shù)時(shí)的狀態(tài)的第一選項(xiàng),與其中不通過該處理器裝置保存開始執(zhí)行該函數(shù)時(shí)的狀態(tài)的第二選項(xiàng)之間決定。使用后面的選項(xiàng)考慮到避免過度使用存儲(chǔ)器資源來保存僅潛在地需要回退的信息。如果在推測(cè)執(zhí)行函數(shù)期間出現(xiàn)沖突,并且因選擇第二選擇而未保存開始推測(cè)執(zhí)行該函數(shù)時(shí)的狀態(tài),則處理器裝置可以執(zhí)行回退至最新保存狀態(tài)。如下更詳細(xì)說明的,第一選項(xiàng)與第二選項(xiàng)之間的決定可以基于動(dòng)態(tài)自適應(yīng)式啟發(fā)(heuristic)。該啟發(fā)例如可以考慮到被調(diào)用的函數(shù)的深度、所執(zhí)行的回退的數(shù)量、以及當(dāng)前通過該處理器裝置執(zhí)行的其它函數(shù)。
將在如圖2和圖3的流程圖所示的執(zhí)行程序代碼的方法的背景下,對(duì)該啟發(fā)的示例性實(shí)現(xiàn)進(jìn)行說明。
首先,在開始執(zhí)行該應(yīng)用的程序代碼之前,可以將列表位置指針m的初始值例如設(shè)置成m=0.5。而且,可以將表示回退數(shù)量的回退計(jì)數(shù)器nr設(shè)置成起始值,例如,nr=1。
如果處理器裝置檢測(cè)到調(diào)用了函數(shù)(如步驟210所示),則其可以應(yīng)用用于在第一選項(xiàng)(保存該狀態(tài))與第二選項(xiàng)(不保存該狀態(tài))之間選擇的下列處理。
在步驟220,處理器裝置可以確定所調(diào)用的函數(shù)的深度D。該深度D是反映在指定函數(shù)內(nèi)被調(diào)用的隸屬函數(shù)的嵌套程度的參數(shù)。例如,如果在指定函數(shù)內(nèi)未調(diào)用進(jìn)一步的函數(shù),則該函數(shù)具有深度D=1。如果在該函數(shù)內(nèi)調(diào)用了隸屬函數(shù),則其深度D增加了該隸屬函數(shù)的深度。
在步驟230,處理器裝置可以創(chuàng)建當(dāng)前正由處理器裝置(按不同線程)執(zhí)行的函數(shù)的深度D的列表L。在該例示例中,假定列表L按升序創(chuàng)建,即,最低深度D形成列表L的開頭,而其它深度D按增加深度D的次序跟隨。在典型情況下,該列表還可以包括具有同一值D的多個(gè)成員。
在步驟240,處理器裝置基于列表L而執(zhí)行檢查。具體來說,處理器裝置可以檢查列表L的長(zhǎng)度,即,lLl。如果長(zhǎng)度lLl小于閾值(例如,3),則處理器裝置繼續(xù)步驟250,如分支“Y”所示。在步驟250,處理器裝置保存該狀態(tài),即,選擇第一選項(xiàng)。因此,針對(duì)初始函數(shù)調(diào)用來說,例如,第一調(diào)用的函數(shù),保存該狀態(tài)。如進(jìn)一步所示,處理器裝置可以比較所調(diào)用的函數(shù)的深度D與當(dāng)前執(zhí)行的另一函數(shù)的深度,即,列表L中的深度。執(zhí)行該比較的深度處于列表L中的位置m*lLl處,即,對(duì)應(yīng)于列表成員L[m*lLl]。由于上述初始設(shè)置的值m,因而,該位置初始接近列表中部,典型地對(duì)應(yīng)于中等深度值。具體來說,處理器裝置可以檢查所調(diào)用的函數(shù)的深度D是否小于列表成員L[m*lLl]的值。如果是這種情況,則處理器裝置繼續(xù)步驟250,如分支“Y”所示。在步驟250,處理器裝置保存該狀態(tài),即,選擇第一選項(xiàng)。因此,如果所調(diào)用的函數(shù)的深度相對(duì)較小,則也保存該狀態(tài)。
要不然,如果長(zhǎng)度lLl等于或大于該閾值,或者所調(diào)用的函數(shù)的深度D等于或大于列表成員L[m*lLl]的值,則處理器裝置繼續(xù)步驟260,如分支“N”所示。在步驟260,處理器裝置不保存該狀態(tài),即,選擇第二選項(xiàng)。
在步驟270,處理器裝置在另一線程中執(zhí)行所調(diào)用的函數(shù),即,執(zhí)行針對(duì)該函數(shù)的線程級(jí)推測(cè)。
如上提到,該線程級(jí)推測(cè)可以導(dǎo)致與在另一線程中執(zhí)行該函數(shù)有關(guān)的沖突。通過圖3的流程圖例示了可以在出現(xiàn)這種沖突時(shí)所應(yīng)用的示例性處理。
在步驟310,處理器檢測(cè)與在另一線程中推測(cè)執(zhí)行該函數(shù)有關(guān)的沖突。
在步驟320,響應(yīng)于檢測(cè)到該沖突,處理器裝置執(zhí)行回退至最新存儲(chǔ)狀態(tài)。如果在開始在該另一線程中推測(cè)執(zhí)行該函數(shù)時(shí)保存該狀態(tài),則執(zhí)行回退至該狀態(tài)。否則執(zhí)行回退至更早存儲(chǔ)狀態(tài)。
響應(yīng)于該回退,處理器裝置在步驟330遞增回退計(jì)數(shù)器,即,將nr增加至Nr+1。而且,處理器裝置遞增列表位置指針m。這通過取決于回退計(jì)數(shù)器的遞增值來實(shí)現(xiàn)。在該例示例中,列表位置指針m被假定成根據(jù)以下增加:
m:=m+1/2nr+1。
就是說,隨著回退數(shù)量nr的增加,列表位置指針n朝著列表L的末端移動(dòng),即,朝著更高深度。這意味著,在圖2的步驟240處選擇第一選項(xiàng)的可能性隨著回退的出現(xiàn)而增加,由此,允許更有效處理回退。另一方面,如果沒有出現(xiàn)回退,則保持在步驟240選擇第二選項(xiàng)的某一可能性,由此,允許避免因保存狀態(tài)而過度使用存儲(chǔ)器。
如可以看出,如上說明的概念允許在多個(gè)線程中有效執(zhí)行程序代碼。由于使用線程級(jí)推測(cè),因而,這可以按對(duì)于程序代碼的開發(fā)者來說透明的方式加以實(shí)現(xiàn)。另一方面,避免了過度使用存儲(chǔ)器資源,以供使能夠進(jìn)行回退。
要明白的是,如上說明的概念容易進(jìn)行各種修改。例如,所例示啟發(fā)可以按不同方式來修改。舉例來說,代替按升序經(jīng)排序的列表L地,該列表可以按降序排序,并且列表位置指針代替遞增地進(jìn)行遞減。而且,該概念可以應(yīng)用于各種裝置中,例如,在固定計(jì)算機(jī)系統(tǒng)中。而且,該概念不限于特定處理器實(shí)現(xiàn)。更進(jìn)一步,該概念可以結(jié)合各類編程語(yǔ)言來使用。