欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

詭異的精度diff追查-創(chuàng)新互聯(lián)

一、Query-diff測(cè)試發(fā)現(xiàn)的問(wèn)題

10年積累的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有長(zhǎng)葛免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

Query-diff是檢索端常用的測(cè)試方法,其思想是使用一組相同的檢索信息分別請(qǐng)求一個(gè)系統(tǒng)或模塊的基線版本和待測(cè)版本。通常,基線版本和待測(cè)版本只存在少量差異(程序功能/配置等)。發(fā)送請(qǐng)求后,比較兩個(gè)版本返回的檢索結(jié)果,從而驗(yàn)證差異是否對(duì)最終計(jì)算結(jié)果造成了影響。

詭異的精度diff追查

本case中的被測(cè)模塊A由C++編寫(xiě),輸出的核心數(shù)據(jù)為一個(gè)單精度浮點(diǎn)數(shù),記為Q。

在A模塊某次升級(jí)后執(zhí)行query-diff測(cè)試時(shí),發(fā)現(xiàn)Q值存在精度diff,比例約為1%,大diff在小數(shù)萬(wàn)分位,而該次升級(jí)預(yù)期是無(wú)diff的。

二、深入追查

   通常出現(xiàn)diff,首先要明確追查的方向,如果一眼看不出原因,就需要使用排除法來(lái)逐個(gè)驗(yàn)證懷疑對(duì)象,縮小范圍,減小不必要的精力投入。于是列出了兩大排查方向:環(huán)境或程序。

先看環(huán)境:

l 在環(huán)境現(xiàn)場(chǎng)仔細(xì)檢查了新舊環(huán)境的配置和詞表,符合預(yù)期,排除了環(huán)境搭建工具的因素。

l 由于此次升級(jí)是前向兼容的,將新舊環(huán)境的配置和詞表統(tǒng)一,重新測(cè)試,diff復(fù)現(xiàn),排除了配置差異的因素。

環(huán)境似乎沒(méi)有問(wèn)題,再來(lái)驗(yàn)證程序:

l 因已做了多組測(cè)試,驗(yàn)證結(jié)果沒(méi)有改變,排除了隨機(jī)策略diff的可能。

l 打印debug日志,檢查了處理過(guò)程中的每一步中間結(jié)果,均無(wú)問(wèn)題,只在計(jì)算Q值的最后環(huán)節(jié)出現(xiàn)了diff,相繼排除了線程臟數(shù)據(jù),進(jìn)程級(jí)cache臟數(shù)據(jù),變量類型轉(zhuǎn)換等風(fēng)險(xiǎn)點(diǎn)。

l 為徹底確認(rèn),直接將新舊環(huán)境里的程序都替換為新版本,重新測(cè)試,如果真是程序所致,應(yīng)當(dāng)無(wú)diff。然而,diff復(fù)現(xiàn)了!明明沒(méi)有隨機(jī)diff的啊?!!

此時(shí)排查到了瓶頸,環(huán)境和程序的原因似乎都不對(duì)。

冷靜下來(lái)重新思考,之前的排查分別把環(huán)境的概念解釋為使用的配置和詞表,認(rèn)為兩者相同,環(huán)境就相同。這是片面的,環(huán)境的含義還應(yīng)當(dāng)包含系統(tǒng)和硬件的編譯環(huán)境和運(yùn)行環(huán)境。于是有了新的驗(yàn)證思路:

l  新舊版本的程序都使用公司的云編譯集群產(chǎn)出,應(yīng)當(dāng)沒(méi)有問(wèn)題,不過(guò)為防止想當(dāng)然,還是認(rèn)真檢查了編譯參數(shù)并在本地相同機(jī)器重新編譯了新舊版本,確認(rèn)diff復(fù)現(xiàn),排除編譯因素;

l 將新舊環(huán)境拷貝到同一臺(tái)機(jī)器,重壓請(qǐng)求,diff消失!確認(rèn)為運(yùn)行環(huán)境因素

   運(yùn)行環(huán)境包括操作系統(tǒng)和硬件層面,趁熱打鐵,繼續(xù)追查:

l 確認(rèn)出現(xiàn)diff的兩臺(tái)機(jī)器操作系統(tǒng)一致,均為centos 4.3,排除了操作系統(tǒng);

l 硬盤(pán)和內(nèi)存的型號(hào)差異造成diff的可能性較小,暫不驗(yàn)證;

l 新環(huán)境所在機(jī)器cpu版本Xeon E5645,舊環(huán)境所在機(jī)器cpu版本 Xeon E5-2620,懷疑cpu型號(hào)不同所致,另找了一臺(tái)與舊環(huán)境cpu一致的機(jī)器部署新環(huán)境,重新測(cè)試,diff消失,目標(biāo)鎖定cpu。

詭異的精度diff追查

三、揭開(kāi)真相

 分析cpu,在簡(jiǎn)單排除了核數(shù),大線程數(shù),一二三級(jí)緩存的嫌疑后,cpu特性列表中的指令集差異引起了我的注意。

詭異的精度diff追查

補(bǔ)充知識(shí)一:cpu指令集的作用

