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