路。
[0044]在各實施例中,不管加速器如何被提供有主線程的上下文,主線程的上下文(例如,當(dāng)加速器被調(diào)用時(例如,就在這之后),機(jī)器針對主線程的架構(gòu)狀態(tài))未被修改,除了修改(例如,遞增)指令指針以及調(diào)整某些寄存器以便反映執(zhí)行狀態(tài)(成功/失敗以及相關(guān)細(xì)節(jié))之外。換言之,對微線程中的主線程上下文/架構(gòu)狀態(tài)的任何改變對主線程的調(diào)用應(yīng)用隱藏。這允許微線程按順序執(zhí)行。
[0045]在進(jìn)一步的實施例中,由于加速器可在與主線程相同的程序存儲器空間之外操作,作為調(diào)用過程的一部分,指令指針被改變?yōu)橹赶蚣铀倨鞔a的開始。這樣,主線程的指令指針上下文未被復(fù)制,作為微線程在之外操作的加速器調(diào)用的一部分(在加速器已經(jīng)完成其操作之后,其可被復(fù)制為將程序流返回主線程)。在此,值得指出的是期望編程微線程加速器具有其自身的指令取出單元,用于從程序存儲器取出微線程指令。
[0046]取決于方法,加速器的微線程之一可被認(rèn)為是在其他微線程之前開始操作并且控制其他微線程中的一個或多個微線程的開始的主微線程。在這種情況下,微線程調(diào)度本質(zhì)上由創(chuàng)建微線程的編譯器執(zhí)行(通過其制作主微線程代碼)。在實施例中,指令指針被改變?yōu)橹赶蛑魑⒕€程的開始。該方法可適合于線程之間存在某些相關(guān)性的情況(即,線程不完全隔離地操作)。
[0047]在替代實施例中,例如,其中微線程彼此不具有相關(guān)性或依賴性,一組指令指針被傳遞到加速器,每個指令指針具有用于多個微線程(諸如有待由加速器執(zhí)行的代碼的所有微線程)中的一個不同微線程的對應(yīng)起始地址。微線程僅例如并行地通過直接引用其對應(yīng)的指令指針開始。該組指令地址可被作為通用CPU核的主線程所進(jìn)行的調(diào)用的輸入?yún)?shù)傳遞。在此,允許由ABI使用的單獨的寄存器可用于每個不同的起始地址。在另一種方法中,如果加速器代碼能夠引用SMD寄存器空間,起始地址被保持在SMD寄存器空間內(nèi)的單個向量內(nèi)。
[0048]如果微線程具有某種相關(guān)性,在實施例中,微線程調(diào)度提示由主線程作為加速器調(diào)用的輸入?yún)?shù)提供給加速器。例如,描述不同微線程的起始序列順序的某個方面的特定輸入?yún)?shù)可被從主線程傳遞到加速器硬件。加速器硬件指令取出邏輯引用該信息以便理解或確定應(yīng)當(dāng)在哪個周期時間啟動哪些微線程。用于各個微線程的指令地址指針可由上述任何技術(shù)傳遞到加速器。在實施例中,編譯器向主線程代碼添加提示。
[0049]在實施例中,加速器返回給主線程的特定結(jié)果也以與ABI—致的方式呈現(xiàn)。在實施例中,加速器的主微線程將多個微線程的結(jié)果組合和/或監(jiān)督為單個結(jié)果。在實施例中,在加速器產(chǎn)物被返回到主線程之前,通用CPU核的寄存器空間內(nèi)的任何微線程上下文被切換出通用CPU核的寄存器空間,并且如果主線程的上下文在加速器操作期間被切換出主(PU核的寄存器空間,其被切換回通用CPU核的寄存器空間。這樣,主線程返回其調(diào)用加速器的狀態(tài)并且重新喚醒以便找到從加速器返回的結(jié)果。該結(jié)果可以是在標(biāo)量寄存器空間中提供的標(biāo)量或者在向量寄存器空間(例如,SIMD寄存器空間)中提供的向量。
[0050]在此,對于上述上下文切換活動中的任何活動,其中主線程或微線程上下文被切換到/切換出通用CPU核的寄存器空間,通用CPU核具有被設(shè)計成用于實現(xiàn)對應(yīng)的上下文切換活動的對應(yīng)邏輯電路。
[0051]異常、中斷和違規(guī)
[0052]異常是通常由微線程本身在加速器的微線程中的一個微線程內(nèi)檢測到的問題。中斷是位于加速器外部的事件(例如,輸入新的用戶命令)。
[0053]在實施例中,參照圖4,在或者異常或者中斷的情況下,加速器微線程暫停執(zhí)行401。針對每個微線程,將加速器內(nèi)部的任何狀態(tài)信息外部地保存到諸如存儲器(例如,調(diào)用加速器的應(yīng)用的存儲器空間(例如,用戶棧))、加速器私有的寄存器空間或主CPU核402的寄存器空間。本質(zhì)上,微線程的狀態(tài)被凍結(jié)并且被保存在外部??刂品祷氐街骶€程,該主線程在其調(diào)用加速器的時刻在其狀態(tài)下喚醒(棧指針可被修改以便反映附加棧使用)403。在此,在異常的情況下,加速器可返回“異?!钡慕Y(jié)果以便通知主線程需要異常處理器。在中斷的情況下,通用CPU核上的另一個活躍線程可觸發(fā)加速器轉(zhuǎn)儲其狀態(tài)并喚醒主線程。
[0054]然后主線程調(diào)用處理問題的異常和/或中斷處理器(例如,通過在異常的情況下引用保存在外部的微線程狀態(tài)信息)404。在問題被處理之后,中斷/異常處理器將微線程的保存在外部的狀態(tài)恢復(fù)到加速器405內(nèi)。然后,加速器的微線程從原始中斷/異常點重新開始操作406。
[0055]在替代方法中,在異常的情況下,不是返回主線程以便使其調(diào)用異常處理器,而是,加速器硬件直接調(diào)用異常處理器而不喚醒主線程并且將指針傳遞到異常線程的所保存狀態(tài)信息的位置(在此,響應(yīng)于異常,再次將加速器內(nèi)的微線程的內(nèi)部狀態(tài)信息保存在外部)。根據(jù)該方法,異常處理器直接引用異常代碼并解決問題。執(zhí)行隨后被返回到加速器,例如不涉及主CPU線程。加速器重新調(diào)用保存在外部的微線程狀態(tài)信息并重新開始操作。
[0056]在實施例中,與主線程對加速器的原始調(diào)用相關(guān)聯(lián)的狀態(tài)信息被保存在寄存器或存儲器空間內(nèi),從而使得程序控制可從異常處理器直接傳遞到加速器而不涉及主線程。根據(jù)一種方法,實現(xiàn)IRET指令(或用于確定當(dāng)從中斷處理器返回時將程序流指引到何處的類似指令)的邏輯電路包括使用所保存的調(diào)用狀態(tài)信息將流返回到加速器的微代碼或其他電路。這樣,IRET指令具有表明中斷是來自加速器并且作為響應(yīng)將程序流返回加速器的某種類型的輸入?yún)?shù)。在無需表明異常是來自加速器的輸入?yún)?shù)的情況下,IRET指令邏輯/微代碼將程序流返回主CPU線程。
[0057]在其他實施例中,異常處理器可被重新設(shè)計成用于使用所保存的調(diào)用狀態(tài)信息將流返回到加速器,或者異常微線程被允許實際上盡可能繼續(xù)操作,就像沒有異常被丟棄。在后一種方法中,無需外部地保存加速器微線程狀態(tài)。當(dāng)加速器最終將其結(jié)果返回到主線程時,更早的異常致使主線程調(diào)用異常處理器。當(dāng)異常處理器解決問題時,加速器被從頭重新調(diào)用,仿佛加速器之前尚未被調(diào)用。在此,所保存的調(diào)用的所保存的狀態(tài)信息可用于重新調(diào)用加速器。
[0058]從不符合底層機(jī)器所確立的要求的代碼觸發(fā)違規(guī)。根據(jù)一種可能性,加速器本身可強(qiáng)加限制,諸如對所加速的應(yīng)用回調(diào)代碼的限制(例如,僅64位模式等等)。在微線程代碼不符合為加速器所確立的要求的情況下,違規(guī)可被如此標(biāo)記但是與異常相同或類似地處理。
[0059]在一個實施例中,異常處理器可使用其中保存微線程狀態(tài)的存儲區(qū)域來在非加速模式下完成原始加速操作(例如,通過通用CPU核)。在操作完成時,異常處理器將執(zhí)行返回到加速器調(diào)用之后的指令。可替代地或者結(jié)合地,觸發(fā)違規(guī)的指令在軟件中執(zhí)行(例如,通過由通用CPU核執(zhí)行的指令)以便實現(xiàn)其操作。當(dāng)其操作重新開始時,引起違規(guī)的微線程如上所述由處理器用標(biāo)記來保持其狀態(tài)以便將操作返回違規(guī)指令之后的下一指令。
[0060]在另一種方法中,違規(guī)對軟件(例如,調(diào)用加速器的主應(yīng)用軟件程序)隱藏。也就是,不存在異常處理器。而是,處理器使用微代碼來以對軟件隱藏的方式執(zhí)行以下內(nèi)容:1)