鐘華明,曾少軍,梁玉楠
(中海石油(中國(guó))有限公司湛江分公司,廣東湛江524057)
DLIS(Digital Log Interchange Standard)[1]格式是Schlumberger公司從1991年開始采用的一種全新的測(cè)井?dāng)?shù)據(jù)記錄標(biāo)準(zhǔn),該標(biāo)準(zhǔn)得到了API(美國(guó)石油學(xué)會(huì))的批準(zhǔn)和推薦使用。該數(shù)據(jù)格式具有與機(jī)器無(wú)關(guān)、自描述、語(yǔ)義可擴(kuò)展性以及面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)等特點(diǎn),便于高效處理大量的測(cè)井信息以及相關(guān)信息。但是DLIS測(cè)井?dāng)?shù)據(jù)格式使用統(tǒng)一的語(yǔ)言描述以及面向?qū)ο蟮臄?shù)據(jù)記錄方法,使其與las、wis等數(shù)據(jù)格式具有很大的區(qū)別,不能夠直接獲得文件數(shù)據(jù)。同時(shí)DLIS的設(shè)計(jì)格式使其與每一個(gè)字節(jié)都有具體含義的CLS和XTF格式有很大的區(qū)別。在做數(shù)據(jù)解碼的時(shí)采用DLIS解碼流程解碼,該方法采用串行解碼方式,解碼效率往往不高,當(dāng)文件達(dá)到百兆字節(jié)以上時(shí),其數(shù)據(jù)量達(dá)到上千萬(wàn)條,文件解碼時(shí)間超過(guò)了測(cè)井解釋人員可容忍的等待時(shí)間[1]。
通過(guò)對(duì)RP66(Recommended practice 66)文檔進(jìn)行仔細(xì)閱讀和推理,理清DLIS的特點(diǎn)以及內(nèi)部結(jié)構(gòu),根據(jù)DLIS內(nèi)部結(jié)構(gòu)的特點(diǎn)分析可并行的結(jié)構(gòu),并利用目前普遍使用的多核處理器設(shè)計(jì)了合適的并行解碼算法。
面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)是DLIS的一大特色[2-4],DLIS采用對(duì)象數(shù)據(jù)結(jié)構(gòu)記錄測(cè)井信息,包含30多種明確的數(shù)據(jù)對(duì)象,例如數(shù)據(jù)道對(duì)象(Channel Object),幀對(duì)象(Frame Object),參數(shù)對(duì)象(Parameter Object),文件頭對(duì)象(File-Header Object),數(shù)據(jù)源對(duì)象(Origin Object)等,這些對(duì)象均為字典約束定義對(duì)象,具有固定的模板結(jié)構(gòu)屬性。這種面向?qū)ο笥涗洐C(jī)制,使信息記錄變得更加緊湊,一致性和關(guān)聯(lián)性更好。
多幀類型是DLIS最顯著的特征。以往的測(cè)井?dāng)?shù)據(jù)格式,無(wú)論是LIS還是BIT一個(gè)文件都只能記錄一種采樣間隔的數(shù)據(jù),而DLIS可以將不同儀器所測(cè)得的不同采樣間隔的數(shù)據(jù)通過(guò)幀作為索引記錄到同一個(gè)文件中。
DLIS使用27種數(shù)據(jù)代碼來(lái)定義和說(shuō)明每一種數(shù)值,每種數(shù)據(jù)代碼都有明確的碼值、字節(jié)名稱、字節(jié)長(zhǎng)度以及詳細(xì)的定義描述標(biāo)準(zhǔn)。因而可以直接使用數(shù)值代碼轉(zhuǎn)換程序來(lái)解碼數(shù)據(jù),克服了應(yīng)用平臺(tái)的限制。
DLIS采用邏輯格式和物理格式2層格式對(duì)數(shù)據(jù)存儲(chǔ)的方式進(jìn)行說(shuō)明[1]。邏輯格式是對(duì)測(cè)井相關(guān)信息以及曲線數(shù)據(jù)邏輯劃分進(jìn)行說(shuō)明,物理格式說(shuō)明測(cè)井?dāng)?shù)據(jù)存儲(chǔ)在物理文件中的比特流。
邏輯格式可以細(xì)分為4部分:邏輯文件、邏輯記錄、邏輯記錄段以及可視記錄??梢曈涗浭沁壿嫺袷脚c物理格式之間的接口,每個(gè)可視記錄在物理媒介中映射到相應(yīng)的BIT流中,在邏輯格式中映射到所包含的邏輯記錄段,它可以包含1個(gè)或者多個(gè)邏輯記錄段。每個(gè)邏輯記錄段只包含在1個(gè)可視記錄中,它包含了邏輯記錄在物理存儲(chǔ)介質(zhì)中描述和實(shí)現(xiàn)所需的結(jié)構(gòu),用來(lái)在可視記錄中分離不同的邏輯記錄,同時(shí)邏輯記錄段是最小的加密邏輯結(jié)構(gòu)體。邏輯記錄將連續(xù)的、相關(guān)聯(lián)的信息包組織在一起,從語(yǔ)義上看,它有2種邏輯組織方式:EFLR(Explicitly-formatted Logical Record)和IFLR(Indirectly-formatted Logical Record)。EFLR是一種自我描述的邏輯記錄,邏輯記錄體的信息格式可以從記錄本身得到。IFLR這種邏輯格式一般記錄的是測(cè)井曲線數(shù)據(jù),記錄體的數(shù)據(jù)格式不能直接從記錄本身解碼得到,它必須關(guān)聯(lián)到相應(yīng)的EFLR,并利用相應(yīng)的數(shù)值轉(zhuǎn)換程序才能夠解碼所記錄內(nèi)容,兩者的關(guān)系見圖1。每個(gè)邏輯記錄可以包含1個(gè)或者多個(gè)邏輯記錄段,由邏輯記錄段的Predecessor屬性來(lái)判斷邏輯記錄的開始,由Successor屬性字段來(lái)判斷邏輯記錄的結(jié)束。每個(gè)DLIS中包含1個(gè)或者多個(gè)邏輯文件,每個(gè)邏輯文件包含了1個(gè)或者多個(gè)邏輯記錄,由邏輯記錄FILEHEADER對(duì)象標(biāo)識(shí)每個(gè)邏輯文件的開始位置。
圖1 邏輯記錄格式關(guān)系
物理格式是數(shù)據(jù)在物理媒介中存放和組織的方式,物理格式可以分為3個(gè)互不相關(guān)的部分:邏輯格式、不可見信封以及可見信封(見圖2)。
圖2 物理記錄格式
邏輯格式記錄的是可以應(yīng)用的數(shù)據(jù);不可見信封記錄是受到存儲(chǔ)機(jī)制控制的,它不能按常規(guī)的數(shù)據(jù)讀寫,它是存儲(chǔ)機(jī)制和應(yīng)用程序之間的控制接口,通過(guò)特殊的查詢程序進(jìn)行訪問(wèn)。可見信封記錄的是數(shù)據(jù)傳遞的信息以及物理格式的定義,但是其記錄的數(shù)據(jù)不是邏輯記錄的一部分。存儲(chǔ)單元標(biāo)識(shí)SUL(Storage Unit Label)是由ASCII碼字符串組成的可見信封,它是DLIS數(shù)據(jù)文件的入口,定義了DLIS數(shù)據(jù)格式的版本號(hào)、存儲(chǔ)單元序列號(hào)等相關(guān)信息,用來(lái)標(biāo)識(shí)一個(gè)邏輯文件是否跨越多個(gè)存儲(chǔ)單元。
隨著計(jì)算機(jī)硬件的快速發(fā)展,多核處理器在PC機(jī)上的普及,多核和多線程已經(jīng)成為應(yīng)對(duì)處理器性能提升中遇到的瓶頸問(wèn)題的一種可行的方法,多處理器和多核技術(shù)已經(jīng)得到了廣泛應(yīng)用[5-9]。但是多線程并發(fā)編程無(wú)論在性能分析還是調(diào)度優(yōu)化一直都存在很高的難度,使多核技術(shù)沒(méi)有得到更好的應(yīng)用。針對(duì)這個(gè)問(wèn)題,微軟公司的Visual Studio從2010版開始加大了對(duì)并行編程的支持,同時(shí)引入了Concurrency Visualizer分析工具,在一定的程度上降低了并行性能的分析難度,幫助開發(fā)者分析可并行執(zhí)行的代碼,能夠較好地滿足多核并行計(jì)算編程的要求。
每個(gè)DLIS包含大量獨(dú)立存儲(chǔ)的EFLR和IFLR記錄。EFLR和IFLR都是以對(duì)象獨(dú)立分離存儲(chǔ),因此,在設(shè)計(jì)算法的時(shí)候,可以對(duì)每個(gè)EFLR和IFLR進(jìn)行并行計(jì)算;但實(shí)驗(yàn)發(fā)現(xiàn)加速比并不明顯。這是因?yàn)椴煌腅FLR或者IFLR其內(nèi)部的數(shù)據(jù)所對(duì)應(yīng)的數(shù)據(jù)格式不同,在數(shù)據(jù)解編前,需要映射到相應(yīng)的數(shù)據(jù)表示碼,增加了并行通訊的任務(wù)量,使解編效率無(wú)法提升;同時(shí)DLIS的數(shù)據(jù)體主要使用IFLR來(lái)存儲(chǔ),IFLR含有大量的數(shù)據(jù),而且數(shù)據(jù)的表示碼不同,IFLR的解碼速度直接制約了DLIS解編效率。
IFLR邏輯記錄中保存EFLR記錄FRAME對(duì)象中所包含的曲線列表在某一個(gè)采樣點(diǎn)的數(shù)據(jù)記錄;每條曲線在同一采樣點(diǎn)有一維或者多維采樣記錄,即包含一個(gè)或者多個(gè)采樣數(shù)據(jù)。同一條曲線所有采樣數(shù)據(jù)的數(shù)據(jù)表示碼是相同的,其表示碼和維數(shù)可以從EFLR記錄CHANNEL對(duì)象中獲取。為了減少程序間的調(diào)用及通訊,加快并行解編速度,對(duì)IFLR記錄按照曲線拆分,對(duì)拆分的曲線并行解碼;結(jié)果表明,這種方式實(shí)現(xiàn)的并行解碼能夠獲得較好的加速比。
圖3 算法流程圖
圖3為DLIS并行解碼流程圖,根據(jù)EFLR和IFLR這2類邏輯記錄中,分離出曲線數(shù)據(jù)體,對(duì)曲線數(shù)據(jù)體進(jìn)行劃分并映射到CPU的運(yùn)算核中,實(shí)現(xiàn)并行解碼。
在解編之前,首先根據(jù)FRAME對(duì)象曲線列表等相關(guān)信息對(duì)每條曲線數(shù)據(jù)進(jìn)行分離,然后根據(jù)CHANNEL對(duì)象對(duì)每條曲線數(shù)據(jù)進(jìn)行歸并后并行解碼。DLIS并行解碼采用Visual Studio并行模式庫(kù)(PPL)中的parallel_for_each方法實(shí)現(xiàn)。算法實(shí)現(xiàn)描述見圖4。
圖4 DLIS解編算法描述
實(shí)驗(yàn)環(huán)境為Intel core(TM)i7-4710MQ 2.56 GHz CPU,選擇9個(gè)不同大小的DLIS文件來(lái)測(cè)試所設(shè)計(jì)的并行算法,文件大小從幾兆到200多兆之間,并將該算法運(yùn)行結(jié)果與易朝建、黃政在磁帶數(shù)據(jù)格式解編方法中提出的DLIS串行解編方法運(yùn)行結(jié)果進(jìn)行對(duì)比。
其加速比計(jì)算采用式(1)進(jìn)行計(jì)算,結(jié)果見表1。
(1)
式中,sp為加速比;Δtp為本程序運(yùn)行時(shí)間;Δty為易朝建所建立的算法程序所運(yùn)行時(shí)間。
圖5 加速比隨著文件大小變化
從圖5中可見,當(dāng)文件小于5 MB時(shí),多核CPU并行解編速度并不優(yōu)于串行解編速度,這是由于在并行解碼的過(guò)程中,需要消耗過(guò)多的通訊時(shí)間,抵消了并行運(yùn)算帶來(lái)的優(yōu)勢(shì),降低了解碼效率。當(dāng)文件大于5 MB后,其解編的加速比隨著文件的大小不斷加大,當(dāng)文件大小趨200 MB時(shí),加速比趨近2。
表1 算法運(yùn)行加速比
因此,當(dāng)文件很大的時(shí)候,并行解編速度比串行解編快近一倍,減少用戶等待時(shí)間。
基于多核CPU加速DLIS并行解碼方法在生產(chǎn)中的應(yīng)用結(jié)果表明,當(dāng)DLIS文件小于5 MB,采用串行解碼方式能夠獲得更快的解碼速度,優(yōu)于并行解碼;當(dāng)DLIS文件大小大于5 MB,多核CPU并行解碼方法遠(yuǎn)優(yōu)于串行解碼方法,并隨著DLIS文件大小增加,加速比快速增大,并趨于2。因此,當(dāng)DLIS文件較大時(shí),采用基于多核CPU加速DLIS并行解碼方法能夠獲得較好的效果,在一定程度滿足用戶對(duì)解碼響應(yīng)的需求。