翻译:陈之炎
校对:顾伟嵩
本文约3200字,建议阅读7分钟本教程的目标是展示如何使用OpenCV的parallel_for_框架轻松实现代码并行化。
目标
本教程的目标是展示如何使用OpenCV的parallel_for_框架轻松实现代码并行化。为了说明这个概念,我们将编写一个程序,利用几乎所有的CPU负载来绘制Mandelbrot集合。完整的教程代码可见原文。如果想了解更多关于多线程的信息,请参考本教程中提及的参考书或课程。
预备条件
首先是搭建OpenCV并行框架。在OpenCV3.2中,可以按此顺序使用以下并行框架:
1. 英特尔线程构建模块(第三方库,应该明确启用)
2. C =并行C / C ++编程语言扩展(第三方库,应该明确启用)
3. OpenMP(集成的编译器,应明确启用)
4. APPLE GCD(系统层面,自动使用(仅适用APPLE))
5. Windows RT并发(系统层面,自动使用(仅适用Windows RT))
6. Windows并发(部分运行时间,自动使用(仅适用Windows - MSVC ++> = 10))
7. Pthreads (如果适用)
正如前面所述,OpenCV库可以使用多个并行框架。有些并行库为第三方提供的库,建立时应明确地用CMake(如TBB,C =)启用,其余均为自动可用的平台(例如APPLE GCD),但是,无论是直接使用并行框架还是利用CMake启用并行框架并重建库,首先要做的是启用并行框架。
第二个(弱)预备条件与任务相关,因为不是所有任务的计算都可以/适合以并行方式来运行。为了尽量保持简单,可以将任务分解为与存储器无关的多个元素,从而使其更加容易实现并行化。在计算机视觉处理过程中,由于大多数时间里一个像素的处理不依赖于其它像素的状态,所以往往更加容易实现并行化。
简单的示例:绘制Mandelbrot集合
这个例子中将展示如何绘制Mandelbrot集合,将普通的顺序代码实现并行化计算。
理论
Mandelbrot集合的名称是数学家阿德里恩·多迪(Adrien Douady)为悼念数学家蒙德布罗特(Mandelbrot),以他的名字来命名的。它在数学界之外,作为分形类的一个例子,在图像表示领域非常著名。Mandelbrot集合为一组自相似的重复图案在不同尺度下重复显示结果。为了进一步深入介绍,可以参考Wikipedia article。在这里,仅介绍利用公式绘制Mandelbrot集合(选自维基百科的文章)。
Mandelbrot集合是在复平面中一组值C沿着0轨迹的二次迭代映射的边界。
即,复数c作为Mandelbrot集的一部分,从 Z0 = 0开始重复进行迭代,