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. 关于共享内存中映射区域的局限性的重要说明:( 链接)。