本發(fā)明涉及視頻分析領域,更具體的,涉及一種基于線程級流水線的視頻分析加速方法。
背景技術:
視頻分析技術已經廣泛應用于安防領域,視頻分析中存在著大量的圖像數據處理導致效率低下,隨著高清攝像頭的普及,對視頻分析系統(tǒng)進行性能優(yōu)化很有必要。近年來大多數優(yōu)化技術都是利用GPU處理視頻分析中的復雜計算,將復雜計算模塊的串行算法轉化為并行算法,利用GPU進行并行計算。然而CPU和GPU是兩種不同架構的處理器,采用單純的GPU優(yōu)化方法,CPU和GPU由于計算所需時間不同常常相互等待,造成計算資源浪費,無法確保CPU、GPU達到最佳的利用率,無法充分發(fā)揮異構平臺的計算能力。
技術實現要素:
針對現有加速技術的不足,本發(fā)明要解決的技術問題是克服現有加速方法對CPU、GPU計算資源利用率不足的缺點,提出一種基于線程級流水線的視頻分析加速方法,有效利用異構系統(tǒng)中各種計算資源,建立合理的任務調度機制,降低不同處理器之間的通信開銷,以充分發(fā)揮各計算資源的計算能力,提高系統(tǒng)效率。
一種視頻分析加速方法,具體為:
將視頻幀處理任務按先后順序劃分為四級子任務,第一級對應視頻幀解碼子任務TC1,第二級對應顏色空間轉換子任務TC2和運動目標檢測及后處理子任務TG1,第三級對應目標提取子任務TC3,第四級對應目標跟蹤與目標識別子任務TC4,其中,運動目標檢測及后處理TG1在GPU處理,其它子任務在CPU處理;
每一級子任務用一個線程實現,處理完畢后將數據傳遞給下一級子任務所在線程,各線程并行執(zhí)行;當沒有新的任務或下一級子任務所在線程沒有處理完畢時,就暫停等待;
相鄰兩級子任務線程之間使用先進先出FIFO緩沖區(qū)隊列傳遞數據,為每個子任務設有一個輸入隊列InputQueue和一個輸出隊列OutputQueue,本級子任務的InputQueue是上一級子任務的OutputQueue,本級子任務的OutputQueue是下一級子任務的InputQueue;
對不存在依賴關系的顏色空間轉換子任務TC2和運動目標檢測及后處理子任務TG1,利用CUDA的函數異步調用實現CPU和GPU子任務的異步協同并行。
進一步地,對在GPU上處理的子任務,利用CUDA編程設計實現該子任務的GPU并行處理,GPU中各個核函數產生的中間結果直接存儲在GPU的設備存儲器中,不拷貝到主機內存,僅僅將最終結果拷貝到主機內存,同時利用CUDA的流并行使CPU、GPU間的數據傳輸與核函數執(zhí)行重疊。
進一步地,所述輸入隊列InputQueue和輸出隊列OutputQueue隊列均開辟有兩個空間,分別存儲奇、偶視頻幀的處理后圖像數據,每個子任務線程根據當前視頻幀號的奇偶讀取InputQueue隊列中相應的存儲空間或者向OutputQueue隊列中相應的存儲空間寫數據。
本發(fā)明的有益效果體現在:
本發(fā)明有效利用異構系統(tǒng)中各種計算資源,建立合理的任務調度機制,降低不同處理器之間的通信開銷,以充分發(fā)揮各計算資源的計算能力,提高系統(tǒng)效率。應用本發(fā)明對高清視頻的處理,CPU利用率相對簡單的GPU加速提高了一倍左右,GPU利用率提高了約25%,最終系統(tǒng)的處理速度提高了一倍。1080P的高清視頻處理速度可以達到130幀/s,720P的高清視頻處理速度可以達到240幀/s。
附圖說明
圖1是視頻分析的處理過程圖;
圖2是根據各子任務間的依賴關系構造的DAG圖;
圖3是CUDA異步模式下CPU與GPU并行處理流程圖;
圖4是線程流水線框架中子任務線程的處理流程圖;
圖5是視頻分析的四級流水線示意圖;
圖6是視頻分析流水線中子任務線程對緩沖區(qū)讀寫流程圖。
具體實施方式
為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個實施方式中所涉及到的技術特征只要彼此之間未構成沖突就可以相互組合。
圖1是視頻分析的處理過程圖.本發(fā)明方法包括以下步驟:
將視頻分析任務劃分為多個子任務,以TC1TC2TC3TC4表示CPU任務編號,TG1表示GPU任務標號,將系統(tǒng)劃分為以下子任務:
TC1:視頻解碼;
TC2:顏色空間的轉換;
TG1:運動目標檢測及后處理(GPU);
TC3:目標提??;
TG1:目標跟蹤與目標識別;
其中,運動目標檢測及其后處理TG1在GPU上進行計算,其余子任務在CPU上進行處理。
運動目標檢測可采用ViBe算法,運動目標后處理的膨脹腐蝕處理可采用VHGW算法,濾波可采用中值濾波。
根據各子任務的依賴關系構造DAG圖如圖2所示。圖中虛線部分的兩個分支表示沒有依賴關系的兩個任務分支,也就是說CPU中顏色空間的轉化任務TC2和GPU中的運動目標檢測及其后處理任務TG1可以并行執(zhí)行。
對所得DAG圖中不存在依賴關系的CPU和GPU子任務,CUDA程序中的內存拷貝函數和核函數采用CUDA異步調用模式進行調用,可以在調用內存拷貝函數和GPU核函數后,不等函數執(zhí)行完成立即返回,從而使得CPU和GPU可以并行工作。CPU、GPU異步并行的執(zhí)行流程如圖3所示,在CPU解碼得到一幀圖像數據之后,利用CUDA的函數異步調用方式調用數據傳輸函數和核函數,之后函數立馬返回,CPU開始進行顏色空間轉換的計算,同時GPU進行運動目標檢測及其后處理的計算,CPU和GPU都執(zhí)行完成后,將GPU的計算結果拷貝回主機內存由CPU進行下一步計算。
利用CUDA設計實現運動目標檢測及其后處理的GPU并行算法,根據GPU存儲器模型特點、GPU計算特點對CUDA程序進行存儲器優(yōu)化、指令優(yōu)化。在該子任務中,各個核函數產生的結果直接存儲在GPU的設備存儲器中,不拷貝到主機內存,僅僅將最終結果拷貝到主機內存,同時利用CUDA的流并行使CPU、GPU間的數據傳輸與核函數執(zhí)行重疊,達到隱藏數據傳輸延遲的目的。
參考指令流水線的架構,本發(fā)明設計實現線程流水線框架。線程流水線框架包括四個要素:
(1)任務(Task)。任務類型相當于指令流水線中的指令,代表流水線系統(tǒng)中需要處理的對象,該對象作為模板參數傳入流水線,之后流水線的處理都是針對這類任務進行的。
(2)子任務(SubTask)。每個任務拆分為多個獨立的子任務,每個子任務由一個線程負責,多個子任務線程串行處理同一個任務,錯位并行處理不同的任務。當一個任務在所有的子任務線程中都執(zhí)行一遍后,才算處理完一個任務。
(3)緩沖區(qū)隊列(Queue)。用來在各個子任務線程之間傳遞數據的是先進先出(FIFO)緩沖區(qū)隊列,每個子任務都有一個InputQueue和OutputQueue,并且其InputQueue是流水線的上一個子任務的OutputQueue,其OutputQueue是流水線的下一個子任務的InputQueue。子任務線程依次從InputQueue獲取數據,進行處理,處理完畢后將生成的數據放入OutputQueue,等待下一個子任務線程處理。當沒有新的任務或后面的線程沒有處理完畢時,就暫停等待。
(4)流水線(PipeLine)。一個流水線中有一個或多個子任務線程,各線程可以并行執(zhí)行,對同一個任務串行處理。當所有的任務執(zhí)行完成后這個流水線才會結束。
每一個子任務用一個線程來實現,把這些線程按照流水線的方式連接,就可以構成一個基于線程的任務流水線。在線程流水線中每個線程專職一個子任務,處理完畢后將數據傳遞給下一個線程處理,當沒有新的任務或后面的線程沒有處理完畢時,就暫停等待。各子任務線程之間是一種典型的生產者消費者關系,維護可以設定大小的生產者消費者緩沖區(qū)隊列(Queue)。相鄰兩個子任務線程之間的同步用一對信號量sem_full和sem_empty實現,sem_empty表示空緩沖區(qū)的數目,其初始值為緩沖區(qū)隊列的大小,sem_full用來表示滿緩沖區(qū)的數目,其初始值為0。子任務線程的處理流程如圖4所示。
基于線程流水線框架,本發(fā)明將每一幀處理作為一個任務,將每一幀的處理任務劃分為5個子任務,用五個工作線程分別處理五個子任務,將系統(tǒng)設計為四級流水線。特殊的是,四級流水線中包含五個子任務,其中流水線的第二級包含兩個子任務TC2和TG1,同一幀中兩個子任務TC2和TG1可以分別在CPU和GPU中進行并行處理,所以將這兩個子任務設計為流水線的同一級,五個子任務組成的四級線程流水線如圖5所示。對視頻每一幀的視頻分析處理流程為:(1)采用CPU執(zhí)行第一級的視頻幀解碼子任務TC1;(2)采用CPU執(zhí)行第二級的顏色空間轉換子任務TC2,采用GPU執(zhí)行第二級的運動目標檢測及后處理子任務TG1,利用CUDA的函數異步調用實現CPU和GPU子任務的異步協同并行;(3)采用CPU執(zhí)行第三級的目標提取子任務TC3;(4)采用CPU執(zhí)行第四級的目標跟蹤與目標識別子任務TC4。對視頻的連續(xù)多幀按照上述方式進行流水線處理。
為了提高各線程間大量圖像數據交換的效率,本發(fā)明采用如下緩沖區(qū)策略:
(1)不拷貝數據到本地,消費線程直接使用緩沖區(qū)隊列內的數據。這樣相當于消費線程直接使用生產線程的輸出數據,節(jié)省了數據拷貝的時間。
(2)雙緩沖機制。不使用數據拷貝必然要在相鄰兩工作線程間使用雙緩沖機制,即相鄰的兩個子任務線程間的緩沖區(qū)中設置FIFO隊列,FIFO隊列開辟有兩個空間,分別存儲奇、偶視頻幀的處理后圖像數據,每個子任務線程根據當前視頻幀號的奇偶讀取InputQueue隊列中相應的存儲空間或者向OutputQueue隊列中相應的存儲空間寫數據。視頻分析子任務線程緩沖區(qū)讀寫流程如圖6所示。
本領域的技術人員容易理解,以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內所作的任何修改、等同替換和改進等,均應包含在本發(fā)明的保護范圍之內。