天天看點

關于實作Halcon算法加速的基礎知識(1)(多核并行/GPU)

一、提高Halcon的運算速度,有以下幾種方法:

1、Multithreading(多線程)

2、Automatic Parallelization(自動操作并行化)

3、Compute devices,利用GPU提速,如果顯示卡性能好,至少可以提高5~10倍的運算速度

關于實作Halcon算法加速的基礎知識(1)(多核并行/GPU)

二、多線程

1、官方自帶的例程get_operator_info.hdev,可以檢視支援多線程的算子;

* Determine the multithreading information

get_multithreading_operators (TypeExclusive, TypeMutual, TypeReentrant, TypeIndependent)

* 自定義函數展開之後,有get_operator_info算子

* get names of all operators of the library

get_operator_name ('', OperatorNames)

get_operator_info (OperatorNames[Index], 'parallelization', Information)

2、官方的手冊

C:\Program Files\MVTec\HALCON-19.11-Progress\doc\pdf\manuals\programmers_guide.pdf

Chapter 2 Parallel Programming and HALCON

C:\Program Files\MVTec\HALCON-19.11-Progress\doc\pdf\reference\reference_hdevelop.pdf

Chapter 25 System --- 25.6 Multithreading

三、多核并行

看看官方的說明,關于HALCON-多核性能:

1、算子自動并行化(AOP)

Automatic Operator Parallelization (AOP)

多核和多處理器的計算機顯著提升了計算機視覺系統的速度。八年多以來,HALCON提供了通過工業驗證的算子并行化,能很好地支援這種速度的提升。當然,并不是全部的視覺操作都能受益于并行化這種方式。是以,HALCON的智能算法可以确定是否需要用并行化方式——會考慮到具體的算法,算法的輸入值和硬體條件。

并行HALCON在多核計算機上會自動将資料,比如圖像資料配置設定給多個線程,每一個線程對應一個核心。使用者甚至不需要改動已有的HALCON程式來就能使用自動劃分功能,進而立即獲得顯著的速度提升。

2、并行程式設計

HALCON支援并行程式設計,如多線程的程式。它不僅僅是線程安全的而且可多次調用。是以多個線程可在同一時刻同時調用HALCON算子。利用這種特性,使用者可以将一個機器視覺應用軟體分解成多個獨立的部分,讓它們在不同的處理器上并行運作。

在一個四核的計算機上運作算子,HALCON會自動将圖像分為四部分,由四個線程并行處理。

在一個包含兩個Quad-Core Intel Xeon E5345,2.33 GHz在内的計算機上使用median_image算子(13×13的模闆)對1280×1024的圖像進行濾波操作時,根據使用CPU核的數量的不同,加速因子分别為*1/1.96/2.90/3.79/4.51/5.48/6.34/6.93。注意:可以達到的最高加速因子與所用的HALCON算子和圖像大小有關。

3、AOP預設是激活的

(1)Halcon一方面提供自動操作員并行化(AOP)和手動并行化的手段。另一方面,對應用程式部分進行程式設計。自動操作員并行化(AOP)将輸入資料(例如圖像)分割成多個部分并進行處理資料部分獨立且并行。這也稱為資料并行化。

預設情況下,AOP是激活的,即這種類型的并行化是自動完成的,在許多情況下您不會至少對于單個操作員而言,必須關心進一步的資料并行化。有關AOP的詳細資訊,請參見programmers_guide.pdf,第2.1節。

來自官方例程query_system_parameters.hdev

* Parallelization

get_system ('processor_num', ProcessorNum)

get_system ('thread_pool', ThreadPool)

get_system ('thread_num', ThreadNum)

*Automatic Operator Parallelization,預設值是true

get_system ('parallelize_operators', AOP)

*這個修飾符用于把函數定義為可重入函數,預設值是true;所謂可重入函數就是允許被遞歸調用的函數

get_system ('reentrant', Reentrant)

*故意關掉測試性能

*set_system('parallelize_operators','false')

(2)Halcon還提供了optimize_aop算子,用于優化aop,提高性能。

預設情況下(即不使用optimize_aop算子),Halcon使用AOP的最大可用線程數,最多使用處理器數量。但是,根據傳遞給運算符的資料大小和參數集,最大線程數上的并行化可能會過度且效率低下。 optimize_aop根據線程号優化AOP,并針對HALCON運算符的并行處理檢查給定的硬體。這樣,它将檢查每個運算符,可以通過在tuple元組,channel通道或domain level域級别(不考慮the partial level部分級别)上的自動并行化來加快操作速度。每個檢查的運算符都将執行幾次(依次和并行),并帶有一組不斷變化的輸入參數值/圖像。後者有助于評估操作員的輸入參數特征(例如,輸入圖像的大小)與其并行處理效率之間的依賴性。根據操作員參數的設定,這可能要花費幾個小時。對于正确的優化,至關重要的是不要在計算機上同時運作任何其他計算密集型應用程式,因為這會嚴重影響硬體檢查的時間測量,進而導緻錯誤的結果。

詳情參見官方例程optimize_aop.hdev

4、檢視支援AOP的算子

自動并行化方法,為了實作運算符的自動并行化,HALCON利用資料并行性,即操作員的輸入資料可以彼此獨立地進行處理。資料并行性可以在四個位置找到。官方自帶的例程get_operator_info.hdev,可以檢視;

(1)tuple level      (2)channel level      (3)domain level      (4)internal data level

* Determine the parallelization method of all parallelized operators

get_parallel_method_operators (SplitTuple, SplitChannel, SplitDomain, SplitPartial, None)

AutoParallel := [SplitTuple,SplitChannel,SplitDomain,SplitPartial]

AutoParallel := uniq(sort(AutoParallel))

get_operator_info (OperatorNames[Index], 'parallel_method', Information)

5、如果程式員不想使用AOP,而是自己實作并行化,那較為複雜,需要使用多線程技術,把圖像進行拆分處理,最後再合并。是以需要更多專業知識,詳情參見官方例程simulate_aop.hdev和官方說明書parallel_programming.pdf。

6、官方的手冊

Chapter 25 System --- 25.8 Parallelization

C:\Program Files\MVTec\HALCON-19.11-Progress\doc\pdf\manuals\parallel_programming.pdf

繼續閱讀