部循環(huán)的迭代的情 況,示出了示例420。在此示例中,對于i=0,存在內(nèi)部循環(huán)的3次迭代;對于i=l,存在內(nèi)部 循環(huán)的6次迭代;對于i=2,存在內(nèi)部循環(huán)的5次迭代;以及對于i=3,存在內(nèi)部循環(huán)的2次 迭代。內(nèi)部循環(huán)在變換到用于向量長度4的平整狀態(tài)422后示出。迭代已均勻重新分布(或 平整)在4個(gè)標(biāo)量單元/處理器上。
[0020] 圖5示出與本公開內(nèi)容的示范實(shí)施例一致的循環(huán)依賴圖生成500。示出了源代碼 段的示例510。源代碼段510可由LDG構(gòu)造模塊306處理以產(chǎn)生LDG 530。通過執(zhí)行SSA分 析,可先將源代碼轉(zhuǎn)換成靜態(tài)單指派(SSA)形式520。SSA分析將獨(dú)特的變量名稱指派到每 個(gè)指派語句的目標(biāo)。例如,對于在其中能夠更改其值的每個(gè)實(shí)例,變量i用不同版本(例 如,τΛ r入r么rJ)。SSA分析也插入phi函數(shù)以指示將進(jìn)行有關(guān)將使用變量的哪個(gè)版本的 選擇的實(shí)例。
[0021] 產(chǎn)生的SSA形式520然后可用于生成作為源代碼510的備選表示的LDG 530,它 對部分向量化的準(zhǔn)備中的進(jìn)一步分析是有用的。LDG 530包括節(jié)點(diǎn)532和邊緣534 (即,連 接節(jié)點(diǎn)的線)。節(jié)點(diǎn)532可表示向量化單元,如語句、表達(dá)式或操作,換而言之,在標(biāo)量單元 /處理器之一上能夠執(zhí)行的代碼的項(xiàng)。邊緣534可表示在節(jié)點(diǎn)之間的依賴關(guān)系,并且可以 是數(shù)據(jù)依賴邊緣(DDE)或控制依賴邊緣(CDE)??蛇M(jìn)一步分析數(shù)據(jù)依賴,以將它們分類為 "強(qiáng)"(sDDE)或"弱"(wDDE),其中,"強(qiáng)"數(shù)據(jù)依賴表示某個(gè)或相對可能的依賴,而"弱"數(shù)據(jù)依 賴只表示較低概率的依賴。例如,由于通過變量"X"的明確鏈路,表示"s=x+y"的節(jié)點(diǎn)強(qiáng)烈 依賴于表示"x=a+b"的另一節(jié)點(diǎn)。相反,由于取決于在運(yùn)行時(shí)"X"和"y"的值,依賴是可能 的,但不確定并且可能性更低,因此,表示"s=A[x]"的節(jié)點(diǎn)只很小地依賴于表示"A[y]=a" 的另一節(jié)點(diǎn)。
[0022] 數(shù)據(jù)依賴也可標(biāo)有與生成條件測試結(jié)果(例如,真或假)的節(jié)點(diǎn)相關(guān)聯(lián)的謂詞 (predicate) 536 (例如,在LDG 530中的p和q)。如下面將更詳細(xì)描述的,對于控制依賴 邊緣,謂詞可以是控制謂詞,并且對于數(shù)據(jù)依賴邊緣,謂詞可以是使能謂詞。
[0023] 在一些實(shí)施例中,數(shù)據(jù)依賴也可標(biāo)有由可選路徑剖析模塊304生成的熱和冷路徑 信息。此信息可用于估計(jì)在代碼的關(guān)聯(lián)段上執(zhí)行向量化的值。
[0024] 也可為邊緣計(jì)算依賴距離534。例如,m維的多維陣列A可與第一節(jié)點(diǎn)(指派到)和 第二節(jié)點(diǎn)(指派自)相關(guān)聯(lián): 節(jié)點(diǎn) 1 和,…,.Λ/0/ 節(jié)點(diǎn)2 : -,Wi人…,U/: 其中,4? A表示作為循環(huán)迭代索引i的函數(shù)的用于每維的陣列索引變量。在此示例 中,如果以下成立,則可定義在從節(jié)點(diǎn)1到節(jié)點(diǎn)2的DDE上的距離O 對于所有i,并且,//m Oi。
[0025] 否則,距離〇不明確。
[0026] 在LDG 530中,具有非0距離的邊緣被標(biāo)記為"攜帶循環(huán)的(loop-carried)"。另 外,從一次迭代到下一次迭代的標(biāo)量依賴(如在以下示例中從節(jié)點(diǎn)2到節(jié)點(diǎn)1的X 2依賴)被 視為具有距離1的攜帶循環(huán)的依賴。
[0027] 節(jié)點(diǎn) 1 -/ι/ιιΛ·ν .r.-J: 節(jié)點(diǎn) 2 : ? . /: 如果邊緣依賴距離等于或超過向量長度,則該邊緣可被省略,這是因?yàn)樵谙蛄恐噶羁?越的迭代的范圍(即,向量長度迭代)內(nèi),由該邊緣連接的節(jié)點(diǎn)是獨(dú)立的,并且能夠被并行執(zhí) 行。
[0028] 圖6不出與本公開內(nèi)容的不范實(shí)施例一致的循環(huán)依賴圖分割600。LDG分割模塊 308可在LDG 530上執(zhí)行圖操作以操縱圖并將圖分割成VR區(qū)域620和SCC區(qū)域610。VR區(qū) 域沒有依賴循環(huán),而SCC區(qū)域可包含依賴循環(huán)。區(qū)域610、620通過前向依賴邊緣相互鏈接。
[0029] 在分割后,初始向量代碼生成模塊310可生成向量代碼的第一版本。最初,通過執(zhí) 行任何或所有以下操作,可向量化VR區(qū)域620。"If "語句可被轉(zhuǎn)換以將CDE替換為謂詞保 護(hù)向量操作。例如, if (m X......r: 可轉(zhuǎn)換成 V p: V X^v addfv γ, v z) 〇
[0030] DDE相關(guān)聯(lián)的使能謂詞可用于斷定取決于那些DDE的向量操作。初始向量代碼 生成模塊310也可通過利用斷定的向量操作將所有SCC變換到順序內(nèi)部循環(huán)內(nèi)來向量化 所有SCC。謂詞控制向量一次僅允許一個(gè)向量位置,并且在下一迭代中前進(jìn)到下一向量位 置。通過仿真原標(biāo)量指令,每個(gè)斷定的向量指令僅在向量變量的單個(gè)元素上操作。當(dāng)前內(nèi) 部循環(huán)迭代中單個(gè)元素的任何值變化被傳播到向量變量的后面元素??缮砂ㄑh(huán)歸納 向量初始化、循環(huán)不變式向量指派和/或任何其它預(yù)計(jì)算的前言(Prolog)。可生成在當(dāng)前 向量循環(huán)迭代中提取live-out標(biāo)量變量,并且將它們傳遞到后面的向量循環(huán)迭代的尾言 (epilog) 〇
[0031] 通過執(zhí)行以下操作,SCC區(qū)域分析、分類和代碼生成模塊312可配置成處理和向量 化SCC代碼區(qū)域610。首先,將SCC區(qū)域分類成三個(gè)類別之一。第一類別包括歸納變量(例 如,在循環(huán)的每次迭代上通過固定量調(diào)整的變量)和前綴計(jì)算(例如,fz+1)。這些情況通 過生成對應(yīng)向量操作來處理。例如,對于初始值為A的歸納變量i=i+l,以下向量操作生成 歸納變量向量Ki: /u:乂 I+J . /o/n/作為用于后面的迭代的初始向量F.+- dV見V-..叼。
[0032] 第二類別包括嚴(yán)格順序的SCC,包括指針陣列追蹤(例如,z=z->neXt等)。這些SCC 將以其形式保持為向量化代碼中的順序內(nèi)部循環(huán)。第三類別包括條件向量化SCC。在此第 三類別內(nèi),有三個(gè)子類別:控制歸納數(shù)據(jù)依賴、弱數(shù)據(jù)依賴和推測控制。這些子類別每個(gè)分 別結(jié)合圖7到9解釋。
[0033] 圖7示出與本公開內(nèi)容的示范實(shí)施例一致的條件向量化700的示例。示出了說明 控制歸納數(shù)據(jù)依賴情況的示例源代碼710和對應(yīng)LDG 720??刂茪w納數(shù)據(jù)依賴情況可通過 在僅一個(gè)條件路徑722上具有后向邊緣的SCC識(shí)別。此情況通過以下步驟來處理:選擇和 啟用后向邊緣條件在其中無效的迭代范圍,并且生成對應(yīng)的部分向量化代碼和相關(guān)聯(lián)迭代 范圍控制代碼730。
[0034] 圖8示出與本公開內(nèi)容的示范實(shí)施例一致的條件向量化800的另一示例。示出了 說明弱數(shù)據(jù)依賴情況的示例源代碼810和對應(yīng)LDG 820。弱數(shù)據(jù)依賴情況可通過具有全部 為wDDE 822的后向邊緣的SCC識(shí)別。此情況通過以下步驟來處理:利用wDDE檢查可能的 別名危險(xiǎn)條件,并且選擇和啟用那些危險(xiǎn)條件在其內(nèi)不存在的迭代范圍,以及生成對應(yīng)部 分向量化代碼和相關(guān)聯(lián)迭代范圍控制代碼830。
[0035] 圖9示出與本公開內(nèi)容的示范實(shí)施例一致的條件向量化900的另一示例。示出了 說明推測控制情況的示例源代碼910和對應(yīng)LDG 920。推測控制情況可通過具有是攜帶循 環(huán)的⑶E 922的后向邊緣的SCC識(shí)別。此情況通過以下步驟來處理:對后向控制條件進(jìn)行 推測,并且選擇和啟用推測后向條件在其內(nèi)有效的迭代范圍,以及生成對應(yīng)的部分向量化 代碼930并且在必要時(shí)生成誤推測校正代碼。在推測執(zhí)行期間的更改被保持為臨時(shí)副本。 如果必要,則生成另外的代碼以比較推測條件和實(shí)際條件。在誤推測的情況下,丟棄臨時(shí)副 本,并且可再次執(zhí)行原代碼。否則,將臨時(shí)副本提交到對應(yīng)變量向量。
[0036] 圖10示出與本公開內(nèi)容一致的示范實(shí)施例的操作的流程圖1000。在操作1010,識(shí) 別