指令集是存儲(chǔ)在CPU內(nèi)部,對(duì)CPU運(yùn)算進(jìn)行指導(dǎo)和優(yōu)化的硬程序。擁有這些指令集,CPU就可以更高效地運(yùn)行。為解釋指令集的優(yōu)化方式,得提到兩種技術(shù):SISD(單指令單數(shù)據(jù))和SIMD(單指令多數(shù)據(jù))。

以加法指令為例,使用SISD的CPU對(duì)加法指令譯碼后,執(zhí)行部件先訪問(wèn)內(nèi)存,取得第一個(gè)操作數(shù),之后再一次訪問(wèn)內(nèi)存,取得第二個(gè)操作數(shù),后才能進(jìn)行求和運(yùn)算。而在使用SIMD的CPU中,指令譯碼后幾個(gè)執(zhí)行部件同時(shí)訪問(wèn)內(nèi)存,一次性獲得所有操作數(shù)進(jìn)行運(yùn)算。這個(gè)特點(diǎn)使SIMD特別適合于數(shù)據(jù)密集型運(yùn)算。

Cpu指令集中的SSE系列和AVX用于浮點(diǎn)數(shù)運(yùn)算,而AVX正是兩個(gè)cpu的差異之一,嫌疑很大。現(xiàn)在需要找到程序使用AVX進(jìn)行優(yōu)化的證據(jù)。

可是,在ASQ模塊中并沒(méi)有直接優(yōu)化的代碼邏輯,涉及Q值計(jì)算的程序中雖然調(diào)用了靜態(tài)libA的接口,而libA的代碼也未使用指令集。不過(guò),libA聯(lián)編了靜態(tài)libB,于是一路往底層追查,查到編譯依賴的第四層,是IDL提供的libX,代碼保密無(wú)法查看。

只好向相關(guān)RD請(qǐng)教,RD告知libX中確實(shí)使用了SSE指令優(yōu)化,以及Intel提供的數(shù)學(xué)函數(shù)庫(kù)MKL,卻沒(méi)有用到AVX。

詭異的精度diff追查

難道又是條走不通的死路?抱著最后一點(diǎn)希望,查詢了MKL在intel官方的介紹發(fā)現(xiàn)意外收獲,MKL中引入了AVX優(yōu)化!

詭異的精度diff追查

現(xiàn)在還差最后一步,得確認(rèn)AVX就是diff來(lái)源的元兇。很快,在intel的產(chǎn)品手中找到了進(jìn)一步的證據(jù)。

詭異的精度diff追查

AVX2中的FMA指令,在矩陣乘法、點(diǎn)積、多項(xiàng)式評(píng)估等涉及浮點(diǎn)數(shù)運(yùn)算方面的效率和精度相對(duì)以往的指令集都有所提升,因?yàn)镕MA可以將乘法與累加操作一次性完成。官方論壇里也找到了相關(guān)技術(shù)人員的帖子佐證:

補(bǔ)充知識(shí)二:計(jì)算機(jī)中浮點(diǎn)數(shù)存儲(chǔ)方式詭異的精度diff追查

    float和double在存儲(chǔ)方式上都是遵從IEEE的規(guī)范的,float遵從的是IEEE R32.24 ,而double 遵從的是R64.53。

   無(wú)論是單精度還是雙精度在存儲(chǔ)中都分為三個(gè)部分:

1. 符號(hào)位(Sign) : 0代表正,1代表為負(fù)

2. 指數(shù)位(Exponent):用于存儲(chǔ)科學(xué)計(jì)數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲(chǔ)

3. 尾數(shù)部分(Mantissa):尾數(shù)部分

其中float的存儲(chǔ)方式如下表所示:

詭異的精度diff追查

硬件層面上,cpu的浮點(diǎn)運(yùn)算邏輯都是放在FPU(浮點(diǎn)運(yùn)算單元)上實(shí)現(xiàn)的(無(wú)論SSE還是AVX),F(xiàn)PU的默認(rèn)計(jì)算精度是80bit,而SSE和AVX輸出的float精度沒(méi)那么高(均為32bit),如果FPU中計(jì)算精度存在差異(前提是均大于32bit),計(jì)算輸出時(shí)截?cái)酁?2bit再存入內(nèi)存,必然會(huì)因近似截?cái)嘣斐山Y(jié)果diff。

由于intel底層算法保密,只能猜測(cè)AVX和SSE的優(yōu)化函數(shù)實(shí)現(xiàn)時(shí)設(shè)置的FPU精度有所不同,但精度差異的結(jié)論是確定的。

此時(shí)真相已浮出水面:AVX的FMA相比SSE精度上多1bit,存在迭代計(jì)算時(shí),差異將會(huì)累計(jì)。而Q值的產(chǎn)生經(jīng)歷復(fù)雜的矩陣運(yùn)算,這個(gè)微小的1bit差異被放大至小數(shù)點(diǎn)萬(wàn)分位。同時(shí),Intel保證了各機(jī)器的兼容性,MKL的代碼在不支持AVX的cpu上運(yùn)行時(shí)會(huì)被降級(jí)為SSE。

