英文链接:How to use the OpenCV parallel_for_ to parallelize your code
目的
本教程的目的是向您展示如何使用OpenCV parallel_for_
框架轻松地并行化代码。为了说明这个概念,我们将编写一个程序来利用几乎所有可用的CPU负载绘制曼德尔布罗特集。完整的教程代码在这里。如果你想要更多关于多线程的信息,你将不得不参考参考书或课程,因为本教程的目的是保持简单。
先决条件
第一个先决条件是用并行框架构建OpenCV。在OpenCV 3.2中,以下并行框架是按顺序提供的:
- Intel线程构建块(应该显式启用第三方库)
- C=并行C/ c++编程语言扩展(应显式启用第三方库)
- OpenMP(集成到编译器中,应该显式启用)
- 苹果GCD(系统范围,自动使用(仅限苹果))
- Windows RT并发性(系统范围,自动使用(仅适用于Windows RT))
- Windows并发(运行时的一部分,自动使用(仅Windows - MSVC++ >= 10))
- Pthreads(如果可用)
如您所见,OpenCV库能使用几个并行框架。一些并行库是第三方库,必须显式地构建和启用CMake(例如TBB, C =),其他的则自动可用(例如APPLE GCD),但是,您应该能够直接访问并行框架,或者通过在CMake和rebuild库中启用选项来实现。
第二个(弱)先决条件与你想要完成的任务有关,因为并不是所有的计算都适合/可以被设置为并行运行。为了保持简单,可以拆分为多个基本操作、没有内存依赖关系(没有可能的竞争条件)的任务可以轻松地并行。计算机视觉处理通常是容易并行的,因为大多数时候一个像素的处理不依赖于其他像素的状态。
简单的示例:绘制曼德尔布罗特集(Mandelbrot set)
我们将使用绘制曼德尔布罗特集的示例来展示如何从规则的顺序代码中轻松地修改代码来并行化计算。
原理
Mandelbrot集合定义被数学家Adrien Douady命名为向数学家Benoit Mandelbrot致敬。它在数学领域之外很出名,因为图像表示是一类分形的一个例子,它是一个数学集合,在每个尺度上都显示出一个重复的模式(甚至,曼德尔布罗特集是自相似的,因为整个形状可以在不同的尺度上重复出现)。要获得更深入的介绍,可以查看相应的Wikipedia文章。这里,我们将介绍绘制Mandelbrot集的公式(来自Wikipedia文章)。
Mandelbrot集合是二次映射迭代下轨道为0的复平面上 c c c的值的集合
{ z 0 = 0 z n + 1 = z n 2 + c \begin{cases} z_0 = 0 \\ z_{n+1} = z_n^2 + c \end{cases} {
z0=