Imatest IT 平行處理範例項目

基本介紹

Imatest IT 現在包含平行處理功能 允許使用者透過運行多個並發進程來更充分地利用電腦資源。

  Imatest IT包含一個額外的 C++ 項目,該項目演示了一種多進程配置,其中父進程將待分析的映像分發給一組子進程。為了協調這組並發進程,該 C++ 專案使用了一種特殊的進程間通訊機制(來自Boost.Interprocess )。透過使用進程間控制物件和共享內存,父進程可以安全地管理子進程,並在子進程空閒時分配任務。

並行測試可使每台機器的測試吞吐量提高 2 到 3 倍。以下是基準測試詳情:

IT-P_Archetecture2
這是一個使用 Imatest IT 的平行進程架構範例。父進程將一組影像檔案組裝成一組分析任務,然後將這些任務指派給一組子進程。每個子進程都包含一個 Imatest IT SDK 實例,該實例使用 .ini 控製檔案中的設定執行分析。

運行多個進程的好處

在許多多核心電腦上,執行單一Imatest IT模組並不能充分利用電腦的所有資源。允許多個分析進程並行運行(直到達到系統資源的飽和點)可以提高測試吞吐量,即電腦在給定時間內可以完成的測試數量。

右圖所示即為一個例子。圖中,一台電腦(配備Intel i7-3930K 處理器,6 個實體核心,主頻 3.2 GHz,16 GB 記憶體)正在分析多張 8MP SFRplus 影像,並同時執行越來越多的 SFRplus 流程。在本例中,峰值測試吞吐量比單一進程的測試吞吐量提高了約 3.7 倍。當進程數大致等於物理核心數時,測試吞吐量達到飽和。吞吐量的提升幅度會因電腦處理器和記憶體容量的不同而有所差異。

IT-P_blemish_8MP

在高階桌上型電腦( Intel I7-3930K 處理器- 6 個實體核心 @ 3.2 GHz,16 GB 記憶體)上使用 SFRplus 分析 8 MP 影像,並同時處理越來越多的進程。

Imatest IT 平行處理範例專案入門

背景資訊

雖然Imatest IT/DLL用於影像品質分析,但並行C++ 專案中的進程間通訊和同步由另一個函式庫-Boost Interprocess 函式庫-管理。 Boost Interprocess 函式庫並非唯一的進程間函式庫,但之所以選擇它,是因為它具有良好的可移植性和相對的簡潔性。為了瞭解進程間通訊和並發中涉及的各種對象,請閱讀Boost Interprocess 的文檔。理解並發的挑戰對於編寫並行處理系統至關重要。

安裝

Imatest IT安裝完成後,範例專案將位於IT安裝目錄( C:\Program Files\Imatest\v5.0\IT\ )內的\samples\cpp\CPP_parallel_test_project\子目錄中。

Visual Studio 專案

Imatest IT的安裝套件中包含一個 Visual Studio 2008 C++ 項目,該項目使用一組平行進程來分析以檔案形式儲存的映像序列。這個進程池由一個父進程管理,父進程透過共享記憶體和Boost Interprocess C++ 庫 v1.54 中的同步物件與進程池通訊。父進程透過共享記憶體將測試詳情(例如圖像來源以及是否對圖像運行 sfrplus_shell() 或 blemish_shell())傳遞給各個子進程。子進程執行測試並等待進一步的指令。一旦父進程沒有更多測試需要分配給子進程,它就會發送命令使子進程自行終止。

特徵

願望清單

C++專案架構

 IT-P_Boost_project

在 C++ 專案中,父行程啟動一個包含三個子程序的行程池,每個子程序包含一個 Imatest IT/DLL實例。測試資料(例如影像檔案名稱和要執行的測試)透過共享記憶體分發給子進程。子進程隨後根據從 .ini 控製檔案輸入的設定分析影像,並將結果輸出到唯一命名的 JSON 檔案中。每個子進程原本會輸出到控制台視窗(透過 std::cout)的內容,都會透過共享記憶體重定向回父進程,以避免控制台輸出衝突。子進程完成影像分析後,會等待父進程的進一步指令。

重要類別和對象

子進程設定

該結構體被載入到共享記憶體中,作為每個子進程和父進程之間的介面。它包含待運行測試的所有信息,以及多個控制結構,包括進程間互斥鎖和進程間條件變數。請注意, Boost Interprocess 共享記憶體物件不能包含標準 C++ 容器,因為它們不會分配到共享記憶體( 連結)。請改用Boost Interprocess 容器或普通資料物件。

兒童手柄

此類允許父進程更好地控制子進程和共享記憶體中的 ChildProcessSettings 結構體。此類是必要的,因為當子進程被父進程終止時(例如,子進程停滯不前),需要刪除包含 ChildProcessSettings 結構體的共享內存,並創建一個新的共享內存物件。

SfrTestStruct

該結構體包含特定 SFRplus 測試的所有信息,例如檔案名稱。

瑕疵測試結構

該結構體包含特定瑕疵測試的所有信息,例如檔案名稱。

相機資訊

該結構體包含給定相機的所有識別信息,例如相機分辨率、序號和零件號。

延伸閱讀

  1. Boost程序間互動文檔。
  2. 關於共享記憶體中映射區域的限制的重要說明:( 連結)。