鐘華明,曾少軍,梁玉楠
(中海石油(中國)有限公司湛江分公司,廣東湛江524057)
DLIS(Digital Log Interchange Standard)[1]格式是Schlumberger公司從1991年開始采用的一種全新的測井數據記錄標準,該標準得到了API(美國石油學會)的批準和推薦使用。該數據格式具有與機器無關、自描述、語義可擴展性以及面向對象的數據結構等特點,便于高效處理大量的測井信息以及相關信息。但是DLIS測井數據格式使用統一的語言描述以及面向對象的數據記錄方法,使其與las、wis等數據格式具有很大的區別,不能夠直接獲得文件數據。同時DLIS的設計格式使其與每一個字節都有具體含義的CLS和XTF格式有很大的區別。在做數據解碼的時采用DLIS解碼流程解碼,該方法采用串行解碼方式,解碼效率往往不高,當文件達到百兆字節以上時,其數據量達到上千萬條,文件解碼時間超過了測井解釋人員可容忍的等待時間[1]。
通過對RP66(Recommended practice 66)文檔進行仔細閱讀和推理,理清DLIS的特點以及內部結構,根據DLIS內部結構的特點分析可并行的結構,并利用目前普遍使用的多核處理器設計了合適的并行解碼算法。
面向對象的數據結構是DLIS的一大特色[2-4],DLIS采用對象數據結構記錄測井信息,包含30多種明確的數據對象,例如數據道對象(Channel Object),幀對象(Frame Object),參數對象(Parameter Object),文件頭對象(File-Header Object),數據源對象(Origin Object)等,這些對象均為字典約束定義對象,具有固定的模板結構屬性。這種面向對象記錄機制,使信息記錄變得更加緊湊,一致性和關聯性更好。
多幀類型是DLIS最顯著的特征。以往的測井數據格式,無論是LIS還是BIT一個文件都只能記錄一種采樣間隔的數據,而DLIS可以將不同儀器所測得的不同采樣間隔的數據通過幀作為索引記錄到同一個文件中。
DLIS使用27種數據代碼來定義和說明每一種數值,每種數據代碼都有明確的碼值、字節名稱、字節長度以及詳細的定義描述標準。因而可以直接使用數值代碼轉換程序來解碼數據,克服了應用平臺的限制。
DLIS采用邏輯格式和物理格式2層格式對數據存儲的方式進行說明[1]。邏輯格式是對測井相關信息以及曲線數據邏輯劃分進行說明,物理格式說明測井數據存儲在物理文件中的比特流。
邏輯格式可以細分為4部分:邏輯文件、邏輯記錄、邏輯記錄段以及可視記錄??梢曈涗浭沁壿嫺袷脚c物理格式之間的接口,每個可視記錄在物理媒介中映射到相應的BIT流中,在邏輯格式中映射到所包含的邏輯記錄段,它可以包含1個或者多個邏輯記錄段。每個邏輯記錄段只包含在1個可視記錄中,它包含了邏輯記錄在物理存儲介質中描述和實現所需的結構,用來在可視記錄中分離不同的邏輯記錄,同時邏輯記錄段是最小的加密邏輯結構體。邏輯記錄將連續的、相關聯的信息包組織在一起,從語義上看,它有2種邏輯組織方式:EFLR(Explicitly-formatted Logical Record)和IFLR(Indirectly-formatted Logical Record)。EFLR是一種自我描述的邏輯記錄,邏輯記錄體的信息格式可以從記錄本身得到。IFLR這種邏輯格式一般記錄的是測井曲線數據,記錄體的數據格式不能直接從記錄本身解碼得到,它必須關聯到相應的EFLR,并利用相應的數值轉換程序才能夠解碼所記錄內容,兩者的關系見圖1。每個邏輯記錄可以包含1個或者多個邏輯記錄段,由邏輯記錄段的Predecessor屬性來判斷邏輯記錄的開始,由Successor屬性字段來判斷邏輯記錄的結束。每個DLIS中包含1個或者多個邏輯文件,每個邏輯文件包含了1個或者多個邏輯記錄,由邏輯記錄FILEHEADER對象標識每個邏輯文件的開始位置。

圖1 邏輯記錄格式關系
物理格式是數據在物理媒介中存放和組織的方式,物理格式可以分為3個互不相關的部分:邏輯格式、不可見信封以及可見信封(見圖2)。

