存儲(chǔ)命令、參數(shù)數(shù)據(jù) 和結(jié)果數(shù)據(jù))的通用寄存器(GPR)。在替代實(shí)施例中,這些是專用的應(yīng)用專用寄存器。
[0073] 在一個(gè)實(shí)施例中,這些群集執(zhí)行包括如808處所示的、可使一個(gè)或多個(gè)加速器被 調(diào)用的XCALL指令的程序代碼806-807、809-810。作為響應(yīng),經(jīng)由寄存器集合830中的命令 寄存器(下文中參照?qǐng)D8B進(jìn)行描述)和/或參數(shù)寄存器,向加速器801提供指定要被執(zhí)行 的操作的控制信息。作為響應(yīng),加速器可使用一個(gè)或多個(gè)固定功能單元802和/或可編程功 能單元803來(lái)執(zhí)行命令?;蛘撸铀倨魅杭?01可用忙碌指示、異?;蜻`背來(lái)響應(yīng)。然后, 經(jīng)由寄存器集合830之內(nèi)的結(jié)果寄存器(下文中參照?qǐng)D8C進(jìn)行描述),向處理器群集804 提供這些結(jié)果。如果成功地執(zhí)行了該命令,則可將得到的數(shù)據(jù)存儲(chǔ)在結(jié)果寄存器中。相比 之下,如果沒有成功地執(zhí)行該命令,則可將指示失敗的原因的數(shù)據(jù)存儲(chǔ)在該結(jié)果寄存器中 (并且可將該數(shù)據(jù)用于例如確定是否重新嘗試執(zhí)行該命令)。
[0074] 如圖8A所示,可在處理器群集上執(zhí)行一個(gè)或多個(gè)處理程序805、806。在一個(gè)實(shí)施 例中,如圖所示,由處理程序生成的中斷可導(dǎo)致對(duì)加速器群集的調(diào)用。
[0075] 圖8B示出命令寄存器結(jié)構(gòu)的一個(gè)實(shí)施例。如圖所示,命令寄存器的頂部16位(被 標(biāo)識(shí)為字段811-815)包含用指定數(shù)量的位進(jìn)行編碼的下列數(shù)據(jù)字段:
[0076] 保留的811:2位
[0077]繼續(xù) 812:1 位
[0078]反饋(tickle) 813:1 位
[0079] 私有的814:1位
[0080] Id 815:11 位
[0081] 在一個(gè)實(shí)施例中,該id唯一地標(biāo)識(shí)將調(diào)用的加速器。例如,如上所述,多個(gè)加速器 可被包括在加速器群集801中,并且可通過(guò)加速器id碼來(lái)唯一地標(biāo)識(shí)這些加速器中的每一 個(gè)。
[0082] 在一個(gè)實(shí)施例中,該"私有"位指示加速器是否屬于特定的已知加速器組。例如, 如果該私有位被設(shè)置為0,則該id可標(biāo)識(shí)加速器的通用集合(如本專利申請(qǐng)的受讓人所定 義的那樣)中的一個(gè),使得相同的id是指橫跨所有計(jì)算機(jī)系統(tǒng)/處理器的相同加速器。如 果該私有位被設(shè)置為1,則該id標(biāo)識(shí)專有或庫(kù)存單元(SKU)專用加速器。因此,該私有位被 設(shè)置為1時(shí),相同的id可以指不同系統(tǒng)中的不同加速器。
[0083] 在一個(gè)實(shí)施例中,該命令寄存器的低48位(被標(biāo)識(shí)為8B中的字段816)以及所有 的參數(shù)寄存器(沒有示出)包含由特定的被調(diào)用的加速器定義的應(yīng)用專用數(shù)據(jù)。
[0084] 在一個(gè)實(shí)施例中,當(dāng)被引退時(shí),XCALL指令集按如下方式設(shè)置EFLAGS中的Z位。 如本領(lǐng)域技術(shù)人員所理解的那樣,EFLAGS是x86實(shí)現(xiàn)中包含處理器的當(dāng)前狀態(tài)的狀態(tài)寄存 器。如果XCALL完成對(duì)所請(qǐng)求的加速器的執(zhí)行,該Z位被設(shè)置為1。在這種情況下,如果反 饋位被設(shè)置為1,則結(jié)果寄存器不被修改,并且沒有實(shí)際的工作被完成。如果該反饋位被設(shè) 置為0,則將該結(jié)果寄存器設(shè)置為加速器專用值。如果XCALL沒有做任何工作,則該Z位被 設(shè)置為0。雖然在該實(shí)施例中,該Z位用于指示XCALL指令是否成功,但是,可設(shè)置不同的位 而仍然符合本發(fā)明的基本原理。
[0085] 在一個(gè)實(shí)施例中,如圖8C所示,結(jié)果寄存器包含下列數(shù)據(jù)字段:
[0086] 保留的817:2位(在一個(gè)實(shí)施例中,總是被設(shè)置為零)
[0087] 永久的818:1位
[0088] 私有的819:1位
[0089] 失敗細(xì)節(jié)820:60位
[0090] 在一個(gè)實(shí)施例中,該永久位818用于指示對(duì)相同的XCALL的后續(xù)調(diào)用是否將成功。 例如,該永久位被設(shè)置為0指示對(duì)相同的XCALL的未來(lái)調(diào)用可能成功(例如,如果加速器正 忙于服務(wù)另一硬件線程)。相比之下,如果重新嘗試相同的XCALL沒有意義(例如,如果所 指定的加速器不存在于當(dāng)前的SKU中,或者如果所請(qǐng)求的特定的命令和/或參數(shù)組合不被 該SKU中的加速器支持),則該永久位被設(shè)置為1。
[0091] 在一個(gè)實(shí)施例中,設(shè)置該結(jié)果寄存器的低60位以提供關(guān)于XCALL失敗的原因的附 加數(shù)據(jù)。在一個(gè)實(shí)施例中,加速器群集801提供更新上述結(jié)果寄存器所需的信息。
[0092] 在一個(gè)實(shí)施例中,如果結(jié)果寄存器819的私有位被設(shè)置為1,則這些細(xì)節(jié)具有加速 器專用格式。如果該私有位被設(shè)置為〇,則按預(yù)先確定的通用格式(例如,由本專利申請(qǐng)的 受讓人指定的格式)來(lái)提供這些細(xì)節(jié)。在本發(fā)明的一個(gè)實(shí)施例中采用的示例性失敗結(jié)果碼 包括:
[0093] 命令寄存器中的保留位不是0
[0094] 加速器不存在
[0095] 加速器正忙于服務(wù)其他線程
[0096] 圖9A-C中呈現(xiàn)的流程圖示出由本發(fā)明的一個(gè)實(shí)施例執(zhí)行的操作。在901處,解碼 XCALL指令。結(jié)果,在902處,將與要由加速器執(zhí)行的命令有關(guān)的數(shù)據(jù)發(fā)送到命令寄存器,并 且將任何必要的參數(shù)發(fā)送到參數(shù)寄存器。在903處,取決于加速器是否屬于已知的加速器 組或?qū)S屑铀倨鳎ㄈ缟纤觯?,在命令寄存器中設(shè)置私有位。此外,在903處,在命令寄存器 中更新ID碼以標(biāo)識(shí)將執(zhí)行該命令的特定的加速器。
[0097] 在904處,被標(biāo)識(shí)的加速器接收由XCALL指令指定的命令,并且確定是否可執(zhí)行該 命令。例如,該加速器可能當(dāng)前正忙于服務(wù)另一硬件線程,并且因此不能夠執(zhí)行當(dāng)前的命 令。此外,如果所請(qǐng)求的當(dāng)前命令和/或參數(shù)組合不被該加速器支持,則該加速器將不能夠 成功地執(zhí)行該命令?;蛘?,該加速器可在904處成功地執(zhí)行該命令。
[0098] 如果成功地執(zhí)行了該命令,則該過(guò)程移向圖9B,其中,在906處,EFLAGS的Z位被 設(shè)置為等于〇以指示對(duì)該命令的成功執(zhí)行(如上文中所討論的那樣)。如果在907處確定 了該命令寄存器的反饋位先前已被設(shè)置為1 (例如,在圖9A中的操作902處),則在908處, 結(jié)果寄存器保持不被修改。如果該反饋位先前已被設(shè)置為〇,則在909處,該反饋位被設(shè)置 為加速器專用值。
[0099] 如果未由加速器成功地執(zhí)行XCALL指令所指定的命令(在圖9A中的905處進(jìn)行 確定),則在圖9C中的910處,EFLAGS的Z位被設(shè)置為等于1 (以指示未能執(zhí)行該命令)。 如果在911處確定了預(yù)期執(zhí)行該XCALL指令的未來(lái)嘗試將是成功的,則在913處,則結(jié)果寄 存器(圖8C中的818)的永久位被設(shè)置為0。也可在結(jié)果寄存器的失敗細(xì)節(jié)字段820中設(shè) 置指定失敗原因的附加數(shù)據(jù)。
[0100] 如果在911處預(yù)期執(zhí)行該XCALL指令的未來(lái)嘗試將是不成功的,則在912處,該永 久位被設(shè)置為等于1,(以指示結(jié)果的永久性),并且在結(jié)果寄存器的細(xì)節(jié)字段820中設(shè)置與 未能執(zhí)行該XCALL指令有關(guān)的附加數(shù)據(jù)。在上述任意一種情況下,可分析細(xì)節(jié)字段820中 的數(shù)據(jù)以確定失敗的根本原因,并且/或者采取措施來(lái)修改指令的執(zhí)行。
[0101] 如上所述,控制寄存器和/或參數(shù)寄存器可能被XCALL指令修改。此外,就像和普 通調(diào)用一樣,XCALL可消耗處理器內(nèi)的棧區(qū)。在使用x86架構(gòu)的一個(gè)實(shí)施例中,在XCALL期 間(例如,當(dāng)由異常處理程序檢查時(shí)),更新64位棧指針寄存器(RSP)以反映棧的使用。在 引退時(shí),該RSP寄存器被恢復(fù)為其原始值以反映釋放了所使用的棧區(qū)。所使用的棧量取決 于使用中的特定加速器。
[0102] 在本文所描述的操作序列期間,被調(diào)用的加速器可檢查和/或修改附加的寄存器 和/或存儲(chǔ)器位置的值。雖然對(duì)于不同的加速器,具體的語(yǔ)義可能不同,但是本發(fā)明的基本 原理保持相同。
[0103] 在一個(gè)實(shí)施例中,加速器配置成用于遵循下列一組規(guī)則:
[0104] (1)如果在XCALL期間允許中斷和/或異常,則繼續(xù)位被設(shè)置為1,并且一旦處理 程序完成就重新發(fā)布該XCALL,并且執(zhí)行繼續(xù)。
[0105] (2)在中斷和/或異常存在時(shí),該加速器必須確保向前進(jìn)展。
[0106] (3)可在所記錄的加速器專用位置中更新加速器在中斷和/或異常存在的情況下 實(shí)現(xiàn)向前進(jìn)展所需要的任何狀態(tài),所記錄的加速器專用位置可以是下述中的一個(gè)或多個(gè): (a)命令和/或參數(shù)寄存器;(b)其他架構(gòu)寄存器;(c)棧區(qū);(d)附加的存儲(chǔ)器位置。在 上述情況的全部情況下,此類狀態(tài)必須幸免于諸如來(lái)自上下文切換的保存和恢復(fù)操作(例 如,XSAVE/上下文切換/XREST0RE)。
[0107] (4)如果加速器被給予"無(wú)效的"命令和/或參數(shù)寄存器(例如,不被支持的特征、 超過(guò)硬件限制的值等),則該加速器可選擇永久地拒絕調(diào)用。然而,如果加速器已接受調(diào)用, 則其負(fù)責(zé)完成該請(qǐng)求并提供結(jié)果。
[0108] (5)可編程加速器調(diào)用用戶碼,該用戶碼可按加速器專用方式(由圖8A中的可編 程功能單元803表示)受限。例如,"排序"加速器可調(diào)用比較功能,而"循環(huán)"加速器可調(diào) 用循環(huán)體。如果該用戶碼不遵循所期望的限制(例如,當(dāng)使用基于環(huán)的分層保護(hù)域時(shí),該用 戶碼試圖進(jìn)入環(huán)0),則該加速器將在照例保存其狀態(tài)之后觸發(fā)異常(具體而言,UD)。
[0109] (6)異常處理程序可選擇:(a)基于所保存的狀態(tài),在非加速軟件中完成部分地被 評(píng)價(jià)的加速器;(b)仿真不被支持的指令,并且重新發(fā)布XCALL (需要微調(diào)被保存的狀態(tài),因 此不重新嘗試該不被支持的操作);或(c)終止執(zhí)行。僅僅試圖重新發(fā)布該XCALL而不作 任何修改將僅重新觸發(fā)異常(如針對(duì)UD所預(yù)期的那樣)。
[0110] 本文所描述的本發(fā)明的多個(gè)實(shí)施例提供可結(jié)合進(jìn)諸如X86ISA之類的指令集架構(gòu) (ISA)以用于調(diào)用加速器的標(biāo)準(zhǔn)機(jī)制。與本專利申請(qǐng)的【背景技術(shù)】中所描述的技術(shù)相比,本文 中所描述的加速器調(diào)用技術(shù)允許自然地共享盡量多(或盡量少)的核資源(例如,存儲(chǔ)器 轉(zhuǎn)換、寄存器、高速緩存等)的細(xì)粒度、低等待時(shí)間的同步加速器??删幊蘕CALL加速器允 許用戶加速普通的x86代碼(例如,循環(huán)和排序),該代碼是主x86程序的集成部分,并且不 需要單獨(dú)的工具鏈。
[0111] 此外,針對(duì)特定的加速器設(shè)計(jì)當(dāng)前的加速器接口,而本文中所述的本發(fā)明的多個(gè) 實(shí)施例是可擴(kuò)展的,進(jìn)而允許針對(duì)特定的市場(chǎng)細(xì)分流水線化地供應(yīng)專用加速器,并且跨越 所有的市場(chǎng)細(xì)分流水線化地供應(yīng)"通用"加速器??稍诘偷却龝r(shí)間和沒有數(shù)據(jù)復(fù)制開銷的 情況下完成加速器調(diào)用,從而允許此類加速器的生態(tài)系統(tǒng)能夠涵蓋以前無(wú)法實(shí)際提供的功 能。利用用于特定市場(chǎng)(例如,嵌入式系統(tǒng)、圖像處理、HPC服務(wù)器等)的加速器來(lái)定制SKU, 從而保持與諸如x86之類的現(xiàn)有ISA的緊密集成也變得可能。
[0112] 本文中所描述的XCALL接口也開放無(wú)需跳出CPU ISA和工具鏈(針對(duì)本專利申 請(qǐng)的受讓人所指定的處理器的x86 ISA)就可擴(kuò)展CPU以涵蓋先前不可被訪問(wèn)的功能的能 力。例如,使用本文中所述的多種技術(shù),可提供可編程加速器803 (例如,可編程循環(huán)加速器 (SKMD)和排序加速器)和固定功能加速器802 (例如,執(zhí)行快速傅里葉變換(FFT)、紋理采 樣和各種其他功能的那些加速器)。
[0113] 復(fù)雜ISA指令的怏諫失敗處理
[0114] 當(dāng)前,失敗指令除了通過(guò)通常用于異常處理程序中的專用標(biāo)記位和/或?qū)S眉拇?器之外,不具有用于提供關(guān)于失敗的附加細(xì)節(jié)的方法。下文所述的本發(fā)明的多個(gè)實(shí)施例提 供用于指令的新的"快速失敗"行為。按照該新行為,指令可返回成功/失敗指示(例如, 在諸如EFLAGS或一些其他寄存器之類的標(biāo)記寄存器內(nèi))。此外,在一個(gè)實(shí)施例中,在檢測(cè)到 失敗后,該指令在普通的目的地寄存器中寫入附加的失敗細(xì)節(jié)。這允許應(yīng)用代碼能夠測(cè)試 該指令的成功/失敗,并且不需要浪費(fèi)處理資源和時(shí)間(這種浪費(fèi)源自調(diào)用異常處理程序 或切換到采用分層保護(hù)域的系統(tǒng)上的低層級(jí)域(例如,環(huán)〇))就可響應(yīng)于某些失敗模式。
[0115] 針對(duì)既易于失敗又具有復(fù)雜失敗模式的某種類型的指令(例如,上文所描述的 XCALL指令)選擇所提出的針對(duì)指令失敗處理的新平衡(trade-off)點(diǎn)。然而,這不適用于 不容易失敗的其他類型的操作(例如,除以零(DIV)),或不適用于具有簡(jiǎn)單失敗模式的容 易失敗的操作(例如,鎖定)。
[0116] 本發(fā)明的一個(gè)實(shí)施例將指令分類為下列多個(gè)組中的一個(gè):
[0117] (1)總是成功。例如,預(yù)期將兩個(gè)寄存器中的值相加的指令的每一個(gè)實(shí)例都將成 功。在本發(fā)明的一個(gè)實(shí)施例中,針對(duì)本類別中的指令,沒有失敗處理被提供。
[0118] (2)預(yù)期多數(shù)時(shí)候成功。例如,將存儲(chǔ)在兩個(gè)寄存器中的值相除的指令一般將會(huì)成 功。它將僅會(huì)由于除以零錯(cuò)誤而失敗。在本發(fā)明的一個(gè)實(shí)施例中,這類指令將觸發(fā)對(duì)失敗 的異常處理程序。然后,該異常處理程序可檢查諸如x86控制寄存器(CR)之類的包含附加 的失敗信息的專用寄存器以確定正確的動(dòng)作過(guò)程(例如,用于頁(yè)錯(cuò)誤的CR2)。該異常處理 程序和普通應(yīng)用代碼分開,從而保持應(yīng)用代碼干凈,并且不受失敗處理邏輯污染。
[0119] (3)具有簡(jiǎn)單失敗樽式的預(yù)期"經(jīng)常"失敗。在一個(gè)實(shí)施例中,對(duì)于這些類型的指 令,設(shè)置標(biāo)記和/或目的地寄存器中的位以指示失敗,但是沒有細(xì)節(jié)被提供。一個(gè)示例是嘗 試設(shè)置鎖定數(shù)據(jù)的指令。對(duì)于這些簡(jiǎn)單的失敗模式,應(yīng)用代碼自身顯式地處理恢復(fù)(不需 要異常處理程序)。
[0120] (4)具有復(fù)雜失敗樽式的預(yù)期"經(jīng)常"失敗。對(duì)于此類指令,處理系統(tǒng)當(dāng)前需要求 助于異常處理程序來(lái)訪問(wèn)專用寄存器,以便檢查失敗細(xì)節(jié)。對(duì)于"經(jīng)常"失敗并且具有復(fù)雜 失敗模式的指令,本發(fā)明的多個(gè)實(shí)施例允許在標(biāo)記和/或目的地寄存器中設(shè)置位以指示失 敗,也在目的地寄存器中設(shè)置附加的位以指定該失敗的細(xì)節(jié),從而允許應(yīng)用代碼不需要求 助于異常處理程序就能采取正確的動(dòng)作。
[0121] 這將失敗的代價(jià)降到了最低(以必須測(cè)試每條指令的結(jié)果為代價(jià))。它也允許該 應(yīng)用簡(jiǎn)單地將其失敗處理邏輯定制為當(dāng)前的上下文,而不是使用難以改變的通用異常處理 程序(以必須在任何調(diào)用點(diǎn)顯式地調(diào)用該邏輯為代價(jià))。
[0122] 作為示例,上文中針對(duì)XCALL指令描述了該行為。在圖9A-C中提供的示例中, XCALL指令指定將由特定的加速器執(zhí)行的命令。作為響應(yīng),該加速器可執(zhí)行該命令,并且可 在結(jié)果寄存器(如討論的那樣,其可以是通用寄存器)中提供結(jié)果?;蛘?,該加速器可能出 于各種原因無(wú)法執(zhí)行該命令,并且用失敗原因來(lái)更新該結(jié)果寄存器。例如,該加速器可能當(dāng) 前正忙于服務(wù)另一硬件線程,并且