OpenMP是能让程序并行化的一个框架,在编写OpenCV程序的过程中,有很多关于图片的操作,非常耗时,但同时也存在大量可以并行的模块,我们在Xcode上集成OpenMP框架,并且通过简单的几行代码就可以实现并行化。
1.在Mac的命令行下通过Homebrew安装clang-omp,命令如下:
sudo brew install clang-omp
2.在Xcode中新建工程,选择Command Line Tool,语言选择C++。
3.在Xcode中点击工程名,选择Build Settings,在Build Settings下修改如下内容:
在Header Search Paths中添加/usr/local/include
在Library Search Pahts中添加/usr/local/lib
在Other C Flags中添加-fopenmp
添加用户定义的设置,选择Add User-Defined Setting,名字为CC,内容是/usr/local/bin/clang-omp
将Enable Modules (C and Objective-C)设置为No
3.在与Build Settings同级的Build Phases中选择Link Binary With Libraries,添加/usr/local/lib/libiomp5.dylib
4.在命令行下输入以下命令来建立连接:
sudo ln -s /usr/local/bin/clang-omp++ /usr/local/bin/clang++-omp
5.通过以下程序测试OpenMP是否已经配置完毕:
#include <iostream>
#include <libiomp/omp.h>
using namespace std;
int main(int argc, const char * argv[]) {
cout << omp_get_num_procs() << " kernels" << endl;
#pragma omp parallel for num_threads(omp_get_num_procs())
for (int i = 0; i < 10; i++) {
cout << i;
}
cout << endl;
#pragma omp parallel sections//并行计算
{
#pragma omp section
{
cout << 0+1;
}
#pragma omp section
{
cout << 3-1;
}
#pragma omp section
{
cout << 1*3;
}
#pragma omp section
{
cout << 8/2;
}
}
cout << endl;
return 0;
}
上面程序中首先要导入libiomp/omp.h头文件,omp_get_num_procs()函数表示机器有多少核,#pragma omp parallel for num_threads(omp_get_num_procs())表示对一个for循环进行并行化,当然要保证循环之间互不影响,#pragma omp parallel sections结合多个#pragma omp section表示多个可以并行化的模块。
上面的程序在我电脑上的运行结果是:
由结果可见无论是for循环还是四个并行的模块都进行了并行化。