天天看點

x265探索與研究(八):x265中的并行處理機制函數關系分析x265探索與研究(八):x265中的并行處理機制函數關系分析

        hevc的高計算複雜度如果僅僅依賴于單核處理器計算能力的提高,其代價是非常昂貴的,為此,hevc的設計充分考慮到了并行計算的需求。x265不同于hm(hevc

test model),x265将并行計算發揮地更加淋淋盡緻。在main()函數中,為了完成多線程計算,讀完24幀輸入幀後才開始編碼的原因也基于此。

        為了理清x265中的并行處理機制,首先給出了如下圖的并行處理函數關系圖:

x265探索與研究(八):x265中的并行處理機制函數關系分析x265探索與研究(八):x265中的并行處理機制函數關系分析

        經過前面幾篇文章的分析,我們知道main()函數主要調用了encoder_open()函數、encoder_headers()函數、encoder_encode()函數與encoder_close()函數。其中:

(1)encoder_encode()函數調用了encode()函數,而encode()函數中調用了startcompressframe()函數,在startcompressframe()函數中,采用m_enable.trigger完成了觸發線程的功能;

(2)encoder_open()函數調用了encoder_create()函數,在encoder_create()函數中等待線程的初始化并進入threadmain()函數中等待線程的觸發,線程一旦觸發則調用compressframe函數進行進一步地編碼工作。

        這兩步的協調工作完美地成就了多線程的實作。為了進一步分析hevc的并行處理機制,接下來首先分析視訊編碼的并行處理相關技術,然後依次分析該函數關系圖中較為重要的startcompressframe()函數、encoder_create()函數以及threadmain()函數。

        并行處理一般指許多指令得以同時進行的處理模式,通常分為兩種:功能并行和資料并行。

(1)功能并行是指将應用程式劃分成互相獨立的功能子產品,每個子產品間可以并行地執行,這種并行方式也稱為流水線型并行,它将各個獨立的子產品劃分給不同的運算單元,各個子產品之間通過流的方式來進行資料交換和通信,最終再将各個單元串接在一起。功能并行充分利用了時間上的并行性來獲得加速的效果,比較适合于硬體實作。功能并行的缺點是很明顯的,a、由于配置設定給不同運算單元的功能子產品是不同的,是以很容易産生載荷失衡問題;b、功能并行還需要在不同運算單元間進行資料通信,當資料量較大時,需要花費額外的資源來進行存儲;c、另外,功能并行的擴充性較差。

(2)資料并行是将資料資訊劃分為互相獨立的部分,每一部分交給不同的運算單元來執行,進而實作并行處理。在這種方式下,不同運算單元上執行的程式是相同的,而且處理的是互相獨立的資料資訊,是以不需要進行運算單元間的通信;資料并行也具有較好的擴充性,易于軟體實作。

        hevc/h.265提供了适用于進行資料并行處理的結構單元,如片和tile,在不同的片和tile中,資料資訊是互相獨立的,這樣有利于将其配置設定給不同的運算單元來處理;對于小于片和tile的劃分單元,hevc支援波前并行處理(wavefront

parallel processing, wpp),這是對于互相具有依賴關系的圖像單元進行資料并行處理的方法。在hevc中,并行處理技術主要包括:基于tile的并行和波前并行兩種。在進行基于tile的并行時,由于tile的互相獨立性,不需要考慮它們之間的互相依賴關系,而在進行波前并行處理時,資料間的互相依賴關系是必不可少的。

        startcompressframe()函數的主要功能就是觸發線程,對應的代碼分析如下:

        encoder_create()函數的主要功能是檢測線程池、可用的線程數目等等,若線程使用的條件符合則調用threadmain()函數,對應的代碼分析如下:

        threadmain()函數相當于線程函數的main()函數,其主要功能就是在完成線程觸發後等待處理,在此處,調用了compressframe()函數。

        對應的代碼分析如下: