介绍
|
Imatest IT 现在包含并行处理功能 允许用户通过运行多个并发进程来更充分地利用计算机资源。 Imatest IT包含一个额外的 C++ 项目,该项目演示了一种多进程配置,其中父进程将待分析的图像分发给一组子进程。为了协调这组并发进程,该 C++ 项目使用了一种特殊的进程间通信机制(来自Boost.Interprocess )。通过使用进程间控制对象和共享内存,父进程可以安全地管理子进程,并在子进程空闲时分配任务。 并行测试可使每台机器的测试吞吐量提高 2 到 3 倍。以下是基准测试详情: |
运行多个进程的好处
|
在许多多核计算机上,运行单个Imatest IT模块并不能充分利用计算机的所有资源。允许多个分析进程并行运行(直至达到系统资源的饱和点)可以提高测试吞吐量,即计算机在给定时间内可以完成的测试数量。 右图所示即为一个例子。图中,一台计算机(配备Intel i7-3930K 处理器,6 个物理核心,主频 3.2 GHz,16 GB 内存)正在分析多张 8MP SFRplus 图像,并同时运行越来越多的 SFRplus 进程。在本例中,峰值测试吞吐量比单个进程的测试吞吐量提高了约 3.7 倍。当进程数大致等于物理核心数时,测试吞吐量达到饱和。吞吐量的提升幅度会因计算机处理器和内存容量的不同而有所差异。 |
|
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())传递给各个子进程。子进程执行测试并等待进一步的指令。一旦父进程没有更多测试需要分配给子进程,它就会发送命令使子进程自行终止。
特征
- 分析多种分辨率的 SFRplus 和 Blemish RAW 图像文件。
- 每个子进程都可以使用 sfrplus_shell() 或 blemish_shell() 函数分析图像,而无需重新启动即可在两个函数之间切换。
- 子进程在完成图像分析后,等待父进程的指令。
- 通过将每个子进程的输出通过共享内存重定向到父进程,抑制了各个子进程控制台输出的冲突。
- 如果子进程返回结果不够快,父进程可以终止子进程,并启动一个新的子进程来分析前一个进程的图像。
- 父进程与特定子进程之间共享的数据的访问由进程间互斥锁和进程间条件变量控制。
愿望清单
- 让父进程监视一个或多个目录,查找传入的图像,并将它们分配给正在等待的子进程。
C++项目架构
在 C++ 项目中,父进程启动一个包含三个子进程的进程池,每个子进程都包含一个 Imatest IT/DLL实例。测试数据(例如图像文件名和要执行的测试)通过共享内存分发给子进程。子进程随后根据从 .ini 控制文件中输入的设置分析图像,并将结果输出到唯一命名的 JSON 文件中。每个子进程原本会输出到控制台窗口(通过 std::cout)的内容,都会通过共享内存重定向回父进程,以避免控制台输出冲突。子进程完成图像分析后,会等待父进程的进一步指令。
重要类和对象
子进程设置
该结构体被加载到共享内存中,作为每个子进程和父进程之间的接口。它包含待运行测试的所有信息,以及多个控制结构,包括进程间互斥锁和进程间条件变量。请注意, Boost Interprocess 共享内存对象不能包含标准 C++ 容器,因为它们不会分配到共享内存中( 链接)。请改用Boost Interprocess 容器或普通数据对象。
儿童手柄
此类允许父进程更好地控制子进程和共享内存中的 ChildProcessSettings 结构体。此类是必要的,因为当子进程被父进程终止时(例如,子进程停滞不前),需要删除包含 ChildProcessSettings 结构体的共享内存,并创建一个新的共享内存对象。
SfrTestStruct
该结构体包含特定 SFRplus 测试的所有信息,例如文件名。
瑕疵测试结构
该结构体包含特定瑕疵测试的所有信息,例如文件名。
相机信息
该结构体包含给定相机的所有识别信息,例如相机分辨率、序列号和零件号。
延伸阅读
- Boost进程间交互文档。
- 关于共享内存中映射区域的局限性的重要说明:( 链接)。



