opencv parallel_for_使用及注意

函数说明

parallel_for_用于并行处理循环操作

使用demo

parallel_for_使用,简单示例,func函数循环调用

#include <iostream>
#include <opencv2/core.hpp>

using namespace std;
using namespace cv; 

void fun (const Range range)
{
  for (size_t i = range.start; i < range.end; i++) {
    cout << "i: " << i << endl;
  }
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);
  return 0;
}

编译命令:

g++ parallel_for_.cpp `pkg-config --libs --cflags opencv` -o demo1

运行:
./a.out

运行结果:
/home/niebaozhen/tmp/parallel/demo1.png
结果说明:
随机性并行

如果想要完成打印,则加入锁机制,如下示例

#include <iostream>
#include <opencv2/core.hpp>
#include <mutex>

mutex t_mutex;

void fun (const Range range)
{
  for (size_t i = range.start; i < range.end; i++) {
    {unique_lock<mutex> lck(t_mutex);
    cout << "i: " << i << endl;}
  }
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);
  return 0;
}

运行结果:
在这里插入图片描述

循环函数中变量操作测试

全局变量测试

测试全局变量在循环函数被并行执行的情况

int t = 0;

int fun (const Range range)
{
  for (size_t i = range.start; i < range.end; i++) {
    cout << "i: " << i << endl;
    t += i;
  }

  return t;
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);

  cout << "t: " << t << endl;
  return 0;
}

运行结果:
在这里插入图片描述
全局变量在较少的并行中,未出现竞争现象,但是仍存在线程安全问题,需加入锁机制,如下:

int t = 0;

int fun (const Range range)
{
  for (size_t i = range.start; i < range.end; i++) {
    {unique_lock<mutex> lck(t_mutex);
    cout << "i: " << i << endl;
    t += i;}
  }

  return t;
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);

  cout << "t: " << t << endl;
  return 0;
}

当对全局变量在循环函数内进行赋值操作时,将会出现问题,如下:

int t = 0;

int fun (const Range range)
{
  //this will make error
  t = 0;
  for (size_t i = range.start; i < range.end; i++) {
    cout << "i: " << i << endl;
    t += i;
  }

  return t;
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);

  cout << "t: " << t << endl;
  return 0;
}

运行结果:
在这里插入图片描述
结果分析:
循环函数中,整个函数会被重复执行,即使变量赋值发生在for循环之外,如下代码

void fun (const Range range)
{
  cout << "test*******" << endl;

  for (size_t i = range.start; i < range.end; i++) {}
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);

  return 0;
}

运行结果:
在这里插入图片描述

局部变量测试

int t = 0;
int fun (const Range range)
{

  //this will make error
  int t1 = 0;
  for (size_t i = range.start; i < range.end; i++) {
    cout << "i: " << i << endl;
    t1++;
  }

  t = t1;
  return t;
}

int main ()
{
  parallel_for_(cv::Range(0, 10), &fun);

  cout << "t: " << t << endl;
  return 0;
}

测试结果:
在这里插入图片描述
结果分析:
循环函数中只能使用常量,对变量进行操作会产生其他问题

其他使用示例

     cv::parallel_for_(cv::Range(0, px_ref.size()),
     std::bind(&JacobianAccumulator::accumulate_jacobian_se3_FA, this,
     std::placeholders::_1));

std::bind(&JacobianAccumulator::accumulate_jacobian_se3_FA, this, std::placeholders::_1) 定义了一个xxx(Range)的函数,并将地址赋值给了parallel_for_,parallel_for_将参数给xxx(Range),xxx调用accumulate_jacobian_se3_FA(Range)
由于c++类成员函数指针的访问特性,所以需要中间中转一下通过bind生成一个xxx(Range)的函数。

其他并行用法

#pragma omp parallel for是OpenMP中的一个指令,表示接下来的for循环将被多线程执行,另外每次循环之间不能有关系。示例如下:

int main(int argc, char* argv[])
{
#pragma omp parallel for  //后面是for循环
     for (int i = 0; i < 10; i++ )
     {
         printf("i = %d/n", i);
     }
     return 0;
}

这个程序执行后打印出以下结果:

i = 0
i = 5
i = 1
i = 6
i = 2
i = 7
i = 3
i = 8
i = 4
i = 9

结论

parallel_for_ 对应的循环函数会被重复执行,因此对变量的赋值声明操作也会被重复执行,在使用中需要注意。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值