




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
VCB-Studio教程19AVS的多線程優化-MPP的使用作為一個十幾年前設計的程序,avs的多線程和內存管理可謂是一團糟。avs原生沒有任何的多線程優化:source=LWLVS(“”)#輸入片源(#后面的表示注釋,不影響avs的運行)denoise=source.RemoveGrain(20)#對片源降噪repaired=denoise.Repair(source,1)#將降噪后的視頻,對比片源修復一些細節這個簡單的avs腳本用了3個濾鏡。假設你的CPU有4個核心(假設沒有超線程),3個濾鏡中只有RemoveGrain在濾鏡設計的時候有多線程優化:source=LWLVS(“”)只會在核心1里面跑;denoise=source.RemoveGrain(20)會在4個核心跑;repaired=denoise.Repair(source,1)也只會在核心1里面跑,跟LWLVS共用一個核心。這三個濾鏡,后面的依賴前面的。最后腳本的效率由跑的最慢的濾鏡決定。可想而知,瓶頸容易出現在source和repaired兩個上面。這兩個濾鏡被擠在一個線程里面,效率堪憂。如果三個濾鏡都只能單線程跑,整個腳本等于只能用到cpu的一個線程。這是avs的一個弱點:缺乏原生多線程優化機制。另外,濾鏡之間的工作,需要幀的緩存:source=LWLVS(“”)讀入片源第0幀,記錄在內存里,記為Adenoise=source.RemoveGrain(20)拿過A幀,算出第0幀降噪后的內容,記為Brepaired=denoise.Repair(source,1)拿過A和B,算出修復后的內容。可見,要讓這個腳本正常運轉,A和B兩個緩存必不可少。事實上,除了這種濾鏡間需要緩存,濾鏡本身計算也要緩存。對于時域濾鏡,經常需要讀取當前幀前后的內容,就需要緩存更多的幀。問題是,如果在第二步結束,準備計算第三步,緩存A就被扔了呢?avs就不得不這么做:先把B存好了;然后重新執行步驟1,得出A。這時候,LWLVS這個濾鏡就被重復執行了。重復計算的幀對于效率的浪費是很嚴重的。avs的緩存是自動管理的。默認情況下,avs會開銷1GB的內存(你可以用setMemoryMax()修改,但是原生32bit的avs最多只能4GB(如果在32bit系統下,只能用到2GB/3GB)。歷史遺留問題導致我們現在沒辦法安全用64bit的avs)。4GB對于高級腳本來說捉襟見肘,導致的后果就是緩存不夠,大量幀被迫要被重復計算。(并且avs本身需要占用一些內存,實際可用濾鏡內存一般不建議超過3GB)于是我們尋求一個解決方案,能讓我們利用更多的緩存,以及手動給一些中間步驟足夠多的緩存,讓下游濾鏡在調用的時候不必重復計算。本教程講述如何用MP_Pipeline實現三個目的:avs濾鏡間的多線程優化更多內存控制和開銷手動管理部分重要的緩存1.MPP原理解釋——流水線運行多個avs對于多線程和內存,一個可行的想法是多開:第一個avs運行LWLVS,輸出source第二個avs可以接過source,運行RemoveGrain,輸出denoise,并傳遞source第三個avs可以接過source和denoise,運行Repair三個avs模塊,每個都在獨立的進程里面運行,都可以有高達4GB的可用緩存。這樣就優化了一些多線程的占用,也增加了內存的可用度。下面只需要規定緩存了:上游的模塊丟給下游足夠的預存。在每個avs結束的時候,規定輸出的clip緩存數量。MPP干的就是這些事情。
2.MPP語法演示把上面的avs用MPP寫出來:MP_Pipeline(“””###inheritstart###RamUsage=1.0###inheritend###SetMemoryMax(min(3000,500*RamUsage))Source=LWLibavVideoSource(“xxx.mp4”,threads=1)###exportclip:source###prefetch:48,32######SetMemoryMax(min(3000,3000*RamUsage))denoise=source.RemoveGrain(20)###exportclip:denoise###passclip:source###prefetch:16,8######SetMemoryMax(min(3000,3000*RamUsage))denoise.Repair(source,1)“””)用MPP優化的avs,所有的內容一定是包裹在MP_Pipeline(“””“””)里面的。注意引號是英文格式下的引號。######(中間有個空格)代表分隔符。如上文所示,兩個分隔符將整個avs分成了3個模塊(block)。###inheritstart###和###inheritend###中間的代碼,是每個block通用的變量或者指令。比如這次我們設置了一個RamUsage的變量,來指定全局內存分配量。###exportclip:clip1,clip2,clip3代表這個模塊向下游輸出哪些clip。這些clip一定是當前模塊最新生成的。比如上文中,第一個模塊輸出了source,第二個模塊輸出了denoise。當前模塊生成的,需要向下游傳遞的,都需要用exportclip來傳遞。每個block的last是自動export的;適用下文的prefetch。###passclip:clip1,clip2,clip3代表這個模塊向下游傳遞哪些clip。這些clip是更上游的模塊丟來的,當前模塊不做改動,直接丟下去。比如上文中,第二個模塊原封不動的傳遞了source###prefetch:x,y表示當前block輸出的clip,設置怎樣的強制緩存(x>y)。具體x,y如何設置,我們后文再說。
3.MPP中內存設置每個模塊,你可以用SetMemoryMax()來指定使用的內存數量。單位是MB比如SetMemoryMax(3000)表示允許使用3000MB的內存內存的設置,一般是視模塊的復雜度而定。越是復雜的模塊,含有的組合濾鏡越多(比如SMDegrain,QTGMC等大型組合濾鏡),就適合給越多的內存。如果是本身開銷比較小的(比如f3dkb,RemoveGrain)濾鏡居多,那就可以少給一點。在64bit的系統上,使用32bit的avs,最大可以開到3500左右。同時,MPP本身需要一些額外的開銷。所以avs部分占據內存,差不多是你設置的內存數量總和的110%。對于16GB的內存,avs的開銷不建議超過10GB。因為本身x264和系統還需要占據相當數量的內存。這導致復雜的avs很容易爆內存。一個簡單的調節方式是,加一個宏觀的控制變量RamUsage:.這個變量默認是100%,可以調大也可以調小.每個block的內存占用,是一個你覺得合適的預設值*RamUsage.每個block的內存占用不超過3000把以上自然語言用數學語言表示,就是:每個block的內存分配=預設值*RamUsage&3000MB中較小的一個所以上文的avs我們采用的寫法是SetMemoryMax(min(3000,500*RamUsage))。這種寫法的好處在于,如果你覺得內存總體分配的太多或者太少,你可以通過調節RamUsage來一鍵調整內存分配。
4.MPP中緩存設置prefetch:x,y是MPP中設置緩存的。因為avs的濾鏡并非是一幀一幀的順序處理,而是可能需要用到前后多幀,所以緩存的設置就格外重要。如果請求的幀不在緩存內,意味著這一幀需要被重新計算。對于在avs中出現的每一個clip,它都是會被請求的。要么它作為輸出的clip,被輸出請求,要么它參與濾鏡運算,被下游濾鏡請求。MPP的緩存機制是,如果一個clip在某個block被export,并且block設置了prefetch:x,y,那么對這個clip被請求的位置,前后共緩存x幀(加上被請求的位置就是x+1幀),其中,向后(這里向后意味著時間較早的幀,也是在編碼過程中更早被處理的幀)緩存y幀。越是在上游的block,輸出的幀,向后緩存的就需要越多,因為下游的處理是滯后的。如果下游需要請求上游的幀,就需要保留較大的緩存。所以y的設置,一般就是需要覆蓋下游所有的請求。也就是說,上游的y需要比下游的x來的大。這樣上游的向后緩存就可以照顧到下游所有緩存的需求。既然總共緩存x幀,向前緩存的數量就是x-y。這個值通常取值8左右比較合理;可以照顧絕大多數的時域濾鏡,和block間的性能緩存。如何設置一套優秀的緩存結構卻是有經驗公式的。假設從上到下,Block的輸出分別是:prefetch:xs,ys(這是第一個block輸出源的prefetch)prefetch:xn,yn(這是第二個block輸出的prefetch)prefetch:xn-1,yn-1(這是第三個block輸出的prefetch)prefetch:xn-2,yn-2(這是第四個block輸出的prefetch)……prefetch:x1,y1(這是倒數第二個block輸出的prefetch)最后一個block無需prefetch,因為它是直接交給avs主進程運行;所有MPP的指令(prefetch,exportclip,passclip)無效。怎么設置比較科學呢:x1,y1=16,8x2,y2=26,18x3,y3=36,28……xn,yn=xn-1+10,xn-1+2xs,ys=xn+32,xn+16(源block的輸出最好給非常大的緩存。你還可以給的更大一點)
5.MPP使用時候的一些調試經驗1、將開頭結尾的MP_Pipeline(“””和“””)用#注釋掉,就可以完全取消MPP的添加。剩下的avs腳本就相當于是一個沒有MPP的腳本(那些prefetch之類的因為是###開頭,也會被認為是注釋)。所以在調試的時候可以先取消MPP架構調試;否則MPP的緩存機制會讓在大量隨機取樣的調試變得十分緩慢且吃內存。2、如果一個clip是由某個速度黑洞濾鏡產生的,那么這個clip一旦被重新計算,代價就很高。這時候最好將濾鏡單獨放一個block,并且設置exportclip
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商平臺數據保護場保密協議
- 滄州商務辦公租賃合同范本
- 循環經濟與智慧零碳產業園的融合發展
- 教學方法的創新與學生接受度研究
- 提升患者體驗醫院服務優化策略
- 提升游客體驗的機場安保改進措施
- 提升旅游餐飲顧客滿意度的策略
- 提升團隊效能的領導力培養
- 小學英語語法教學中的前置性評價策略與實踐
- 教育信息化背景下教師的導師制探索與實踐
- 骨科護理實習生小講課
- 2025至2030年中國金剛石繩鋸行業市場運行格局及前景戰略分析報告
- 云南省昆明市五華區2023-2024學年八年級下學期7月期末物理試題(含答案)
- 2025年上海市研發公共服務平臺管理中心招聘題庫帶答案分析
- 工程保險課件
- 2025年新高考1卷(新課標Ⅰ卷)語文試卷(含答案)
- 金融公司干股協議書
- 2025益陽事業單位筆試真題
- 2025年初中地理學業水平考試(八年級)模擬卷【內蒙古專用】(含解析)
- 2025年江蘇南京河西新城區國有資產經營控股集團招聘筆試參考題庫含答案解析
- 《足外傷的護理》課件
評論
0/150
提交評論