圖2 物理記錄格式
邏輯格式記錄的是可以應用的數據;不可見信封記錄是受到存儲機制控制的,它不能按常規的數據讀寫,它是存儲機制和應用程序之間的控制接口,通過特殊的查詢程序進行訪問??梢娦欧庥涗浀氖菙祿鬟f的信息以及物理格式的定義,但是其記錄的數據不是邏輯記錄的一部分。存儲單元標識SUL(Storage Unit Label)是由ASCII碼字符串組成的可見信封,它是DLIS數據文件的入口,定義了DLIS數據格式的版本號、存儲單元序列號等相關信息,用來標識一個邏輯文件是否跨越多個存儲單元。
隨著計算機硬件的快速發展,多核處理器在PC機上的普及,多核和多線程已經成為應對處理器性能提升中遇到的瓶頸問題的一種可行的方法,多處理器和多核技術已經得到了廣泛應用[5-9]。但是多線程并發編程無論在性能分析還是調度優化一直都存在很高的難度,使多核技術沒有得到更好的應用。針對這個問題,微軟公司的Visual Studio從2010版開始加大了對并行編程的支持,同時引入了Concurrency Visualizer分析工具,在一定的程度上降低了并行性能的分析難度,幫助開發者分析可并行執行的代碼,能夠較好地滿足多核并行計算編程的要求。
每個DLIS包含大量獨立存儲的EFLR和IFLR記錄。EFLR和IFLR都是以對象獨立分離存儲,因此,在設計算法的時候,可以對每個EFLR和IFLR進行并行計算;但實驗發現加速比并不明顯。這是因為不同的EFLR或者IFLR其內部的數據所對應的數據格式不同,在數據解編前,需要映射到相應的數據表示碼,增加了并行通訊的任務量,使解編效率無法提升;同時DLIS的數據體主要使用IFLR來存儲,IFLR含有大量的數據,而且數據的表示碼不同,IFLR的解碼速度直接制約了DLIS解編效率。
IFLR邏輯記錄中保存EFLR記錄FRAME對象中所包含的曲線列表在某一個采樣點的數據記錄;每條曲線在同一采樣點有一維或者多維采樣記錄,即包含一個或者多個采樣數據。同一條曲線所有采樣數據的數據表示碼是相同的,其表示碼和維數可以從EFLR記錄CHANNEL對象中獲取。為了減少程序間的調用及通訊,加快并行解編速度,對IFLR記錄按照曲線拆分,對拆分的曲線并行解碼;結果表明,這種方式實現的并行解碼能夠獲得較好的加速比。

圖3 算法流程圖
圖3為DLIS并行解碼流程圖,根據EFLR和IFLR這2類邏輯記錄中,分離出曲線數據體,對曲線數據體進行劃分并映射到CPU的運算核中,實現并行解碼。
在解編之前,首先根據FRAME對象曲線列表等相關信息對每條曲線數據進行分離,然后根據CHANNEL對象對每條曲線數據進行歸并后并行解碼。DLIS并行解碼采用Visual Studio并行模式庫(PPL)中的parallel_for_each方法實現。算法實現描述見圖4。

圖4 DLIS解編算法描述
實驗環境為Intel core(TM)i7-4710MQ 2.56 GHz CPU,選擇9個不同大小的DLIS文件來測試所設計的并行算法,文件大小從幾兆到200多兆之間,并將該算法運行結果與易朝建、黃政在磁帶數據格式解編方法中提出的DLIS串行解編方法運行結果進行對比。
其加速比計算采用式(1)進行計算,結果見表1。
(1)
式中,sp為加速比;Δtp為本程序運行時間;Δty為易朝建所建立的算法程序所運行時間。

圖5 加速比隨著文件大小變化
從圖5中可見,當文件小于5 MB時,多核CPU并行解編速度并不優于串行解編速度,這是由于在并行解碼的過程中,需要消耗過多的通訊時間,抵消了并行運算帶來的優勢,降低了解碼效率。當文件大于5 MB后,其解編的加速比隨著文件的大小不斷加大,當文件大小趨200 MB時,加速比趨近2。

表1 算法運行加速比
因此,當文件很大的時候,并行解編速度比串行解編快近一倍,減少用戶等待時間。
基于多核CPU加速DLIS并行解碼方法在生產中的應用結果表明,當DLIS文件小于5 MB,采用串行解碼方式能夠獲得更快的解碼速度,優于并行解碼;當DLIS文件大小大于5 MB,多核CPU并行解碼方法遠優于串行解碼方法,并隨著DLIS文件大小增加,加速比快速增大,并趨于2。因此,當DLIS文件較大時,采用基于多核CPU加速DLIS并行解碼方法能夠獲得較好的效果,在一定程度滿足用戶對解碼響應的需求。