本公開涉及從輔助處理器(例如圖形處理單元(gpu))到中央處理單元(cpu)的函數(shù)回調(diào)請求,并且更具體而言,涉及針對這樣的回調(diào)請求的效率改進。
背景技術:
異構處理系統(tǒng)(例如將cpu和gpu(或輔助處理器或加速器)組合在一個芯片上的處理器)變得越來越普遍。除了執(zhí)行圖形處理之外,gpu還可以用于從cpu卸載相對并行密集的計算任務。因為gpu架構通常面向并行計算,所以與cpu相比,gpu可以能夠為這些類型的任務提供更高的性能和更低的能耗。在硬件和軟件兩方面,對從cpu到gpu的函數(shù)調(diào)用的支持變得更容易獲得。
雖然這些異構處理器和編程框架可以允許cpu將工作卸載到gpu,但是通常沒有對應的機制以便gpu將工作卸載回到cpu上。這樣的能力在許多情況下可能是有用的,包括例如:(1)調(diào)用可能不在gpu上運行的操作系統(tǒng)函數(shù),(2)調(diào)用尚未移植(port)到gpu的代碼,以及(3)執(zhí)行相對循序的或遵循不太適合于并行執(zhí)行的不規(guī)則控制路徑的代碼。
附圖說明
隨著以下具體實施方式繼續(xù)進行,并且參考附圖,所要求保護的主題的實施例的特征和優(yōu)點將變得顯而易見,其中,同樣的附圖標記表示同樣的部件,并且其中:
圖1例示了與本公開一致的示例性實施例的頂層系統(tǒng)圖;
圖2例示了與本公開一致的一個示例性實施例的框圖;
圖3例示了與本公開一致的一個示例性實施例的操作的流程圖;
圖4例示了與本公開一致的另一示例性實施例的操作的流程圖;
圖5例示了與本公開一致的另一示例性實施例的操作的流程圖;
圖6例示了與本公開一致的另一示例性實施例的操作的流程圖;以及
圖7例示了與本公開一致的另一示例性實施例的平臺的系統(tǒng)圖。
雖然以下具體實施方式將參考說明性實施例進行,但是對于本領域技術人員來說,許多替代、修改及其變化將是顯而易見的。
具體實施方式
一般地,本公開提供用于在輔助處理器(例如,gpu或其它類型的加速器)和中央處理單元(cpu)之間的函數(shù)調(diào)用和回調(diào)的系統(tǒng)、設備、方法和計算機可讀介質(zhì),其具有改進的效率(包括減小的延遲)。異構處理器可以包括被配置為訪問共享虛擬存儲器(svm)的一個或多個gpu和cpu。cpu可以對gpu生成函數(shù)調(diào)用請求,以將工作卸載到gpu上。gpu可能進而對cpu生成函數(shù)回調(diào)請求,以執(zhí)行該工作負載的選定部分。回調(diào)請求可以通過存儲在svm中的雙端隊列來傳送,如下面將更詳細地解釋的?;卣{(diào)請求可以包括:指向要在cpu上執(zhí)行的回調(diào)函數(shù)的指針(例如,存儲器地址);指向要提供給回調(diào)函數(shù)和/或要由回調(diào)函數(shù)返回的數(shù)據(jù)的指針;以及與一個或多個回調(diào)完成機制(包括信令標志(signalingflag)和連續(xù)內(nèi)核(continuationkernel))相關的附加信息。
圖1例示了與本公開一致的一個示例性實施例的頂層系統(tǒng)圖100。一個或多個gpu(或gpu核心)102被配置為與一個或多個cpu104共享虛擬存儲器(svm)106。gpu102和cpu104可以是異構處理器或芯片上的系統(tǒng)(soc)(其中可以在處理器之間共享工作)的一部分。例如,作為更通用的處理器的cpu可能更適合于處理以相對循序的(或不規(guī)則的)流程執(zhí)行的任務,而被設計為具有更為并行的架構的gpu可能更適合于處理并行計算任務。cpu104可以被配置為對gpu102生成函數(shù)調(diào)用請求,以將工作卸載到適合于gpu架構的gpu上。gpu102可以被配置為向cpu104生成函數(shù)回調(diào)請求,以執(zhí)行該工作負載的更適合于cpu架構的選定部分。一旦回調(diào)請求完成,cpu104可以對發(fā)起請求的gpu102生成完成信號。
svm106可以被配置為使得cpu104和gpu102能夠透明地共享包含數(shù)據(jù)結構的指針并提供存儲器一致性,使得gpu可以看到由cpu做出的更新且反之亦然。svm106還可以被配置為提供原子操作和圍欄(fence)操作以協(xié)調(diào)對共享存儲器的訪問并防止cpu104與gpu102之間的沖突??梢酝ㄟ^存儲在svm106中的雙端隊列(deques)108傳送回調(diào)請求和完成信號。隊列是被配置為保存多個數(shù)據(jù)元素的一種數(shù)據(jù)結構。雙端隊列(或deque)是這樣的隊列:其被配置為使得數(shù)據(jù)元素可以被添加到隊列的頭端或尾端,或從隊列的頭端或尾端刪除。deque的頭端還可以被稱為“前”或“頂”端,而尾端可以被稱為“后”或“底”端。頭和尾的名稱僅用作deque操作描述中的方便參考點,并且不引用固定的物理位置。換而言之,術語“頭”和“尾”可以在不改變本公開的任何實施例的含義或操作的情況下,在以下的描述的通篇中進行互換。在一些實施例中,deque可以被實現(xiàn)為圓形或環(huán)形緩沖器,以便在需要時允許更有效率的大小調(diào)整。
將數(shù)據(jù)添加到(或?qū)懭?deque的操作可以稱為“推送”數(shù)據(jù)到deque的一端上。從deque中刪除數(shù)據(jù)(或從deque讀取)的操作可以稱為“從deque的另一端“彈出”數(shù)據(jù)。如將在下面更詳細地解釋的,gpu102可以將回調(diào)請求推送到deque108上,并且cpu可以將其彈出以執(zhí)行。
圖2例示了與本公開一致的一個示例性實施例的框圖200,其中,圖1的系統(tǒng)被更詳細地示出。gpu102被示出為包括任何數(shù)量的核心或執(zhí)行單元(eu)102a、102b,其可以被配置為例如并行執(zhí)行任務。這些任務可能與來自cpu104的函數(shù)調(diào)用相關聯(lián),這些函數(shù)調(diào)用旨在將工作從cpu卸載到gpu。在gpu核心或eu102上執(zhí)行的任務進而可以請求去向cpu104的函數(shù)回調(diào)。
cpu104被顯示為包括在cpu處理器上執(zhí)行的任意數(shù)量的回調(diào)請求處理程序線程(也稱為回調(diào)工作者線程)202a、202b。共享虛擬存儲器(svm)106可以被配置為存儲任意數(shù)量的deque108a、108b,盡管通常存在針對每個gpu核心的一個deque和針對每個deque的一個請求處理程序線程以避免爭用并減少延遲。在一些實施例中,svm106還可以被配置為存儲完成標志206a、206b。在特定核心(例如,102a)上執(zhí)行的gpu任務可以通過將回調(diào)請求推送到與該核心108a相關聯(lián)的deque上來請求對cpu104的函數(shù)回調(diào)?;卣{(diào)請求可以包括:指向要在cpu上執(zhí)行的回調(diào)函數(shù)的指針,以及指向該函數(shù)的變元的指針。變元指針通??梢允侵赶蛞粋€數(shù)據(jù)結構的指針,該數(shù)據(jù)結構包含多個數(shù)據(jù)項目與參數(shù)(所述參數(shù)包括一個或多個存儲器位置,cpu可以向所述存儲器位置寫入返回結果)。
cpu上的請求處理程序線程202a隨后可以從該deque彈出回調(diào)請求,并執(zhí)行與該回調(diào)請求相關聯(lián)的函數(shù)。一旦該回調(diào)請求函數(shù)完成,請求處理程序線程就可以生成完成信號。在一些實施例中,完成信號可以通過執(zhí)行原子操作來設置svm106中的完成標志206a(布爾變量)來完成。完成標志206可以由回調(diào)請求中的指針指定。gpu任務可以例如在執(zhí)行其它任務時周期性地監(jiān)控完成標志206a(使用原子操作),以確定何時回調(diào)請求已經(jīng)完成。因此,gpu在由cpu執(zhí)行回調(diào)期間不“停轉(zhuǎn)(stall)”。
在一些實施例中,當請求處理程序線程202變?yōu)榭臻e時,例如當它們自己的deque變空時,請求處理程序線程202可以從彼此中竊取工作204。這可以通過隨機選擇候補deque來完成,從候補deque中彈出一個或多個回調(diào)請求。以這種方式竊取的工作可能會在多個請求處理程序線程中更有效地將工作鋪開。
在一些實施例中,可以通過在svm106中固定(pin)或鎖定deque108以避免由cpu或gpu產(chǎn)生頁面故障,來進一步提高效率。如果deque的大小增長,則附加的存儲也被固定。此外,可以在用戶級別(例如,通過svm上的原子操作)執(zhí)行工作排隊,以避免與向操作系統(tǒng)(os)或gpu驅(qū)動程序的環(huán)過渡(ringtransition)相關聯(lián)的開銷。
可以為每個gpu核心(或eu)分配一個deque,以便由在該eu上執(zhí)行的任務共享。因為deque的底端只能被該eu訪問,所以數(shù)據(jù)位置(datalocality)得到改善,并且因為不同的eu(或gpu子片)被阻止爭奪與該deque相關聯(lián)的高速緩存線,所以爭用減少。
用每個deque的一個專用的請求處理程序線程來配置cpu,可能有助于避免由長時間運行的cpu代碼引起的deque備份。當deque包含剩余的回調(diào)請求時,該cpu線程將繼續(xù)其執(zhí)行。然而,如果deque變空,則cpu線程將嘗試從其它隨機選擇的deque中竊取項目。如果cpu線程在允許的次數(shù)的竊取嘗試后未能夠成功地竊取回調(diào)請求,則它將在一定的時間段內(nèi)暫停,以避免與更多的不成功的嘗試相關聯(lián)的成本。如果monitor/mwait指令在用戶級別(環(huán)3)可用,則cpu線程可能會使用它們來等待,直到新的項目添加到該deque。否則,cpu線程可能會休眠一段時間,然后重新啟動其正常操作:執(zhí)行其自己的回調(diào)請求或從其它deque竊取。
圖3例示了與本公開一致的一個示例性實施例的操作300的流程圖。例示了gpu核心或執(zhí)行單元(eu)102a、102b的操作。在操作302處,gpu核心發(fā)起cpu回調(diào)。在操作304處,回調(diào)請求被添加到與gpu核心相關聯(lián)的deque。然后,gpu核心可以可選地在操作306處執(zhí)行其它任務,同時等待回調(diào)的完成。在操作308處,與該請求相關聯(lián)的完成標志206被測試,并且如果未設置,則在重新測試該完成標志之前,gpu可以繼續(xù)執(zhí)行其它任務(306)、添加附加的回調(diào)請求(304)或單單是等待/休眠一段時間。如果/當完成標志變?yōu)橐言O置時,則在操作310處,gpu核心讀取從cpu回調(diào)提供的結果。這些結果可以在存儲器位置處(例如在由回調(diào)請求中的指針指定的svm中)獲得。cpu回調(diào)在操作312處完成。
圖4例示了與本公開一致的另一示例性實施例的操作400的流程圖。cpu回調(diào)工作者線程202a、202b的操作被示出為在操作402處開始。在操作404處,從與該工作者線程相關聯(lián)的deque彈出回調(diào)請求。如果回調(diào)請求成功彈出,則在操作416處,用由回調(diào)請求提供的任何變元(argument)來調(diào)用/執(zhí)行由回調(diào)請求指定的函數(shù)或過程。在回調(diào)函數(shù)完成之后,在操作418處,與該回調(diào)請求相關聯(lián)的完成標志被設置,并且該工作者線程循環(huán)返回到操作404以處理下一個回調(diào)請求。
然而,如果彈出失敗,例如,如果在與該工作者線程相關聯(lián)的deque中沒有更多回調(diào)請求,則在操作406處,使得竊取嘗試的次數(shù)被增量。如果在操作408處,竊取嘗試的次數(shù)超過了最大閾值,則在嘗試另一個彈出之前,工作者線程在操作410處可以等待一段指定的時間。在一些實施例中,等待可以通過執(zhí)行休眠指令或monitor/mwait指令來實現(xiàn)。否則,如果竊取嘗試次數(shù)小于最大閾值,則在操作412處,從與其它工作者線程相關聯(lián)的其它deque當中隨機選擇(例如,竊取)候補deque。然后,在操作414處,從候補的(竊取的)deque彈出回調(diào)請求,并且如上文所描述,該過程在操作416處繼續(xù)。
圖5例示了與本公開一致的另一示例性實施例的操作500的流程圖。在該實施例中,提供了候補機制以避免要求gpu重復校驗回調(diào)請求完成。這可以改善gpu的效率和能量消耗。該機制采用了“連續(xù)(continuation)”的使用,其代表了程序給定點處的計算狀態(tài)?;卣{(diào)請求可以被配置為包括指向稱為“連續(xù)內(nèi)核”的gpu內(nèi)核的指針或句柄,cpu在完成回調(diào)請求后將調(diào)用該指針或句柄。然后,gpu連續(xù)內(nèi)核將在剛剛做出回調(diào)請求之后的點處邏輯地再繼續(xù)執(zhí)行原始gpu任務(或調(diào)用內(nèi)核)。因此,gpu調(diào)用內(nèi)核不被阻止,并且不必重復校驗cpu回調(diào)是否已經(jīng)完成?;卣{(diào)請求也可以被配置為包括將被傳遞回連續(xù)內(nèi)核的數(shù)據(jù)指針(例如,連續(xù)變元指針)。通常,進行回調(diào)請求的gpu調(diào)用內(nèi)核將在由連續(xù)變元指針引用的數(shù)據(jù)結構中的存儲器位置中保存關鍵變量的值,以便它們隨后可以被連續(xù)內(nèi)核使用。另外,如果cpu回調(diào)函數(shù)要返回結果,則可以通過寫入該數(shù)據(jù)結構中的存儲器位置來實現(xiàn)。
現(xiàn)在參考圖5(a),它描述了在gpu核心上的調(diào)用內(nèi)核502的操作,在操作504處,調(diào)用內(nèi)核發(fā)起cpu回調(diào)。在操作506處,堆棧變量被保存到由回調(diào)請求的連續(xù)變元指針引用的數(shù)據(jù)結構中。這些堆棧變量隨后將被連續(xù)內(nèi)核使用,以將調(diào)用內(nèi)核從其要被停用(leftoff)的點處再繼續(xù)(resume)。在操作508處,將回調(diào)請求添加到(推送到)與gpu核心或執(zhí)行單元相關聯(lián)的deque。在操作510處,gpu核心上的調(diào)用內(nèi)核然后可以退出,從而允許例如gpu核心執(zhí)行其它工作。雖然調(diào)用內(nèi)核現(xiàn)在已經(jīng)終止,但是連續(xù)內(nèi)核隨后可以使得意圖在進行回調(diào)請求之后發(fā)生的計算或任務再繼續(xù),并且直接地如此進行,而不需要gpu等待或執(zhí)行重復測試。
現(xiàn)在參考圖5(b),描述了cpu回調(diào)工作者線程520的操作。在操作522處,以與上面結合圖4描述的相似的方式來選擇和執(zhí)行工作。也就是說,從與工作者線程相關聯(lián)的deque彈出回調(diào)請求,并且執(zhí)行指定的回調(diào)函數(shù)。完成后,在操作524處,cpu回調(diào)工作者線程調(diào)用與該回調(diào)請求相關聯(lián)的gpu連續(xù)內(nèi)核。
現(xiàn)在參考圖5(c),描述了gpu核心連續(xù)內(nèi)核530的操作。在操作532處,被調(diào)用的連續(xù)內(nèi)核加載堆棧變量(其先前由調(diào)用內(nèi)核保存),并在操作534處,讀取來自cpu回調(diào)的結果(如果有的話)。在操作536處,使用復原的堆棧變量來使得gpu核心調(diào)用內(nèi)核再繼續(xù)。
在一些實施例中,程序員可以通過編寫存儲堆棧變量的值所需的調(diào)用內(nèi)核的代碼,以及編寫用于重新加載那些堆棧變量值的連續(xù)內(nèi)核的代碼,來實現(xiàn)cpu回調(diào)請求。然而,在其它實施例中,編譯器或轉(zhuǎn)換器可以被配置為發(fā)出(emit)該代碼,并因此簡化了使用cpu回調(diào)所需的編程工作。編譯器還可以被配置為將包含cpu回調(diào)的單個gpu內(nèi)核轉(zhuǎn)換為適當?shù)恼{(diào)用內(nèi)核和連續(xù)內(nèi)核的序列,以及關聯(lián)的堆棧變量保存和復原(restore)代碼,以進一步簡化函數(shù)回調(diào)的使用。
圖6例示了與本公開一致的另一示例性實施例的操作600的流程圖。這些操作提供了請求在第一處理器與第二處理器之間的函數(shù)回調(diào)的方法。在操作610處,回調(diào)請求由第一處理器的執(zhí)行單元(eu)推送到第一雙端隊列(deque)。deque被存儲在耦合到第一和第二處理器的共享的虛擬存儲器(svm)中。在操作620處,由在第二處理器上執(zhí)行的請求處理程序線程從第一deque彈出回調(diào)請求中的一個回調(diào)請求。在操作630處,請求處理程序線程執(zhí)行由彈出的回調(diào)請求指定的函數(shù)。在操作640處,響應于函數(shù)的完成,請求處理程序線程對eu生成完成信號。
圖7例示了與本公開一致的一個示例性實施例的系統(tǒng)圖700。系統(tǒng)700可以是移動平臺710或計算設備(諸如,舉例來說,智能手機、智能平板電腦、個人數(shù)字助理(pda)、移動互聯(lián)網(wǎng)設備(mid)、可變形平板電腦、筆記本或膝上型計算機或任何其它適當?shù)脑O備)。然而,應當理解,本文描述的系統(tǒng)的實施例不限于移動平臺,并且在一些實施例中,系統(tǒng)700可以是工作站或臺式計算機。設備通??梢越?jīng)由顯示元件760(諸如,舉例來說觸摸屏、液晶顯示器(lcd)或任何其它適當?shù)娘@示類型)向用戶呈現(xiàn)各種界面。
系統(tǒng)700被示出為包括第一處理器或cpu104以及第二處理器或gpu102,第一處理器或cpu104可被配置為例如通用處理器,第二處理器或gpu102可被配置為以更高效率執(zhí)行并行操作。在一些實施例中,處理器102和104可以被實現(xiàn)為任意數(shù)量的處理器核心。通常,處理器(或處理器核心)可以是任何類型的處理器(諸如,舉例來說,微處理器、嵌入式處理器、數(shù)字信號處理器(dsp)、圖形處理器(gpu)、網(wǎng)絡處理器、現(xiàn)場可編程門陣列或被配置為執(zhí)行代碼的其它設備)。處理器可以是多線程核心,因為它們可以為每個核心包括多于一個硬件線程上下文(或“邏輯處理器”)。系統(tǒng)700還被示為包括svm106,其包括任意數(shù)量的deque108,deque108被配置為實現(xiàn)在先前描述的處理器之間的改進的函數(shù)回調(diào)請求。
系統(tǒng)700被示出還包括存儲器730。存儲器730可以被耦合到處理器。存儲器730可以是本領域技術人員已知的或以其它方式可用的各種各樣的存儲器(包括存儲器層級和/或存儲器高速緩存的各種層)中的任何一種。應當理解,處理器和存儲器可以被配置為存儲、托管和/或執(zhí)行一個或多個用戶應用程序或其它軟件模塊。這些應用程序可以包括但不限于例如任何類型的計算、通信、數(shù)據(jù)管理、數(shù)據(jù)存儲和/或用戶界面任務。在一些實施例中,這些應用程序可以采用或與移動平臺710的任何其它部件交互。
系統(tǒng)700還被示為包括輸入/輸出(io)系統(tǒng)或控制器750,其可被配置為實現(xiàn)或管理處理器102、104和系統(tǒng)700的其它元件(包括顯示元件760)和/或系統(tǒng)700外部的其它元件(未示出)之間的數(shù)據(jù)通信。
系統(tǒng)700還被示為包括耦合到處理器并被配置為存儲程序、應用程序和/或數(shù)據(jù)的存儲系統(tǒng)740(例如硬盤驅(qū)動器(hdd)或固態(tài)驅(qū)動器(ssd))。
系統(tǒng)700還被示為包括網(wǎng)絡接口模塊770,網(wǎng)絡接口模塊770可以包括無線通信能力(諸如,舉例來說,蜂窩通信、無線保真(wifi)、
應當理解,在一些實施例中,系統(tǒng)700的各種部件可以在片上系統(tǒng)(soc)架構中組合。在一些實施例中,部件可以是硬件部件、固件部件、軟件部件或硬件、固件或軟件的任何適當?shù)慕M合。
本文描述的方法的實施例可以在包括一個或多個存儲介質(zhì)的系統(tǒng)中實現(xiàn),該一個或多個存儲介質(zhì)具有單獨地或組合地存儲在其上的指令,該指示在由一個或多個處理器執(zhí)行時執(zhí)行該方法。這里,處理器可以包括例如系統(tǒng)cpu(例如,核心處理器)和/或可編程電路。因此,意圖是根據(jù)本文描述的方法的操作可以跨多個物理設備(諸如,舉例來說,在幾個不同物理位置處的處理結構)分布。此外,意圖是可以單獨地或以子組合來執(zhí)行方法操作,如本領域技術人員將理解的。因此,不需要執(zhí)行每個流程圖的所有操作,并且本公開明確地意圖使得如被本領域普通技術人員所理解的這樣的操作的所有子組合都被使能。
存儲介質(zhì)可以包括任何類型的有形介質(zhì)(例如,任何類型的盤,包括軟盤、光盤、壓縮盤只讀存儲器(cd-rom)、可重寫的壓縮盤(cd-rw)、數(shù)字多功能盤(dvd)和磁光盤、諸如只讀存儲器(rom)的半導體器件、諸如動態(tài)和靜態(tài)ram的隨機存取存儲器(ram)、可擦除可編程只讀存儲器(eprom)、電可擦除可編程只讀存儲器(eeprom)、閃速存儲器、磁卡或光卡或適合于存儲電子指令的任何類型的介質(zhì))。
在本文任何實施例中使用的“電路”可以包括例如單獨地或以任何組合形式存儲由可編程電路執(zhí)行的指令的硬連線電路、可編程電路、狀態(tài)機電路和/或固件。應用程序可以體現(xiàn)為可以在諸如主處理器或其它可編程電路的可編程電路上執(zhí)行的代碼或指令。在本文的任何實施例中使用的模塊可以被實現(xiàn)為電路。電路可以被實現(xiàn)為諸如集成電路芯片的集成電路。
因此,本公開提供了用于實現(xiàn)在第一處理器與第二處理器之間的函數(shù)回調(diào)請求的系統(tǒng)、設備、方法和計算機可讀介質(zhì)。以下示例涉及另外的實施例。
根據(jù)示例1,提供了一種用于實現(xiàn)在第一處理器與第二處理器之間的函數(shù)回調(diào)請求的系統(tǒng)。該系統(tǒng)可以包括耦合到第一和第二處理器的共享虛擬存儲器(svm),svm被配置為存儲至少一個雙端隊列(deque)。該示例的系統(tǒng)還可以包括第一處理器的執(zhí)行單元(eu),該eu與第一deque相關聯(lián),被配置為將回調(diào)請求推送到第一deque。該示例的系統(tǒng)還可以包括在第二處理器上執(zhí)行的請求處理程序線程,其被配置為:從第一deque彈出回調(diào)請求中的一個回調(diào)請求;執(zhí)行由彈出的回調(diào)請求指定的函數(shù);以及響應于函數(shù)的完成而對eu生成完成信號。
示例2可以包括示例1的主題,并且回調(diào)請求包括:函數(shù)指針,用于指定要由第二處理器執(zhí)行的函數(shù);以及變元指針,用于指定針對要提供給被執(zhí)行函數(shù)的數(shù)據(jù)以及要提供給eu的由被執(zhí)行函數(shù)生成的結果的在svm中的位置。
示例3可以包括示例1和示例2的主題,并且響應于檢測到第一deque為空,請求處理程序線程進一步從第二deque彈出回調(diào)請求中的一個回調(diào)請求,該第二deque與第二eu相關聯(lián)。
示例4可以包括示例1-3的主題,并且deque被固定在svm中,以防止響應于由eu和請求處理程序進行的訪問嘗試而產(chǎn)生頁面錯誤。
示例5可以包括示例1-4的主題,并且完成信號是用于在svm中設置完成標志,并且eu進一步用于輪詢完成標志。
示例6可以包括示例1-5的主題,并且完成信號用于觸發(fā)eu上的連續(xù)內(nèi)核,連續(xù)內(nèi)核用于復原先前保存的堆棧變量。
示例7可以包括示例1-6的主題,并且請求處理程序線程響應于從任何deque彈出回調(diào)請求中的一個回調(diào)請求而進一步休眠。
示例8可以包括示例1-7的主題,并且休眠包括執(zhí)行monitor/mwait指令。
示例9可以包括示例1-8的主題,并且第一處理器是圖形處理器單元(gpu),并且第二處理器是通用的中央處理器單元(cpu)。
根據(jù)示例10,提供了一種用于在第一處理器與第二處理器之間的函數(shù)回調(diào)請求的方法。該方法可以包括:由第一處理器的執(zhí)行單元(eu)將回調(diào)請求推送到第一雙端隊列(deque),deque存儲在耦合到第一處理器和第二處理器的共享虛擬存儲器(svm)中;由在第二處理器上執(zhí)行的請求處理程序線程從第一deque彈出回調(diào)請求中的一個回調(diào)請求;由請求處理程序線程執(zhí)行由彈出的回調(diào)請求指定的函數(shù);以及由請求處理程序線程響應于函數(shù)的完成而對eu生成完成信號。
示例11可以包括示例10的主題,并且回調(diào)請求包括:函數(shù)指針,用于指定要由第二處理器執(zhí)行的函數(shù);以及變元指針,用于指定針對要提供給被執(zhí)行函數(shù)的數(shù)據(jù)以及要提供給eu的由被執(zhí)行函數(shù)生成的結果的在svm中的位置。
示例12可以包括示例10和示例11的主題,并且還包括:響應于檢測到第一deque為空,由請求處理程序線程從第二deque彈出回調(diào)請求中的一個回調(diào)請求,該第二deque與第二eu相關聯(lián)。
示例13可以包括示例10-12的主題,并且進一步包括:將deque固定在svm中,以防止響應于由eu和請求處理程序進行的訪問嘗試而產(chǎn)生頁面錯誤。
示例14可以包括示例10-13的主題,并且生成完成信號還包括:在svm中設置完成標志以供eu進行輪詢。
示例15可以包括示例10-14的主題,并且生成完成信號還包括:觸發(fā)eu上的連續(xù)內(nèi)核,連續(xù)內(nèi)核用于復原先前保存的堆棧變量。
示例16可以包括示例10-15的主題,以及還包括由請求處理程序線程響應于從所述deque中的任意一個deque彈出回調(diào)請求中的一個回調(diào)請求的失敗而進行休眠。
示例17可以包括示例10-16的主題,并且休眠還包括執(zhí)行monitor/mwait指令。
根據(jù)示例18,提供了至少一個具有存儲在其上的指令的計算機可讀存儲介質(zhì),該指令在由處理器執(zhí)行時對第一處理器與第二處理器之間的函數(shù)回調(diào)請求引起以下操作。該操作可以包括:由第一處理器的執(zhí)行單元(eu)將回調(diào)請求推送到第一雙端隊列(deque),該deque存儲在耦合到第一處理器和第二處理器的共享虛擬存儲器(svm)中;由在第二處理器上執(zhí)行的請求處理程序線程來從第一deque彈出回調(diào)請求中的一個回調(diào)請求;由請求處理程序線程執(zhí)行由彈出的回調(diào)請求指定的函數(shù);以及由請求處理程序線程響應于函數(shù)的完成而對eu生成完成信號。
示例19可以包括示例18的主題,并且回調(diào)請求包括:函數(shù)指針,用于指定要由第二處理器執(zhí)行的函數(shù);以及變元指針,用于指定針對要提供給被執(zhí)行函數(shù)的數(shù)據(jù)以及要提供給eu的由被執(zhí)行函數(shù)生成的結果的在svm中的位置。
示例20可以包括示例18和19的主題,還包括響應于檢測到第一deque為空,由請求處理程序線程從第二deque彈出回調(diào)請求中的一個回調(diào)請求,該第二deque與第二eu相關聯(lián)。
示例21可以包括示例18-20的主題,還包括將deque固定在svm中,以防止響應于由eu和請求處理程序進行的訪問嘗試而產(chǎn)生頁面錯誤。
示例22可以包括示例18-21的主題,并且生成完成信號還包括:在svm中完成標志以供eu進行輪詢。
示例23可以包括示例18-22的主題,并且生成完成信號還包括:觸發(fā)eu上的連續(xù)內(nèi)核,連續(xù)內(nèi)核用于復原先前保存的堆棧變量。
示例24可以包括示例18-23的主題,還包括由請求處理程序線程響應于從所述deque中的任意一個deque彈出回調(diào)請求中的一個回調(diào)請求的失敗而進行休眠。
示例25可以包括示例18-24的主題,并且休眠還包括執(zhí)行monitor/mwait指令。
根據(jù)示例26,提供了一種用于在第一處理器與第二處理器之間的函數(shù)回調(diào)請求的系統(tǒng)。該系統(tǒng)可以包括用于由第一處理器的執(zhí)行單元(eu)將回調(diào)請求推送到第一雙端隊列(deque)的模塊,該deque存儲在耦合到第一處理器和第二處理器的共享虛擬存儲器(svm)中;用于由在第二處理器上執(zhí)行的請求處理程序線程從第一deque彈出回調(diào)請求中的一個回調(diào)請求的模塊;用于由請求處理程序線程執(zhí)行由彈出的回調(diào)請求指定的函數(shù)的模塊;以及用于由請求處理程序線程響應于該函數(shù)的完成對eu生成完成信號的模塊。
示例27可以包括示例26的主題,并且回調(diào)請求包括:函數(shù)指針,用于指定要由第二處理器執(zhí)行的函數(shù);以及變元指針,用于指定針對要提供給被執(zhí)行函數(shù)的數(shù)據(jù)以及要提供給eu的由被執(zhí)行函數(shù)生成的結果的在svm中的位置。
示例28可以包括示例26和27的主題,還包括用于執(zhí)行以下操作的模塊:響應于檢測到第一deque為空,由請求處理程序線程從第二deque彈出回調(diào)請求中的一個回調(diào)請求,所述第二deque與第二eu相關聯(lián)。
示例29可以包括示例26-28的主題,還包括用于將deque固定在svm中以防止響應于由eu和請求處理程序進行的訪問嘗試而產(chǎn)生頁面錯誤的模塊。
示例30可以包括示例26-29的主題,并且用于生成完成信號的模塊還包括用于在svm中設置完成標志以供eu進行輪詢的模塊。
示例31可以包括示例26-30的主題,并且用于生成完成信號的模塊還包括用于觸發(fā)eu上的連續(xù)內(nèi)核的模塊,連續(xù)內(nèi)核用于復原先前保存的堆棧變量。
示例32可以包括示例26-31的主題,還包括用于由請求處理程序線程響應于從所述deque中的任意一個deque彈出回調(diào)請求中的一個回調(diào)請求的失敗而進行休眠的模塊。
示例33可以包括示例26-32的主題,并且用于休眠的模塊還包括用于執(zhí)行monitor/mwait指令的模塊。
本文中使用的術語和表述被用作描述而不是限制的術語,并且在使用這些術語和表述中沒有意圖排除所示和所描述(或其部分)的特征的任何等同物,并且認識到在權利要求的范圍內(nèi)可以進行各種修改。因此,權利要求旨在涵蓋所有這樣的等同物。本文已經(jīng)描述了各種特征、方面和實施例。如本領域技術人員將理解的,特征、方面和實施例易于彼此組合以及變化和修改。因此,本公開應當被認為包括這樣的組合、變化和修改。