工業(yè)軟件研發(fā)中處理超大模型(5)--求解器通用篇 工業(yè)軟件研發(fā)中處理超大模型(6)--有限元求解器 在以前的文章中稍微介紹了一下工業(yè)軟件中超大文件的處理方法,本文再系統(tǒng)的介紹的一些通用的處理方法。閱讀對象主要定位于軟件研發(fā)人員。 常用術(shù)語: 文本格式:基于字節(jié)編碼,即可以使用類似記事本打開,可以明文編輯的文件格式 二進(jìn)制格式:基于值的編碼,使用記事本打開是亂碼,無法編輯,按數(shù)值定義字節(jié)保存長度 工程文件:工業(yè)軟件自定義的文件格式 幾何文件:常用的CAD數(shù)據(jù)文件,比如*.step, *.igs, *.x_t, *.jt,*.dxf等 渲染文件:用于顯示的數(shù)據(jù)文件,比如VTK數(shù)據(jù) 網(wǎng)格文件:常用作求解器計(jì)算的輸入文件,比如*.bdf, *.inp,*.cas,*.cdb等 結(jié)果文件:仿真之后用于保存結(jié)果的文件 中間文件:在軟件使用過程中保存的臨時(shí)文件,通常不對用戶開放 序列化和反序列化:通俗講就是將內(nèi)存中的數(shù)據(jù)以二進(jìn)制保存(序列化)和加載(反序列化) 在軟件研發(fā)中,最容易生成超大文件的幾個(gè)數(shù)據(jù)
處理超大模型文件的一些策略: 策略一:避免使用B-Rep幾何數(shù)據(jù) 空間中任意一個(gè)長方形,使用參數(shù)描述,只需要兩個(gè)頂點(diǎn)+旋轉(zhuǎn)平移矩陣數(shù)據(jù)即可表達(dá),而使用B-Rep至少需要200行的拓?fù)?幾何數(shù)據(jù)文件存儲。對于幾何造型要求不高的幾何數(shù)據(jù),盡量使用參數(shù)描述,而不要使用B-Rep。比如建筑里的實(shí)體框架結(jié)構(gòu),給出框架每個(gè)結(jié)點(diǎn)坐標(biāo)和柱的截面長寬,即可表達(dá)。做框架整體結(jié)構(gòu)分析主要以桿梁索單元為主,不太需要實(shí)體結(jié)構(gòu)。類似,IC設(shè)計(jì)中的走線,通過線的轉(zhuǎn)彎節(jié)點(diǎn)和走線寬度高度或截面(梯形)即可定義,不需要復(fù)雜的實(shí)體結(jié)構(gòu)。實(shí)際測試表明,使用參數(shù)存儲三維結(jié)構(gòu)數(shù)據(jù)文件,其大小通常只有B-Rep結(jié)構(gòu)的5%-10%,甚至更少。 策略二:使用二進(jìn)制格式代替文本格式 二進(jìn)制格式的讀寫性能要好于文本格式,這種性能提升在超大模型讀寫時(shí)非常明顯?,F(xiàn)在固態(tài)硬盤的讀寫速率已經(jīng)達(dá)到了500M/秒,所以在硬件讀寫上基本沒有太大瓶頸,性能瓶頸主要在數(shù)據(jù)讀取之后的處理上。 文本格式的好處是,如果使用壓縮算法存儲,壓縮比可以非常高,在一些有傳輸瓶頸的場景有優(yōu)勢,比如網(wǎng)絡(luò)傳輸(百度如何傳輸400T)。隨著存儲硬件越來越便宜,在實(shí)際應(yīng)用中,大文件存儲并不是太大的問題,而文件的讀寫性能是比較關(guān)注的。 策略三:內(nèi)存映射文件 內(nèi)存映射文件,是由一個(gè)文件到一塊內(nèi)存的映射。內(nèi)存映射文件與虛擬內(nèi)存有些類似,通過內(nèi)存映射文件可以保留一個(gè)地址空間的區(qū)域,同時(shí)將物理存儲器提交給此區(qū)域,內(nèi)存文件映射的物理存儲器來自一個(gè)已經(jīng)存在于磁盤上的文件,不需要再對文件執(zhí)行I/O操作,從而解決內(nèi)存開銷,讀寫瓶頸等問題。但正如所講,硬盤讀寫本身性能問題不大。因此內(nèi)存映射主要解決了大模型讀過程中內(nèi)存開銷,CPU占用過高等問題。Boost庫提供了Interprocess來進(jìn)行內(nèi)存映射,內(nèi)存共享等操作。 策略四:分治并行 在一篇文章入門仿真軟件性能優(yōu)化一文中提到了分治是提升性能最常用的方式,在文件處理中體現(xiàn)在兩方面:1.盡可能把大數(shù)據(jù)按照不同屬性放在分散的幾個(gè)大小接近的文件中,最常見的比如把網(wǎng)格文件中的節(jié)點(diǎn)數(shù)據(jù)和單元放在兩個(gè)文件里;2.讀同一個(gè)文件時(shí),統(tǒng)一讀取之后使用多線程分塊解析,正如前所說,文件讀入性能并不在硬盤讀取而是在數(shù)據(jù)解析上。為了最大化分治并行,在文件結(jié)構(gòu)設(shè)計(jì)上,相同或類似的屬性盡可能放在一起,文件內(nèi)容上,盡可能減少數(shù)據(jù)冗余度。 策略五:保存幾何和渲染映射數(shù)據(jù) 在三維幾何超大模型的加載和顯示中,性能瓶頸主要體現(xiàn)在三個(gè)方面:1.三維數(shù)據(jù)的創(chuàng)建;2.三維數(shù)據(jù)的三角化;3.三角化數(shù)據(jù)的渲染。如果能夠保存幾何和渲染映射數(shù)據(jù)到文件,下次打開文件直接加載該數(shù)據(jù)??梢员苊馍鲜鋈坎僮?,大大加快模型數(shù)據(jù)加載。 策略六:數(shù)據(jù)輕量化 數(shù)據(jù)輕量化本質(zhì)上是把大模型數(shù)據(jù)中不需要或不重要的部分去掉,或者把原始數(shù)據(jù)轉(zhuǎn)成另外一種輕量級的格式。對于軟件來說,任何從外部導(dǎo)入的數(shù)據(jù)都需要變成軟件內(nèi)部的數(shù)據(jù)格式,在這個(gè)過程中,可以根據(jù)業(yè)務(wù)做輕量化。在對結(jié)果數(shù)據(jù)處理時(shí)也可以有類似操作。 以結(jié)構(gòu)仿真結(jié)果為例,比如有限元模型有1億的節(jié)點(diǎn),應(yīng)力一般需要計(jì)算最大最小和一般應(yīng)力,XYZ方向也要單獨(dú)顯示,業(yè)務(wù)需求還要MISES,等效應(yīng)力等,應(yīng)變,位移也類似。單個(gè)節(jié)點(diǎn)上的結(jié)果數(shù)據(jù)以double值計(jì)算大概要20-30億。這種規(guī)模數(shù)據(jù)量使用常規(guī)的計(jì)算顯示方式是無法實(shí)現(xiàn)的,所以需要從業(yè)務(wù)上進(jìn)行數(shù)據(jù)輕量化。比如對結(jié)果平滑部分進(jìn)行合并處理;實(shí)體單元只顯示表面數(shù)據(jù);單個(gè)結(jié)果拆分成多個(gè)文件;在不影響性能情況下適當(dāng)采用壓縮算法等。 策略七:避免文件操作過程中的計(jì)算 超大模型的讀寫過程中加入計(jì)算邏輯,會進(jìn)一步影響性能。最常見的是這種網(wǎng)格結(jié)構(gòu)定義: 網(wǎng)格類型 網(wǎng)格節(jié)點(diǎn)1 網(wǎng)格節(jié)點(diǎn)2 網(wǎng)格節(jié)點(diǎn)3 ... 這種設(shè)計(jì)根據(jù)類型來讀寫后面的數(shù)據(jù),表面看起來具有統(tǒng)一的設(shè)計(jì),方便實(shí)現(xiàn),但在實(shí)際應(yīng)用中大模型會產(chǎn)生嚴(yán)重性能瓶頸。理想的做法是將某一類型的數(shù)據(jù)作為一個(gè)屬性單獨(dú)操作。上述設(shè)計(jì)改成: 策略八:規(guī)范研發(fā)流程 這個(gè)屬于非技術(shù)。以往經(jīng)驗(yàn)表明,研發(fā)中對于文件讀寫的都是各自為戰(zhàn),且寫法各異,有用流,有用c風(fēng)格,也有使用第三方庫的,而每種寫法也都有各自的使用方法。在文件小的時(shí)候都能實(shí)現(xiàn)各自功能,問題不大,但文件大一些之后,有些就容易出現(xiàn)bug和瓶頸。所以規(guī)范研發(fā)流程,討論清楚每種方法的利弊和使用場景,將文件讀寫統(tǒng)一規(guī)范使用。 筆者處理過的最大的單個(gè)文件在40G左右,如果您有更好的超大模型文件處理經(jīng)驗(yàn),也歡迎留言。 |
|