補(bǔ)充知識(shí)三:使用SSE和AVX優(yōu)化程序的方法

仍以加法指令為例,對(duì)于相關(guān)頭文件的引入和編譯指令相關(guān)準(zhǔn)備此處不進(jìn)行介紹,可參考相關(guān)資料。

基本版:

簡(jiǎn)單地循環(huán)累加求和。

詭異的精度diff追查

SSE優(yōu)化版

SSE寄存器128bit,16字節(jié),一次可以存4個(gè)單精度浮點(diǎn)數(shù),可以每4個(gè)一組存入寄存器,使用內(nèi)置加法函數(shù)求和,之后再對(duì)4個(gè)分組和進(jìn)行相加,最后加上分組剩余的幾項(xiàng),得到最終結(jié)果。

詭異的精度diff追查

AVX優(yōu)化版

AVX優(yōu)化方式與SSE類似,但AVX寄存器使用256bit,32字節(jié),可以存8個(gè)單精度浮點(diǎn)數(shù),需要每8個(gè)float一組存入寄存器。

詭異的精度diff追查

現(xiàn)在隨機(jī)生成輸入數(shù)組,撰寫(xiě)簡(jiǎn)單的測(cè)試用例,就可以驗(yàn)證優(yōu)化的效果了,以下是三種算法的性能比較,單位為每秒可累加float的數(shù)量。結(jié)果中,SSE效率提升到普通版的4倍,而AVX是8倍!

詭異的精度diff追查

四、總結(jié)和啟示

問(wèn)題總結(jié):

l Query-diff兼容性測(cè)試時(shí)發(fā)現(xiàn)模塊A新舊版本計(jì)算出的Q值存在diff;

l 排查后,確定精度diff來(lái)自程序因運(yùn)行環(huán)境cpu支持的浮點(diǎn)數(shù)指令集差異(AVX/SSE)

l 該case中diff占比和絕對(duì)值均較小,目前雖不至影響線上服務(wù),但若算法進(jìn)一步復(fù)雜,diff積累至百分位,便會(huì)導(dǎo)致策略失效。

l 其他模塊的浮點(diǎn)數(shù)運(yùn)算若用到指令集優(yōu)化,也需要排查是否相同問(wèn)題。

解決方案:

    l 分配測(cè)試資源時(shí),保證新舊環(huán)境所在機(jī)器cpu一致;

    l 執(zhí)行query-diff前加入環(huán)境檢查機(jī)制,再次確認(rèn)硬件無(wú)差異;

    l 線上部署服務(wù)時(shí),也需要確定機(jī)器支持AVX指令集,達(dá)到性能和精度最優(yōu);

    l 排查其他模塊是否有類似使用指令集優(yōu)化的情況,提前規(guī)避風(fēng)險(xiǎn)。

啟發(fā)和建議:

    l 浮點(diǎn)數(shù)運(yùn)算密集型程序可考慮使用SSE/AVX等指令集函數(shù)優(yōu)化性能,通常可顯著提高運(yùn)行效率(SSE:4倍,AVX:8倍);

    l 使用指令集時(shí)注意控制迭代使用的次數(shù)(即將指令集函數(shù)的輸出再次作為指令集函數(shù)的輸入),避免精度diff累積到不容忽視的程度;

    l 可以將query-diff測(cè)試應(yīng)用到更多的兼容性測(cè)試場(chǎng)景中,如比較CPU,操作系統(tǒng),基礎(chǔ)庫(kù)等底層系統(tǒng)和硬件差異對(duì)應(yīng)用程序的影響。

軟件工程離不開(kāi)硬件的支持,編譯、運(yùn)行環(huán)境的差異都有可能造成服務(wù)性能的差別和最終計(jì)算結(jié)果的差別。此類問(wèn)題,在開(kāi)發(fā)、測(cè)試、上線各個(gè)階段都需要特別注意。做一個(gè)“軟硬結(jié)合”的程序員很重要!

參考資料:

【1】     https://software.intel.com/zh-cn/articles/whats-new-in-intel-mkl

【2】     https://software.intel.com/zh-cn/articles/intel-xeon-processor-e7-88004800-v3-product-family-technical-overview

【3】     https://software.intel.com/en-us/forums/topic/507004

【4】     http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html

百度MTC是業(yè)界領(lǐng)先的移動(dòng)應(yīng)用測(cè)試服務(wù)平臺(tái),為廣大開(kāi)發(fā)者在移動(dòng)應(yīng)用測(cè)試中面臨的成本、技術(shù)和效率問(wèn)題提供解決方案。同時(shí)分享行業(yè)領(lǐng)先的百度技術(shù),作者來(lái)自百度員工和業(yè)界領(lǐng)袖等。

>>如有問(wèn)題,歡迎與我溝通

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁(yè)標(biāo)題:詭異的精度diff追查-創(chuàng)新互聯(lián)
當(dāng)前URL:http://chinadenli.net/article26/edhjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站云服務(wù)器品牌網(wǎng)站制作用戶體驗(yàn)外貿(mào)網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名