使用寫入掩碼的具有simd架構(gòu)的寄存器分配的制作方法
【專利摘要】單指令多數(shù)據(jù)處理器可以通過識(shí)別在編譯期間具有不兼容寫入掩碼的生命期來實(shí)現(xiàn)寄存器分配。然后,在沖突圖中,在具有不兼容掩碼的生命期之間添加邊,以使得這些生命期將不會(huì)被分派給相同物理寄存器。
【專利說明】使用寫入掩碼的具有SIMD架構(gòu)的寄存器分配
[0001] 本申請(qǐng)是申請(qǐng)日為2011年02月23日、申請(qǐng)?zhí)枮?01110044003. 1、名稱為"使用 寫入掩碼的具有SIMD架構(gòu)的寄存器分配"的中國發(fā)明專利申請(qǐng)的分案申請(qǐng)。
【背景技術(shù)】
[0002] 本發(fā)明總體上涉及處理器,并且具體地涉及單指令多數(shù)據(jù)處理器。
[0003] 單指令多數(shù)據(jù)(SMD)處理器是在其中每一個(gè)指令可以并行地操作多個(gè)數(shù)據(jù)元 素的處理器。一些單指令多數(shù)據(jù)處理器可以以不同長度進(jìn)行操作,例如SMD8、SMD16,或 SMD32。
[0004] 物理SMD寄存器具有可以用來存儲(chǔ)多個(gè)小數(shù)據(jù)元素的大量比特。操作的模式可 以大致的描述為SIMDmxn,其中"m"是描述向量大小的數(shù)值項(xiàng),以及"η"是在SIMD中執(zhí)行的 并發(fā)程序流的數(shù)量。SMD8, SMDlx8的簡稱,基于陣列數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)來表示SMD操作, 其中一個(gè)寄存器包含由八個(gè)向量構(gòu)成的一個(gè)數(shù)據(jù)元素(同一個(gè))。有效地,存在八個(gè)并發(fā)程 序流。SMD16是SMDlxl6的簡稱,其中每一個(gè)SMD指令對(duì)包含由16個(gè)向量構(gòu)成的一個(gè)數(shù) 據(jù)元素(同一個(gè))的一對(duì)寄存器進(jìn)行操作。SIMD16具有16個(gè)并發(fā)程序流。
[0005] 寫入掩碼(write mask)可以用于允許通過一個(gè)控制流分支來計(jì)算寄存器的一部 分并通過另一控制流分支來計(jì)算寄存器的另一部分。當(dāng)用一個(gè)控制流分支中的一個(gè)掩碼寫 入的寄存器被用并行控制流分支中不同的掩碼寫入時(shí),可能發(fā)生執(zhí)行錯(cuò)誤。
[0006] 例如,簡單執(zhí)行錯(cuò)誤在將常量數(shù)據(jù)塊加載到在"那么"(then)分支中也被寫入的寄 存器中的指令的"并行"分支中使用"無掩碼"修飾符(modifier)。具有無掩碼修飾符的指 令可以重寫在"那么"分支中寫入的數(shù)據(jù)。如果省略無掩碼修飾符或如果將不同寄存器用 作所述塊加載的目的地,那么將重寫沒有意義的數(shù)據(jù)。然而,在該情況下,需要無掩碼修飾 符,并且大部分寄存器分配算法將允許相同目的地用于每一個(gè)指令。
[0007] 通常地,這意味著除非所有的"并行"分支使用相同類型的掩碼,例如相同寬度的 掩碼,否則不可以使用掩碼修飾符或?qū)懭胙诖a。這種無法使用具有不同寫入掩碼類型的寫 入掩碼或掩碼修飾符可能導(dǎo)致效率降低,因?yàn)槭褂幂^少數(shù)量的并發(fā)程序流。
【專利附圖】
【附圖說明】
[0008] 圖1是本發(fā)明的一個(gè)實(shí)施例的流程圖;
[0009] 圖2是根據(jù)一個(gè)實(shí)施例的圖1中示出的流程圖的構(gòu)建階段的流程圖;
[0010] 圖3是假設(shè)的控制流圖;
[0011] 圖4是假設(shè)的支配樹;
[0012] 圖5是根據(jù)本發(fā)明的另一實(shí)施例的構(gòu)建階段的流程圖;以及
[0013] 圖6是根據(jù)一個(gè)實(shí)施例的計(jì)算機(jī)系統(tǒng)的示意性描述。
【具體實(shí)施方式】
[0014] 根據(jù)本發(fā)明的一些實(shí)施例,可以在寄存器分配算法的構(gòu)建階段之前或期間檢測(cè)不 能具有不兼容(即,沖突)的寫入掩碼的生命期(live range)。因此,可以檢測(cè)沖突并可以 采取糾正動(dòng)作。這與傳統(tǒng)技術(shù)形成對(duì)比,所述傳統(tǒng)技術(shù)簡單地確定是否可能存在沖突并且 采取糾正動(dòng)作,而不管沖突是否事實(shí)上已經(jīng)發(fā)生。
[0015] 根據(jù)一些實(shí)施例,可以通過為沖突圖增加邊來修補(bǔ)這些沖突。這與可以簡單地排 除兩種不同單指令多數(shù)據(jù)模式的使用的傳統(tǒng)技術(shù)形成對(duì)比。因此,例如,在允許SMD8和 SIMD16二者的架構(gòu)中,在一些傳統(tǒng)的方法中,只有使用較小數(shù)量的流的模式可以被使用或 只有寫入掩碼的較低部分可以被使用,以避免沖突的可能性。
[0016] 在一些實(shí)施例中,可以使用圖著色寄存器分配算法來為特定的寄存器分配變量和 生命期。在這種情況下,如圖1所說明的,可以將檢測(cè)和沖突消解二者添加到寄存器分配算 法的構(gòu)建階段。寄存器分配是將程序變量分派到少數(shù)量的處理器寄存器中的過程。總的目 標(biāo)是將盡可能多的操作數(shù)保持在寄存器中以最大化結(jié)果程序的執(zhí)行速度。
[0017] 已知不同的寄存器分配機(jī)制,包括裝箱、諸如Chow式分配器的基于優(yōu)先級(jí)的圖著 色、諸如Chaitin式分配器的自底向上的圖著色,以及線性掃描寄存器分配方法(常用在即 時(shí)(JIT)編譯器中)。根據(jù)本發(fā)明的一些實(shí)施例,使用了 Chaitin-Briggs圖著色寄存器分 配算法,但是在其他實(shí)施例中,可以使用其他寄存器分配算法。
[0018] 寄存器分配算法試圖保證在并行控制流分支中不使用不兼容的掩碼來寫入寄存 器。在一些實(shí)施例中,這可以通過使用圖1中所示的圖著色寄存器分配算法10來完成。思 想是將盡可能多的變量分配到寄存器并且只在必要時(shí)將變量拋出到主存儲(chǔ)器。根據(jù)使用 Chaitin-Briggs圖著色的實(shí)施例,在重編號(hào)階段12,每一個(gè)變量被給予其自身唯一編號(hào)的 邏輯寄存器。該重編號(hào)階段也可以被稱為寄存器變量識(shí)別。
[0019] 在構(gòu)建階段14,獲得沖突圖。變量和生命期被表示為無向圖中的頂點(diǎn),并且當(dāng)兩個(gè) 頂點(diǎn)(也被稱為"結(jié)點(diǎn)")對(duì)應(yīng)的變量由于同時(shí)存在而沖突時(shí)可以通過邊將它們連接起來。 可以將該圖的頂點(diǎn)著色視為寄存器分配,其中由頂點(diǎn)顏色來表示每一個(gè)寄存器并且沒有頂 點(diǎn)具有與其鄰居相同的顏色。生命期是變量活動(dòng)的時(shí)間間隔。在一些實(shí)施例中,可以可互 換地看待變量和生命期。
[0020] 當(dāng)兩個(gè)變量同時(shí)存在并且由此沖突時(shí)在它們之間畫一條邊。因此,沖突變量需要 在不同的寄存器位置處存在或在圖中具有不同的顏色以避免沖突。
[0021] 接著,合并階段16試圖優(yōu)化每一個(gè)圖的路徑。當(dāng)可能時(shí),通過用一個(gè)變量取代兩 個(gè)不沖突的變量來合并結(jié)點(diǎn)以減少圖著色問題的大小。
[0022] 接著,在框18計(jì)算拋出成本。在構(gòu)建沖突圖之后,考慮到寄存器數(shù)量有限,因此可 能不能將所有的結(jié)點(diǎn)映射到寄存器。所以可以拋出或移動(dòng)一些結(jié)點(diǎn)到外部存儲(chǔ)器。
[0023]目標(biāo)是拋出導(dǎo)致最小拋出成本的那些結(jié)點(diǎn)。拋出成本是將結(jié)點(diǎn)拋出到外部存儲(chǔ)器 的成本,并且可以取決于多個(gè)因素,包括使用變量的頻率??梢允褂糜捎趻伋鰧?dǎo)致的執(zhí)行性 能的降低的啟發(fā)式測(cè)量來對(duì)拋出哪些結(jié)點(diǎn)進(jìn)行優(yōu)先化。該優(yōu)先化確定將結(jié)點(diǎn)移到外部存儲(chǔ) 器的順序。
[0024] 接著,在簡化/選擇階段20,通過將可用顏色應(yīng)用到每一個(gè)頂點(diǎn)結(jié)點(diǎn)來完成圖的 實(shí)際著色,其中所述顏色對(duì)應(yīng)不同的寄存器。這可以一個(gè)塊接一個(gè)塊地完成。塊簡單地說 是要編譯的代碼塊。
[0025] 階段20之后,在框22之中實(shí)際確定拋出代碼。拋出代碼是使得變量被拋出到外 部存儲(chǔ)器所需的代碼。該流程針對(duì)所有塊在移動(dòng)到下一級(jí)之前執(zhí)行。然后,在簡化/選擇 級(jí)之后,隨后的循環(huán)在確定拋出代碼之后回到開始。
[0026] 接著參考圖2,根據(jù)一個(gè)實(shí)施例,構(gòu)建階段14在菱形30處從確定兩個(gè)寫入掩碼之 間是否可能存在沖突開始。如果是,那么在框32,實(shí)際確定不能具有不兼容寫入掩碼的那些 生命期。接著,在框34將邊添加到?jīng)_突圖,以使得具有不兼容寫入掩碼的生命期不被分派 給相同的物理寄存器。
[0027] 因此,參考圖3,在該例子中,假設(shè)的控制流圖可以包括入口塊,其后是在出口塊之 前的編號(hào)為ΒΒ0到BB7的一系列塊。該控制流圖示出了要被編譯的算法的邏輯流。
[0028] 圖4示出了圖3中示出的控制流圖的假設(shè)的支配樹。在編譯器中使用支配樹來確 定樹中哪些基本塊是另一基本塊的孩子。一個(gè)塊是一個(gè)子塊的父親,也即保證流要通過該 父塊來到達(dá)該子塊。例如,在圖3的控制流圖中,基本塊1(BB1)是基本塊2(BB2)的父親, 如圖4的支配樹所示。
[0029] 因此,支配樹指示哪些結(jié)點(diǎn)(稱為父結(jié)點(diǎn))被遍歷以到達(dá)其他結(jié)點(diǎn)(稱為子結(jié) 點(diǎn))。支配樹可以由編譯器根據(jù)控制流圖而得到,但是編譯器不能根據(jù)支配樹而得到控制流 圖。在一個(gè)實(shí)施例中,使用支配樹來找到并行分支和并行活動(dòng)集。并行活動(dòng)集是不能具有 不兼容寫入掩碼的生命期的集合。
[0030] 與另一基本塊并行的基本塊是該基本塊的支配樹前趨(直到支配不在該基本塊 的支配路徑中的出口塊的前趨)的直接后繼。換言之,并行塊可以包括到并行執(zhí)行分支的 入口結(jié)點(diǎn)?;緣K2是到基本塊6的并行執(zhí)行分支的入口結(jié)點(diǎn)。并行塊還包括來自并行執(zhí) 行分支的"聯(lián)合節(jié)點(diǎn)"(join node)。在該例子中,基本塊7是基本塊6的聯(lián)合節(jié)點(diǎn)。并行 塊還包括"臨界邊結(jié)點(diǎn)"(critical edge node)。在該例子中,基本塊5是基本塊6的臨界 邊結(jié)點(diǎn)。如所指示的,在圖3和圖4的橢圓中為與基本塊6并行的基本塊指示了這些基本 塊的生命內(nèi)(live-in)集合。生命內(nèi)集合共同地描述了并行活動(dòng)集。因此,在一些實(shí)施例 中,并行塊可以被自動(dòng)地檢測(cè)為到并行執(zhí)行分支的入口結(jié)點(diǎn)、來自并行執(zhí)行分支的聯(lián)合節(jié) 點(diǎn),或在一些實(shí)施例中檢測(cè)為臨界邊結(jié)點(diǎn)。
[0031] 入口結(jié)點(diǎn)、基本塊1、基本塊3和基本塊4不被認(rèn)為是與基本塊6并行的,因?yàn)樗鼈?在包括基本塊6的相同支配路徑上。此外,基本塊0不被認(rèn)為是并行的,因?yàn)榛緣K1支配 出口結(jié)點(diǎn)并且沒有檢查基本塊1的上游結(jié)點(diǎn)。最后,盡管基本塊7不是直觀地與基本塊6 并行的,但是基本塊7結(jié)點(diǎn)的生命內(nèi)集合與基本塊6并行。這是因?yàn)榛緣K7結(jié)點(diǎn)生命內(nèi) 的生命期在與基本塊6并行的結(jié)點(diǎn)的生命外(live-out)集合內(nèi)。具體而言,基本塊7的生 命內(nèi)集合由基本塊2和基本塊5的生命外集合構(gòu)成。更一般地說,聯(lián)合節(jié)點(diǎn)的生命內(nèi)集合 與其前趨結(jié)點(diǎn)的生命外集合相同。通過將聯(lián)合節(jié)點(diǎn)的生命內(nèi)集合包括到并行活動(dòng)集中,算 法不需要考慮生命外集合。
[0032] -旦找到基本塊的并行活動(dòng)集,檢查基本塊中的每一個(gè)指令,并且核查確定其寫 入掩碼是否與并行活動(dòng)集中的每一個(gè)生命期的掩碼不兼容。如果是,那么算法在該生命期 和該指令的目的地之間插入沖突(這在原始Chaitin-Briggs算法中可能并不沖突)。
[0033] 如果兩個(gè)掩碼能夠?qū)懭氲讲⑿蟹种е械南嗤琒MD子通道,那么它們是不兼容的。 在一些實(shí)施例中,對(duì)于避免具有不兼容寫入掩碼的指令的需求可以避免,并且可以在極少 或沒有效率損失的情況下處理該需求。
[0034] 參考圖5,根據(jù)更詳細(xì)的實(shí)施例,在框40選擇初始基本塊。然后如框42所指示的, 識(shí)別不在所選擇的基本塊的支配路徑上的并行基本塊。接著,如框44所指示的,確定并行 基本塊的生命內(nèi)集合以建立并行生命內(nèi)集合。
[0035] 如框46所指示的,然后可以檢查所選擇的基本塊的每一個(gè)指令以查看其掩碼是 否與并行生命內(nèi)集合中的掩碼不兼容。如果如菱形48所確定的,不存在不兼容性,那么在 菱形52的核查確定這是否是最后的塊。如果是,那么流程結(jié)束,否則,流程迭代回框40。
[0036] 如果存在不兼容性,那么如框50所示,在沖突圖中插入邊,并且流程進(jìn)行迭代。
[0037] 圖6中示出的計(jì)算機(jī)系統(tǒng)130可以包括通過總線104耦合到芯片組核心邏輯110 的可移動(dòng)介質(zhì)136和硬盤驅(qū)動(dòng)器134。在一個(gè)實(shí)施例中,核心邏輯可以耦合到圖形處理器 112 (經(jīng)由總線105)和主處理器100。圖形處理器112還可以通過總線106耦合到幀緩沖 器114。幀緩沖器114可以通過總線107耦合到顯示屏118,顯示屏118又通過總線108耦 合到諸如鍵盤或鼠標(biāo)120的傳統(tǒng)部件。
[0038] 在軟件實(shí)現(xiàn)的情況中,可以將實(shí)現(xiàn)圖2和圖5的序列的相關(guān)代碼存儲(chǔ)在包括主存 儲(chǔ)器132(在本文中有時(shí)也被稱為外部存儲(chǔ)器)的任何合適的半導(dǎo)體、磁的或光的存儲(chǔ)器 中。因此,在一個(gè)實(shí)施例中,可以將代碼139存儲(chǔ)在諸如主存儲(chǔ)器132或幀緩沖器114的機(jī) 器可讀介質(zhì)中,以由諸如處理器1〇〇或圖形處理器112的處理器執(zhí)行。
[0039] 在軟件實(shí)施例中,圖2和圖5中示出的序列可以是圖形處理器112的一部分。然 而,這些序列也可以用存儲(chǔ)在幀緩沖器114或主存儲(chǔ)器132中的軟件來實(shí)現(xiàn),如139所示。 當(dāng)然,這些軟件可以位于圖形處理器112或任何其他存儲(chǔ)設(shè)備中。
[0040] 可以用各種硬件架構(gòu)來實(shí)現(xiàn)本文描述的圖形處理技術(shù)。例如,可以將圖形功能性 集成到芯片組內(nèi)??商鎿Q地,可以使用分立的圖形處理器。作為另一個(gè)實(shí)施例,可以由包括 多核心處理器的通用處理器來實(shí)現(xiàn)這些圖形功能。
[0041] 貫穿本說明書提及的"一個(gè)實(shí)施例"或"實(shí)施例"意味著結(jié)合該實(shí)施例描述的特定 特征、結(jié)構(gòu)或特性至少包含在本發(fā)明涵蓋的一個(gè)實(shí)現(xiàn)中。因此,短語"一個(gè)實(shí)施例"或"在實(shí) 施例中"的出現(xiàn)未必都指同一實(shí)施例。此外,可以用不同于所說明的具體實(shí)施例的其他合適 形式來創(chuàng)立這些特定特征、結(jié)構(gòu)或特性,并且所有這些形式可以包含在本申請(qǐng)的權(quán)利要求 中。
[0042] 盡管參照有限數(shù)量的實(shí)施例描述了本發(fā)明,但是本領(lǐng)域中的技術(shù)人員將理解從中 進(jìn)行的大量修改和變型。所附權(quán)利要求旨在覆蓋落在本發(fā)明的真實(shí)精神和范圍內(nèi)的所有這 種修改和變型。
【權(quán)利要求】
1. 一種用于單指令多數(shù)據(jù)處理器的方法,包括: 確定在所述單指令多數(shù)據(jù)處理器的編譯期間不能具有不兼容寫入掩碼的生命期,其 中,如果兩個(gè)掩碼能夠?qū)懭氲讲⑿蟹种е械南嗤膯沃噶疃鄶?shù)據(jù)子通道,那么它們是不兼 容的;以及 響應(yīng)于所述確定,執(zhí)行糾正動(dòng)作。
2. 根據(jù)權(quán)利要求1所述的方法,其中,所述糾正動(dòng)作包括將邊添加到?jīng)_突圖,以使得具 有不兼容寫入掩碼的生命期將不被分派給相同物理寄存器。
3. 根據(jù)權(quán)利要求1所述的方法,包括使用支配樹來確定不能具有不兼容寫入掩碼的生 命期。
4. 根據(jù)權(quán)利要求3所述的方法,包括找到不在選擇的基本塊的支配路徑上的并行基本 塊。
5. 根據(jù)權(quán)利要求4所述的方法,包括確定并行基本塊的活動(dòng)集以建立并行生命內(nèi)集 合。
6. 根據(jù)權(quán)利要求5所述的方法,包括檢查所述選擇的基本塊的每一個(gè)指令,以查看其 掩碼是否與所述并行生命內(nèi)集合中的掩碼不兼容。
7. 根據(jù)權(quán)利要求1所述的方法,包括使得能夠在所述單指令多數(shù)據(jù)處理器中使用兩個(gè) 不同的單指令多數(shù)據(jù)模式。
8. 根據(jù)權(quán)利要求1所述的方法,其中,如果所述寫入掩碼能夠?qū)懭氲讲⑿谢緣K中的 相同的單指令多數(shù)據(jù)子通道,那么所述寫入掩碼是不兼容的。
9. 一種用于單指令多數(shù)據(jù)處理器的裝置,包括: 第一邏輯,用于確定兩個(gè)寫入掩碼之間是否可能存在沖突; 第二邏輯,用于如果確定可能存在所述沖突,則確定不能具有不兼容寫入掩碼的生命 期; 第三邏輯,用于將邊添加到?jīng)_突圖,以使得具有不兼容寫入掩碼的生命期將不被分派 給相同物理寄存器,其中,如果兩個(gè)掩碼能夠?qū)懭氲讲⑿蟹种е械南嗤膯沃噶疃鄶?shù)據(jù)子 通道,那么它們是不兼容的。
10. 根據(jù)權(quán)利要求9所述的裝置,其中,所述裝置用于確定在所述單指令多數(shù)據(jù)處理器 的編譯期間不能具有不兼容寫入掩碼的生命期。
11. 根據(jù)權(quán)利要求9所述的裝置,其中,所述裝置用于使用支配樹來確定不能具有不兼 容寫入掩碼的生命期。
12. 根據(jù)權(quán)利要求11所述的裝置,其中,所述裝置用于找到不在選擇的基本塊的支配 路徑上的并行基本塊。
13. 根據(jù)權(quán)利要求12所述的裝置,其中,所述裝置用于確定所述并行基本塊的活動(dòng)集 以建立并行生命內(nèi)集合。
14. 根據(jù)權(quán)利要求13所述的裝置,其中,所述裝置用于檢查所述選擇的基本塊的每一 個(gè)指令以查看其掩碼是否與所述并行生命內(nèi)集合中的掩碼不兼容。
15. -種計(jì)算機(jī)系統(tǒng),包括: 單指令多數(shù)據(jù)處理器,用于確定在編譯期間不能具有不兼容寫入掩碼的生命期,其中, 如果兩個(gè)掩碼能夠?qū)懭氲讲⑿蟹种е械南嗤膯沃噶疃鄶?shù)據(jù)子通道,那么它們是不兼容 的;以及 耦合到所述處理器的存儲(chǔ)器。
16. 根據(jù)權(quán)利要求15所述的系統(tǒng),所述處理器將邊添加到?jīng)_突圖,以使得具有不兼容 寫入掩碼的生命期將不被分派給相同物理寄存器。
17. 根據(jù)權(quán)利要求15所述的系統(tǒng),所述處理器使用支配樹來確定不能具有沖突寫入掩 碼的生命期。
18. 根據(jù)權(quán)利要求17所述的系統(tǒng),所述處理器找到不在選擇的基本塊的支配路徑上的 并行基本塊。
19. 根據(jù)權(quán)利要求18所述的系統(tǒng),所述處理器確定并行基本塊的活動(dòng)集以建立并行生 命內(nèi)集合。
20. 根據(jù)權(quán)利要求19所述的系統(tǒng),所述處理器檢查所述選擇的基本塊的每一個(gè)指令以 查看其掩碼是否與所述并行生命內(nèi)集合中的掩碼不兼容。
21. 根據(jù)權(quán)利要求15所述的系統(tǒng),其中,所述處理器是圖形處理器。
22. 根據(jù)權(quán)利要求15所述的系統(tǒng),其中,所述存儲(chǔ)器是系統(tǒng)存儲(chǔ)器。
23. 根據(jù)權(quán)利要求15所述的系統(tǒng),其中,所述處理器是多核處理器。
【文檔編號(hào)】G06F9/45GK104156253SQ201410381252
【公開日】2014年11月19日 申請(qǐng)日期:2011年2月23日 優(yōu)先權(quán)日:2010年2月24日
【發(fā)明者】T·揚(yáng)恰克, B·J·阿什博 申請(qǐng)人:英特爾公司