本文翻譯並總結自Halcon 官方說明文檔,詳情請查看Halcon幫助文檔,如下圖所示:
get_operator_info.hdev例程展示瞭如何查看哪些算子支持GPU加速與並行加速等信息
-
GPU加速
詳情可查看compute_devices.hdev例程
-
並行運算加速
1、數據並行化
數據並行化的具體方式是實現了算子自動並行化,即AOP,Halcon算子之所以擁有極高的執行效率就是因爲默認開啓了AOP。數據並行化具體分爲以下四種:
(1)tuple level (2)channel level (3)domain level (4)internal data level
下圖展示了AOP應用在中值濾波上的具體過程:
(1)將輸入數據分割成幾個大小大致相同的數據塊;
(2)由不同的線程分別處理每個數據塊;
(3)在最後一個線程完成後,將所有線程的結果合併到一起;
simulate_aop.hdev例程展示瞭如何手動實現數據並行化,並與AOP對比。對比結果顯示,其效果不如AOP,但是比順序處理快得多。
#設置是否啓用AOP,默認爲true
set_system ('parallelize_operators', 'true')
#設置啓用AOP時所用的線程數量
set_system ('thread_num', Threads)
2、任務並行化
Halcon通過線程安全和可重入來支持並行編程。不同的線程可以同時調用Halcon算子,而不必等待。然而,並非所有算子都是完全可重入的,可分爲以下6個可重入級別:
reentrant:如果一個運算符可以由多個線程同時調用,而不依賴於它所調用的數據,則它是完全可重入的
local:標記爲本地的運算符只能從實例化相應對象的線程調用
single write multiple read:只有當不同的調用線程在不同的數據上工作時,才應該同時調用某組運算符
mutually exclusive:有些算子不能被多個線程同時調用,但可以與其他算子並行執行
exclusive:Halcon獨佔執行一組算子,在執行此類算子時,所有其他線程都不能調用另一個Halcon算子。
independent:一組算子獨立於其他算子(甚至是獨佔算子)執行
par_start.hdev例程展示瞭如何並行的識別同一張圖片上不同類型的條碼,如下圖所示:
-
並行編程的重要概念
Thread:線程是獨立於主程序並與其並行運行的過程。它與其他線程共享全局變量和資源,並獨佔本地變量和資源
Thread Safe:當一個線程訪問或操作共享數據和資源的方式能夠保證在任意多線程環境中產生可預測和可複製的結果時,它被認 爲是線程安全的。
Reentrant:如果一個運算符可以由多個線程同時調用,而不依賴於它所調用的數據,則它是完全可重入的
Exclusive:如果保證數據、資源或代碼只能由一個線程同時訪問或執行,則以獨佔方式訪問或執行。
Message Queue:消息隊列是線程安全的FIFO(“先進先出”)列表,用於在線程之間傳遞數據
Producer Consumer Model:在生產者-消費者模型中,一些線程(即生產者)向其他線程(即消費者)提供數據。
Data Parallelization:數據並行化描述了一種並行化概念,它將數據分離爲獨立的數據組,並同時處理這些數據組。
Task Parallelization:任務並行化描述了一個並行化概念,它將問題劃分爲幾個獨立的子任務,並同時執行這些子任務。
AOP (automatic operator parallelization):AOP是一種數據並行化的類型,默認情況下用於內部的選擇/區分算子。