張亞琳, 李 浩, 胡 驍, 梁 卓, 潘彥鵬
(中國航天科技集團(tuán)有限公司第一研究院 戰(zhàn)術(shù)武器總體技術(shù)部, 北京 100076)
數(shù)據(jù)中心將在未來迎來5G 業(yè)務(wù)[1], 其對響應(yīng)時間的要求無比嚴(yán)格, 通常要求精確到微秒級[2]. 人們對未來5G 的期望遠(yuǎn)遠(yuǎn)高于現(xiàn)有的4G 網(wǎng)絡(luò). 一方面, 隨著移動互聯(lián)網(wǎng)和物聯(lián)網(wǎng)的發(fā)展, 人們對用戶體驗(yàn)提出了更高的要求. 另一方面, 隨著5G 在工業(yè)互聯(lián)網(wǎng)、車聯(lián)網(wǎng)、企業(yè)網(wǎng)的深入應(yīng)用, 許多場景對通信時延、通信的可靠性和安全性提出了新的要求[3]. 另外, 運(yùn)營商希望以更好的整體持有成本來應(yīng)對5G 帶來的大帶寬, 海量流量, 多樣性等特征, 其核心在于計算系統(tǒng)能夠有更強(qiáng)的處理能力, 包括峰值能力和對多樣業(yè)務(wù)的適應(yīng)能力.
基于專用處理器的傳統(tǒng)基站具有覆蓋范圍窄, 難以增加頻譜效率以及軟硬件方案固化等問題, 不能適應(yīng)5G 時代對通信的強(qiáng)實(shí)時、大帶寬和升級換代便利等要求. 而數(shù)據(jù)中心采用云化的處理架構(gòu), 并將專用處理器替換為通用處理器, 可以使所有虛擬基站共享各項資源, 處理資源可以動態(tài)調(diào)度以適應(yīng)不同場合, 通用處理器近年來在處理能力以及功耗方面的技術(shù)進(jìn)展巨大, 且具有很好的靈活性, 能夠應(yīng)對各種復(fù)雜業(yè)務(wù)[4]. 所以, 出于處理能力、靈活性、多樣性以及費(fèi)用的考慮,5G 應(yīng)用由傳統(tǒng)基站承載轉(zhuǎn)向數(shù)據(jù)中心部署成為趨勢.
5G 應(yīng)用在數(shù)據(jù)中心的執(zhí)行行為分析存在以下兩點(diǎn)挑戰(zhàn).
(1) 無開源5G 應(yīng)用作為合適的研究對象, 而針對4G/3G 卻有很多較為成熟的開源實(shí)現(xiàn), 但這些應(yīng)用性能較差, 不能反映真實(shí)場景和應(yīng)用特征.
(2) 行為分析的復(fù)雜性. 應(yīng)用單獨(dú)執(zhí)行行為與所處平臺特征相關(guān), 共同運(yùn)行行為則與共享資源相關(guān), 需結(jié)合種類繁多的處理器特征參數(shù)及共享資源進(jìn)行分析.
多核/眾核芯片在數(shù)據(jù)中心中的普及, 使得研究人員開始關(guān)注到, 共同運(yùn)行的程序之間會對共享資源產(chǎn)生競爭, 從而導(dǎo)致程序執(zhí)行效率降低[5]. 針對刻畫應(yīng)用之間對共享資源的競爭程度, 進(jìn)而預(yù)測出應(yīng)用在不同場景下的性能表現(xiàn), 研究人員從基于統(tǒng)計學(xué)習(xí)和基于深度學(xué)習(xí)兩個方面開展性能預(yù)測模型的構(gòu)建. Subramanian 等人建立了精確性能預(yù)測模型, 用于預(yù)測由于內(nèi)存競爭造成性能損失[6]; Tang 等人使用統(tǒng)計模型建立了內(nèi)存帶寬和作業(yè)性能之間的關(guān)系[7]; 研究人員還采用諸如隨機(jī)森林回歸模型[8]、協(xié)同過濾算法[9]、統(tǒng)計分析[10]、機(jī)器學(xué)習(xí)[11]、深度神經(jīng)網(wǎng)絡(luò)[12]等方法完成從作業(yè)運(yùn)行時信息到作業(yè)性能的映射. 目前研究存在的問題主要有兩點(diǎn): (1) 主要選取應(yīng)用的某一個特征進(jìn)行分析, 如內(nèi)存帶寬和Cache 失效率, 但應(yīng)用的特征是多方面的, 某個角度的預(yù)測可能存在不夠準(zhǔn)確的問題;(2) 研究人員的關(guān)注重點(diǎn)在于在線型業(yè)務(wù), 對5G 等高實(shí)時應(yīng)用未做針對性深入研究.
本文結(jié)合多核共享緩存、處理器執(zhí)行部件和復(fù)雜硬件參數(shù), 全面分析5G 應(yīng)用的行為特征, 得出其對存儲和執(zhí)行部件的資源占用情況. 然后在多線程模式下,分析多個并發(fā)體之間的性能干擾來源, 最后得出5G 應(yīng)用在數(shù)據(jù)中心的合理部署方案. 主要貢獻(xiàn)如下.
(1) 結(jié)合體系結(jié)構(gòu)特征分析應(yīng)用執(zhí)行行為. 5G 應(yīng)用下行過程的物理層處理流程是計算密集型的, 最高端口利用率90%, 基本無數(shù)據(jù)復(fù)用, 訪存不密集, QoS(quality of service)要求極其嚴(yán)格.
(2) 以性能最佳化部署為目標(biāo), 評估5G 應(yīng)用混合執(zhí)行行為并給出部署建議. 5G 應(yīng)用只能獨(dú)占機(jī)器執(zhí)行;不超過處理器物理核數(shù)的情況下可以盡可能多部署線程; SMT 嚴(yán)重影響性能因此不宜采用; 同時TurboBoost的影響不可忽視.
(3) 選取OpenLTE 作為5G 應(yīng)用的代表性benchmark進(jìn)行分析, 由于開源的OpenLTE 性能很差, 在性能分析時不能反映真實(shí)場景和行為特征, 因此本文首先根據(jù)通用處理器的特點(diǎn)對其代碼實(shí)現(xiàn)進(jìn)行了優(yōu)化, 取得了2.5 倍性能加速比.
OpenLTE[13]實(shí)現(xiàn)的是4G 基站功能, 雖然4G 網(wǎng)絡(luò)與5G 網(wǎng)絡(luò)在性能和實(shí)現(xiàn)關(guān)鍵技術(shù)方面存在差異, 但是OpenLTE 仍可作為研究5G 應(yīng)用下行過程物理層的樣本對象, 具體敘述如下.
5G 業(yè)務(wù)相比4G 業(yè)務(wù), 兩者部署方式及實(shí)現(xiàn)技術(shù)的差異主要表現(xiàn)在3 方面: (1) 網(wǎng)絡(luò)架構(gòu). 5G 的網(wǎng)絡(luò)設(shè)計相比4G 網(wǎng)絡(luò)采用成本高效的密集布置, 更加簡化的核心網(wǎng)絡(luò), 支持動態(tài)的無線拓?fù)涞木W(wǎng)絡(luò)功能虛擬化技術(shù)[14,15]. (2) 無線空口技術(shù)的演進(jìn), 從無線協(xié)議棧的各個層次改進(jìn), 對改善5G 業(yè)務(wù)性能具有重大幫助[16]. (3) 運(yùn)營網(wǎng)絡(luò)管理. 運(yùn)營商需要提供一個高效的資源利用、靈活的資源調(diào)配、精細(xì)和智能化的網(wǎng)絡(luò)管理平臺.
綜上所述, 4G 與5G 業(yè)務(wù)的不同之處主要在于網(wǎng)絡(luò)結(jié)構(gòu)及關(guān)鍵協(xié)議的具體實(shí)現(xiàn), 而針對本文要研究的5G 業(yè)務(wù)下行過程的物理層, 5G 應(yīng)用和4G 應(yīng)用在關(guān)鍵處理過程上仍保持一致, 需要完成冗余校驗(yàn)、編解碼、調(diào)制、解調(diào)、FFT 和多天線映射等工作, 雖然具體協(xié)議版本存在差異, 但是關(guān)鍵操作相似, 所以O(shè)penLTE 可以作為研究5G 應(yīng)用基站側(cè)下行過程物理層的參考對象.
OpenLTE 代碼主要的功能是做數(shù)據(jù)比特流的傳輸、分割、整合、特定格式編碼、變換碼率和調(diào)制等操作. 圖1 為處理流程.
圖1 OpenLTE 程序流程圖
從數(shù)據(jù)結(jié)構(gòu)來說, 主要是字符數(shù)組和字符矩陣. 輸入和輸出數(shù)據(jù)是長串字符數(shù)組, 而在中間變換碼率等操作時, 會用到矩陣來實(shí)現(xiàn)不同維度的編碼轉(zhuǎn)換.
從算法和操作的角度, 通信處理過程算法大多是位運(yùn)算的復(fù)雜疊加以及數(shù)據(jù)在不同形式的數(shù)據(jù)結(jié)構(gòu)和不同的傳輸單位間的賦值操作, 以及數(shù)據(jù)在不同坐標(biāo)系間的轉(zhuǎn)換操作.
本文的代碼優(yōu)化將從訪存優(yōu)化、位運(yùn)算優(yōu)化、分支語句優(yōu)化、結(jié)合數(shù)據(jù)分布特征優(yōu)化以及消除耗時運(yùn)算操作5 個方面進(jìn)行[17].
1.3.1 訪存優(yōu)化
經(jīng)分析, OpenLTE 代碼中有PreCoder, Concatenation, Layer Mapper, Rate Match, Turbo Encode 和Segmentation 六個模塊均存在大量連續(xù)的賦值操作, 且操作的數(shù)據(jù)量大, 可采用SIMD 訪存優(yōu)化方法[18]. SIMD加速部件的優(yōu)勢一方面體現(xiàn)在可以增加數(shù)據(jù)操作寬度;另一個優(yōu)勢是減少了指令數(shù), 極大提升程序的性能. 可采用 Intel Intrinsic 指令集中提供的_mm256_loadu_si256 和store 指令進(jìn)行256 bit 的并行l(wèi)oad/store 操作[19].
優(yōu)化后代碼如代碼1 所示. 這段操作中數(shù)組是char型, SIMD 指令可同時進(jìn)行32 個數(shù)的load/store, 由于數(shù)據(jù)在內(nèi)存和高速緩存是連續(xù)存放的, 可以利用一個緩存行數(shù)據(jù)的空間局部性, 同時指令數(shù)大大減少, 實(shí)測加速比為12.5 倍, 指令數(shù)減少為原來的1/27.
代碼1. Concatenation SIMD 優(yōu)化-訪存寬度增加//before optimization while r < N_codeblocks do for j:= 0 to col step 1 do f_bits[j] := e_bits[j]//after optimization while r < N_codeblocks do for j:= 0 to col step 32 do ymm0 := _mm256_loadu_si256((__m256i *)(e_bits )) _mm256_storeu_si256((_m256i *)&f_bits[k], ymm0) k := k + 32;
1.3.2 位運(yùn)算并行化
通信信息處理過程中的算法很多都是位運(yùn)算的操作, 如CRC 校驗(yàn)算法, 挖掘其背后的并行性對提升程序性能意義重大. 對Scramble 和Generate PRS 模塊可進(jìn)行位運(yùn)算并行化優(yōu)化, 下面以Generate PRS 為例說明. 優(yōu)化前代碼如代碼2 所示.
代碼2. GeneratePRS 位運(yùn)算部分代碼// Generate c for i:= 0 to len step 1 do //x1, x2 分別進(jìn)行低3 位異或, 有效結(jié)果為最后一個bit new_bitl := ((xl >> 3) ^ xl) & 0xl new_bit2 := ((x2 >> 3) ^ (x2 >> 2) ^ (x2 >> 1) ^ x2) & 0xl //x1, x2 分別進(jìn)行最高位數(shù)值更新 xl := (xl >> 1) | (new_bitl << 30) x2 := (x2 >> 1) | (new_bit2 << 30) c[i] := new_bitl ^ new_bit2
這個模塊主要以移位和異或操作為主. 要對這部分操作進(jìn)行并行優(yōu)化, 需要解決兩個問題: (1) 解決數(shù)據(jù)依賴. 存在數(shù)據(jù)依賴意味著每次迭代操作必須串行進(jìn)行, 需要消除依賴, 實(shí)現(xiàn)并行操作; (2) 逐位異或操作.一般的異或操作主要是針對兩個獨(dú)立的變量的, 需實(shí)現(xiàn)位間高效位運(yùn)算的方法.
優(yōu)化分析: (1) 數(shù)據(jù)依賴. 真依賴主要存在于x1/x2兩個變量, 但進(jìn)一步分析發(fā)現(xiàn), 前一次迭代寫的是x2的最高位, 而后一次則讀的是最后4 位, 實(shí)際上并不是真依賴. 本文針對讀寫部分, 分別做并行化. (2) 一個數(shù)字內(nèi)部逐位的異或操作, 采用數(shù)字移位并且對應(yīng)位異或的方式實(shí)現(xiàn). 優(yōu)化后的代碼如代碼3 所示. 由于函數(shù)返回的結(jié)果是res每一個位上的值, 所以需要把res逐位右移以取得最終結(jié)果.
代碼3. Generate 消除數(shù)據(jù)依賴及并行化代碼// Generate c for i := 0 to col step 28 do //一次循環(huán)計算28 個有效bit 數(shù)據(jù), 先計算x1 x13 := xl >> 3 tmpl := xl3 ^ xl //此處和0X7FFFFFFF 做 “與”操作, 而不是0x1 xl := (tmpl << 3 | xl >> 28) & 0X7FFFFFFF //計算x2 x21 := x2 >> 1 x22 := x2 >> 2 x23 := x2 >> 3 tmp2 := x2 ^ x21 ^ x22 ^ x23 x2 := (tmp2 << 3 | x2 >> 28) & 0X7FFFFFFF res := tmpl ^ tmp2 //逐bit 給C 數(shù)組賦值 for j := i to (28 + i) step 1 do c[j] := (res >> j-i) & 0x1
該模塊基本都是位運(yùn)算操作, 指令數(shù)直接決定了執(zhí)行時間, 優(yōu)化之后指令數(shù)變?yōu)樵瓉淼?/2, 性能加速比為2.45 倍.
1.3.3 分支歸零化
分支語句會帶來嚴(yán)重的性能問題. 當(dāng)前CPU 都有分支預(yù)測單元, 如果預(yù)測正確, 則條件語句只花費(fèi)一個CPU 周期, 而如果預(yù)測錯誤, 將可能花費(fèi)幾十個或更多CPU 周期. 所以, 盡可能減少分支語句, 可以加速程序的執(zhí)行時間. 本文對Rate Match 和Modulation 模塊進(jìn)行了分支優(yōu)化, 以下詳細(xì)介紹Modulation 優(yōu)化方法,代碼見代碼4.
代碼4. Modulation 64 種情況的 switch 語句for i := 0 to N_bits step 1 do
? switch bits[i] of case 0: d_re[i] = +3 * 42 d_im[i] = +3 * 42 break case 1: d_re[i] = +3 * 42 d_im[i] = +1 * 42 break … //省略case2, …, case63 的代碼, 均與case1 類似 case 63: d_re[i] = ?7 images/BZ_63_1524_1063_1527_1064.png* 42 d_im[i] = ?7 * 42 break
圖中switch 語句處于循環(huán)體的內(nèi)部, 但不能簡單地將分支語句提出循環(huán)外, 原因在于: (1) 條件判斷變量與迭代變量密切相關(guān); (2) 條件判斷的計算結(jié)果完全是隨機(jī)的, 分支預(yù)測失敗的可能性很高. 所以這部分語句很耗時, 本文采用了查表法來代替分支選擇, 將每一條分支語句都轉(zhuǎn)化成查表語句.
優(yōu)化分析: 該部分代碼中有64 個case, 但經(jīng)分析發(fā)現(xiàn), 雖然case 數(shù)目眾多, 但是每個case 內(nèi)都進(jìn)行的是賦值操作, 并且都是用同樣的常數(shù)賦值, 只有符號位和系數(shù)不同, 所以采用查表法進(jìn)行優(yōu)化.
優(yōu)化后代碼如代碼5 所示. 將每個case 的系數(shù)和符號分別實(shí)現(xiàn)為系數(shù)索引表和符號索引表, switch 部分的判斷操作單獨(dú)計算, 用計算值作為key 索引賦值常數(shù)的系數(shù)和符號表. 經(jīng)過優(yōu)化完全消除了switch 語句, 實(shí)測執(zhí)行時間加速比2.39 倍.
代碼5. Modulation 查表操作優(yōu)化代碼Create symbol array sym_re[0..63] and sym_im[0..63]Create coefficient array con_re[0..63] and con_im[0..63]for i := 0 to N_bits step 1 do //按照索引值, 從符號表和系數(shù)表取對應(yīng)數(shù)值 index := bits[i] d_re[i] := sym_re[k] * con_re[k] * 42 d_im[i] := sym_im[k] * con_im[k] * 42
1.3.4 特征提取優(yōu)化
除了廣為人知的一些優(yōu)化手段外, 還可以結(jié)合程序的具體特征來做優(yōu)化. Rate Match 模塊優(yōu)化前執(zhí)行時間占到總時間的60%. 其性能瓶頸在于: 賦值操作,每次賦值之前都有一個條件判斷, 且判斷條件與迭代變量相關(guān), 該賦值部分代碼如代碼6 所示.
代碼6. Rate Match 耗時長語句while k < N_e_bits do if(rmt_w[(k_0 + j) % N_cb] != TX_NULL_BIT) then e_bits[k++] := rmt_w[(k_0 + j) % N_cb] j:= j+1
優(yōu)化分析: 在該段循環(huán)每執(zhí)行一次賦值操作, 就要做一次if 分支判斷, 判斷rmt_w的值是否為TX_NULL_BIT. 進(jìn)一步對rmt_w數(shù)組進(jìn)行分析發(fā)現(xiàn), 該數(shù)組中最多有31 個值為TX_NULL_BIT, 而整個數(shù)組的長度為將近7 萬, 所以特殊值的比例極小, 對每個數(shù)都檢查一遍開銷很大. 所以本文提出先并行賦值32 個數(shù), 然后對這32 個數(shù)統(tǒng)一進(jìn)行特殊值檢查, 如果包含特殊值,再逐個進(jìn)行賦值, 否則, 就賦值成功. 優(yōu)化后的代碼如代碼7 所示.
代碼7. Rate Match 按照數(shù)據(jù)分布特征優(yōu)化后代碼//申請256 字節(jié)空間, 初始化為特殊值mask := _mm256_setl_epi8(100)while N_e_bits > 32 do //先一次并行拷貝32 個數(shù)據(jù) src := _mm256_loadu_si256((__m256i*) & (rmt_w[(k_0 + j) %N_cb])) //再檢查是否存在特殊值 res := _mm256_testz_si256(mask, src) //如果不存在特殊值 if(res == 1) then //并行賦值32 個數(shù) _mm256_storeu_si256((__m256i *) & (e_bits[k]), src) k := k+32; N_e_bits -=32 else //如果存在特殊值, 逐個檢查并拷貝 for i := 0 to 32 step 1 do if(rmt_w[(k_0 + j) % N_cb] != TX_NULL_BIT) then e_bits[k++] := rmt_w[(k_0 + j) % N_cb] j += 32//剩余不足32 個數(shù)的部分, 按照原方式拷貝
該部分優(yōu)化采用并行賦值操作, 有效減少分支語句, 實(shí)際執(zhí)行指令數(shù)大幅減少, 為原來的1/12, 實(shí)際執(zhí)行時間加速比為14 倍.
1.3.5 延遲加速化
Rate Match 的另一個性能瓶頸是高延遲操作, 該模塊中出現(xiàn)了除法和取模操作(取模操作用到除法部件), 本實(shí)驗(yàn)機(jī)器平臺除法指令延遲為89 個時鐘周期,而普通的加、減和位運(yùn)算指令都是1 個時鐘周期[20],所以非常耗時. 該部分源代碼如代碼8 所示.
代碼8. Rate Match 取模和除法操作代碼?
K pi := R tc sb * C tc sb for i := 0 to K_pi step 1 do pi_idx := (IC_PERM_TC[i / R_tc_sb] + C_tc_sb * (i % R_tc_sb) + 1)% K_pi rmt_w[K_pi + (2 * w_idx) + 1] := rmt_y[pi_idx]?
優(yōu)化分析: 在上述代碼中有兩處取模操作, 一次除法操作. (1) 第2 個取模操作只發(fā)生迭代變量達(dá)到最大的時候, 也就是只有一次計算有用, 所以可以分成0–(K_pi–1), 和K_pi兩種情況. 前一種情況完全省去了取模操作; (2) 除法操作和第1 個取模操作. 可以用兩層循環(huán)來代替, 內(nèi)層循環(huán)的上界為R_tc_sb, 內(nèi)層迭代變量j表示i%R_tc_sb, 外層循環(huán)的上界為K_pi/R_tc_sb–1, 外層迭代變量k表示i/R_tc_sb. 這樣剩下R_tc_sb個數(shù)據(jù)尚未處理, 再分成兩種情況: (1) 0 到(R_tc_sb–1)個數(shù), 可以省去除法和取模操作; (2) 最后一個數(shù), 也是i等于K_pi時, 直接將index為0 時的值作為源數(shù)據(jù)拷貝. 優(yōu)化后的代碼如代碼9 所示. 該優(yōu)化有效去除了除法操作和取模操作, 實(shí)測取得了8 倍性能加速比.
代碼9. 消除取模操作后兩層循環(huán)代碼K pi := R tc sb * C tc sb//取模和除法操作分別由內(nèi)外層循環(huán)變量替代for j:=0 to (C_tc_sb-2) step 1 do for i:=0 to (R_tc_sb-2) step 1 do pi_idx := IC_PERM_TC[j] + C_tc_sb*i + 1 rmt_w[K_pi + (2 * w_idx) + 1] := rmt_y[pi_idx] w_idx ++//處理外層循環(huán)變量的邊界值j := C_tc_sb-1 for i:=0 to (R_tc_sb-2) step 1 do pi_idx := IC_PERM_TC[j] + C_tc_sb*i + 1 rmt_w[K_pi + (2 * w_idx) + 1] := rmt_y[pi_idx] w_idx ++//處理內(nèi)外層循環(huán)迭代變量的邊界值rmt_w[K_pi + (2 * w_idx) + 1] := rmt_y[0]
本文對OpenLTE 物理層下行過程從TB-CRC 到IFFT 的10 個模塊逐個進(jìn)行優(yōu)化, 最終整個下行過程取得2.5 倍加速比, 模塊整體最好取得12.5 倍加速比, 被優(yōu)化部分最好取得26 倍加速比, 數(shù)據(jù)如表1 所示.
表1 OpenLTE 下行過程各模塊優(yōu)化效果總結(jié)
由于通用處理器處理能力的快速發(fā)展, 5G 應(yīng)用由專用處理器轉(zhuǎn)移到通用處理器上. 本文將研究通用處理器上獨(dú)特的參數(shù), 如多核、SMT 和Turbo Boost[21]等對應(yīng)用產(chǎn)生的影響. 通過本文前期實(shí)驗(yàn)驗(yàn)證, 當(dāng)5G應(yīng)用與其他負(fù)載混合執(zhí)行時, 性能會受到不同程度的影響, 所以本文只研究5G 應(yīng)用自身多線程部署時的行為.
本文選用的實(shí)驗(yàn)機(jī)器配置如表2 所示, 測試對象為優(yōu)化后的OpenLTE 程序下行過程. 實(shí)驗(yàn)過程將關(guān)注該過程中每個模塊(函數(shù))的處理時間以及整個應(yīng)用的執(zhí)行時間.
表2 機(jī)器參數(shù)描述 (E5-2620)
[SMT = OFF, Turbo Boost = OFF] 本文將通過改變并發(fā)線程數(shù)的方式來研究應(yīng)用對共享緩存和訪存帶寬的競爭情況. 因?yàn)樘幚砥髦С諷MT, 所以為了避免SMT 對結(jié)果的影響, 本文只在一個核上部署一個線程;同樣為排除Turbo Boost 對程序性能的影響, 關(guān)閉Turbo Boost.
在該場景中, 單個線程可以完成5G 應(yīng)用下行過程物理層的所有處理過程, 增加線程數(shù)是提升了系統(tǒng)的整體并發(fā)量, 而不是將單個任務(wù)拆分為多個可并發(fā)的子任務(wù), 該實(shí)驗(yàn)的目的是分析多個并發(fā)的獨(dú)自處理過程之間的性能干擾情況.
如圖2 所示, 橫軸表示下行過程中的不同模塊, 縱軸表示執(zhí)行時間. 圖中每個模塊從左到右分別表示并發(fā)線程數(shù)從1 到6. 可以看到線程的并發(fā)量逐漸增長到與核數(shù)相同, 單個線程的執(zhí)行時間保持不變.
圖2 不同線程并發(fā)量時各模塊執(zhí)行時間
本文進(jìn)一步測量程序在共享緩存的失效率和訪存帶寬的需求情況. 如圖3 所示, 隨著在同一個CPU 上并發(fā)的線程數(shù)不斷增多, 總訪存帶寬逐漸增多, 但是最多到0.3 GB/s, 而本實(shí)驗(yàn)機(jī)器的訪存峰值帶寬為21.3 GB/s,可見不同線程之間對訪存帶寬的競爭很不激烈. 并且共享緩存的失效率一直很低并且基本不變, 說明應(yīng)用對共享緩存的需求很小, 即使存在多個線程, 彼此也不會爭搶共享緩存.
圖3 不同并發(fā)線程數(shù)總訪存指標(biāo)的變化
總結(jié): 該應(yīng)用的每個線程對共享緩存的需求較小,訪存量很少, 不是訪存密集型的應(yīng)用.
[SMT = ON, Turbo Boost = OFF] 本節(jié)將討論由單個處理器核心支持的多線程對核內(nèi)共享資源的競爭情況. 本文將對比采用SMT 技術(shù)和不采用SMT 技術(shù)的實(shí)驗(yàn)結(jié)果, 由于本文的研究關(guān)注點(diǎn)在一個核心內(nèi)部的資源, 所以只在一個處理器核心活躍的情況下實(shí)驗(yàn), 為避免Turbo Boost 帶來的干擾, 同樣會關(guān)閉Turbo Boost.不采用SMT 的方式, 是兩個線程分別運(yùn)行在兩個不同的物理核上, 稱為Mapping 1; 采用SMT 的方式, 是兩個線程都運(yùn)行在同一個物理核心上, 稱為Mapping 2.
如圖4, 藍(lán)色的柱子表示一個物理核運(yùn)行一個線程, 紅色柱子表示一個物理核運(yùn)行兩個線程, 可以明顯發(fā)現(xiàn)當(dāng)兩個線程同時運(yùn)行在一個物理核上時, 單個線程的執(zhí)行時間明顯變長, 整個過程執(zhí)行時間平均增加60%, Scramble 模塊執(zhí)行時間增加了一倍, 5G 應(yīng)用的SMT 線程之間存在明顯的性能干擾.
圖4 SMT 部署對單線程執(zhí)行時間的影響
接下來將介紹性能干擾的原因. 測量5G 應(yīng)用在執(zhí)行部件上的行為, 需要測量線程總執(zhí)行周期數(shù)和處于阻塞狀態(tài)的時鐘周期數(shù), 這兩個指標(biāo)可以反映程序執(zhí)行期間執(zhí)行部件的繁忙程度, 若處于阻塞狀態(tài)所占時鐘周期數(shù)多, 則代表程序大部分時間都在等待. 本文對單線程和SMT 情況下分別統(tǒng)計UOPS_RETIRED.TOTAL_CYCLES/UOPS_RETIRED.STALL_CYCLES,
這兩個指標(biāo)分別表示該進(jìn)程的微指令無論處于阻塞或者執(zhí)行狀態(tài)的所有的時鐘周期即進(jìn)程的總時鐘周期數(shù),后一個指標(biāo)表示微指令處于阻塞狀態(tài)的時鐘周期數(shù).
如圖5 所示, 只有單線程執(zhí)行時, 處于阻塞狀態(tài)的時鐘周期數(shù)占到總的時鐘周期數(shù)的20%, 表明5G 應(yīng)用是計算較密集的應(yīng)用. 當(dāng)采用SMT 時, 整個應(yīng)用的時鐘周期數(shù)明顯增加, 對比兩個柱子可以看到, 執(zhí)行時間并未有變化, 增加的時鐘周期數(shù)全部來源于阻塞時鐘周期數(shù). 指令被阻塞可能的原因是來自于執(zhí)行部件的競爭, 或者等待來自于緩存的數(shù)據(jù). 所以本文將SMT狀態(tài)下的阻塞時鐘周期數(shù)做了進(jìn)一步分析, 發(fā)現(xiàn)分為四部分: 來自于單線程執(zhí)行狀態(tài)下已有的阻塞、由于等待L1 緩存中的數(shù)據(jù)造成的阻塞、由于等待L2 緩存中的數(shù)據(jù)造成的阻塞以及由于另一個線程占據(jù)執(zhí)行部件而造成的阻塞, 而大部分阻塞都是由于等待另一個線程釋放執(zhí)行部件造成的, 證明5G 應(yīng)用SMT 線程間對執(zhí)行部件的競爭激烈.
圖5 采用SMT 部署執(zhí)行和阻塞部分時鐘周期數(shù)
上述實(shí)驗(yàn)本文論證了5G 應(yīng)用在采用SMT 方式帶來的負(fù)面作用, 接下來將從處理器資源利用率的角度來說明SMT 的好處.
本文從執(zhí)行部件的利用率和吞吐量兩個角度來說明. 如圖6 所示, 在本實(shí)驗(yàn)機(jī)型中, 端口0、1 和5 表示ALU等計算部件, 而端口2、3 和4 則表示訪存部件, 對于5G 應(yīng)用, 計算部件的利用率明顯高于訪存部件, 再次說明這是計算密集型應(yīng)用, 而藍(lán)色柱子表示單線程執(zhí)行時的部件利用率, 而紅色柱子表示SMT 線程執(zhí)行時的部件利用率, 采用SMT 之后, 各部件的利用率都提升.
圖6 采用SMT 部署各部件的利用率
如圖7 所示, 藍(lán)色表示單線程執(zhí)行時, 大部分都是每個時鐘周期執(zhí)行1 條或2 條微指令, 而紅色采用SMT 之后, 每個時鐘周期能同時執(zhí)行3 條或者4 條微指令的比例大幅增加, 大多數(shù)時鐘周期都能執(zhí)行1、2 或3 條微指令, 提升了處理器的吞吐量.
圖7 采用SMT 部署吞吐量的變化
總結(jié): 5G 應(yīng)用計算很密集, 執(zhí)行部件的利用率較高, 不采用SMT 方式時, 5G 應(yīng)用可以占滿所有處理器核心; 采用SMT 方式時, 線程之間性能干擾嚴(yán)重.
[SMT = OFF, Turbo Boost = ON] 本節(jié)將討論即使不存在資源競爭時, 處理器本身的特性——超頻, 對應(yīng)用并發(fā)執(zhí)行時的性能影響, 并且SMT 將關(guān)閉. 超頻對處理器主頻的影響如表3 所示.
表3 Turbo Boost 頻率變化
如圖8, 應(yīng)用執(zhí)行時并發(fā)的線程數(shù)量從1 增加到6,1 或2 個線程并發(fā)執(zhí)行時, 每個線程的執(zhí)行時間最少;3 或4 個線程并發(fā)執(zhí)行時, 每個線程的執(zhí)行時間增加5%; 5 或6 個線程并發(fā)執(zhí)行時, 每個線程的執(zhí)行時間相比單線程執(zhí)行時增加10%. 所以, 雖然線程間對共享資源的競爭不激烈, 由于超頻的作用, 當(dāng)活躍處理器核心數(shù)增多, 每個線程的響應(yīng)時間增加了.
圖8 開啟Turbo Boost 時, 單線程執(zhí)行時間隨活躍處理器核心數(shù)目變化的規(guī)律
本文把打開超頻和不打開超頻的結(jié)果做個對比,如圖9, 前3 種顏色的柱子表示打開超頻, 并行活躍的處理器核心數(shù)為1、3 和5 三種情況, 后一種顏色的柱子表示關(guān)閉Turbo Boost 的結(jié)果, 可以看到關(guān)閉Turbo Boost 之后, 執(zhí)行時間明顯大幅增加, 約增加20%.
圖9 Turbo Boost 對性能的影響程度
結(jié)論. 超頻可以顯著提升應(yīng)用的性能, 但是同時需要注意的問題是, 實(shí)際軟件開發(fā)過程中, 往往測試應(yīng)用的響應(yīng)時間會從單線程開始, 在對應(yīng)用和設(shè)備足夠了解的情況下, 即使能斷定多線程執(zhí)行時, 并發(fā)體之間不會由于資源競爭產(chǎn)生性能干擾, 但由于Turbo Boost 的影響, 多線程執(zhí)行時, 每個線程響應(yīng)時間也會有一定增加, 所以對單線程性能基準(zhǔn)的評定應(yīng)提高要求, 這樣才能保證應(yīng)用在多線程并發(fā)時, 仍然滿足性能要求.
通過對5G 應(yīng)用下行過程物理層全面的分析評估,對應(yīng)用自身特性和并發(fā)執(zhí)行的行為得出的結(jié)論如下:
(1) 應(yīng)用特性. 5G 應(yīng)用下行過程物理層數(shù)據(jù)解析過程是計算密集型的, 對于共享緩存的壓力較小, 實(shí)際占用的訪存帶寬也很小, 對響應(yīng)時間要求極高, 處于微妙級.
(2) 混合執(zhí)行行為及部署建議. 1)不采用SMT, 由于該應(yīng)用是計算密集型的, 執(zhí)行部件的利用率已經(jīng)很高, 兩個線程同時執(zhí)行時, 單個線程被阻塞的時間增加,性能下降了. 2)線程并發(fā)量. 多核多線程執(zhí)行時對共享資源競爭不激烈, 但是同一個核心多線程之間由于競爭執(zhí)行部件性能干擾嚴(yán)重, 所以在不超過核數(shù)時盡量可以多部署線程. 3) Turbo Boost, 可以選擇打開或不打開, 各有利弊. 打開Turbo Boost 時, 程序的性能相對較好, 但是性能會隨著活躍處理器核心數(shù)目變化而不穩(wěn)定, 影響單線程性評測時的基準(zhǔn)的設(shè)定. 不打開Turbo Boost 時, 性能不會隨著活躍處理器核心數(shù)變化而抖動, 但是整體性能一般.
本文結(jié)合體系結(jié)構(gòu)特征分析5G 應(yīng)用執(zhí)行行為, 發(fā)現(xiàn)5G 應(yīng)用下行過程的物理層處理流程是計算密集型的, 最高端口利用率90%, 然后分析應(yīng)用并發(fā)行為, 最后以性能最佳化為目的給出5G 應(yīng)用在數(shù)據(jù)中心部署建議, 應(yīng)用對實(shí)時性要求極其嚴(yán)格, 只能應(yīng)用獨(dú)占機(jī)器執(zhí)行; 計算工作集小, 對內(nèi)存及其子系統(tǒng)壓力小, 不超過處理器物理核數(shù)的情況下可以盡可能多部署線程;SMT 會造成響應(yīng)時間增加60%, 嚴(yán)重影響性能因此不宜采用. 本文還針對開源實(shí)現(xiàn)的OpenLTE 代碼進(jìn)行面向通用處理器特征的優(yōu)化, 設(shè)計并實(shí)現(xiàn)了訪存并行化、位操作并行化、分支歸零化、特征提取優(yōu)化和延遲加速化等優(yōu)化方式, 整體優(yōu)化后加速比為2.5 倍, 單個優(yōu)化基本塊取得最好性能加速比為26 倍. 本文僅針對5G應(yīng)用下行過程的物理層進(jìn)行特征刻畫, 還不能夠全面評估應(yīng)用整體的行為, 后續(xù)將會繼續(xù)對物理層上行鏈路進(jìn)行分析, 從而更加準(zhǔn)確分析應(yīng)用在數(shù)據(jù)中心的行為, 以達(dá)到資源的合理部署, 提升數(shù)據(jù)中心資源利用率.