并行处理加速图像/事务处理
1.计算机环境:
Windows10
VS2017
2.OpenMP编程方式
openMP非常容易上手,能够支持C、C++、Fortran语言,支持OpenMP的编译器有:Sun Studio,Intel Compiler,Microsoft Visual Studio,GCC,我是在VS2017工程下进行使用的。
配置方式:在项目上右键->属性->配置属性->C/C++->语言->OpenMP支持里选择是
3.简单介绍
这里介绍几个常用的语句,具体关于更高阶的,大家可以查询相关文档,或所提供的博客链接。
3.1 计算处理器核数
//计算电脑的处理器数量
const int coreNum = omp_get_num_procs();
3.2 #pragma omp parallel for
后面直接跟for循环,可以并行循环里面的内容,但是要注意,循环中的数据之间必须没有关联性,否则会出现访存错误或输出结果与实际所求不符。
#pragma omp parallel for
for (int i=0;i<10;i++)
std::cout<<i<<std::endl;
3.3 #pragma omp parallel sections
为解决3.2中的问题,OpenMP提供了#pragma omp parallel sections,此语句下面可以包含多个section子语句,子语句就是并行处理的内容。当然,有多少个核就可以写多少个section。
#pragma omp parallel sections
{
#pragma omp section
{
function1();
}
#pragma omp section
{
function2();
}
3.4 我在处理图片时的使用心得
由于图片太大,我的计算机有4个核,因此我将图片分为4块,然后将其进行并行处理。伪代码如下:
//①计算电脑的处理器数量
const int coreNum = omp_get_num_procs();
//②将图像分块 src:待处理的原图像 v:保存分割后的图像子块 corenum:处理器数量
split(Mat src,vector<Mat> v,int corenum);
//③图像分块处理
#pragma omp parallel for
for (int i = 0; i < coreNum; i++)
imgProcess(v[i], v[i]);
//④图像合并
merge(dest,v,corenum);