halcon算子并行和串行计算

简介:halcon很多算子默认都是并行计算的,当你的软件也开了多线程,在算子级别用多线程计算那就没有什么加速效果,甚至还会有负面的影响。比如:你的程序为了更好的利用CPU计算资源,开了多线程,CPU整体利用率达到70-90%,现在再用halcon算子的并行计算方式的话,CPU占用率可能就会到100%,如果有其他应用在进行的话,其他应用就相当于“卡”住了。另外线程不是越多越好,开线程也有一定的开销,线程超过某一点后可能也会得不偿失。
示例一个关闭基于形状的模板匹配的并行计算过程。


1.halcon串、并行计算设置接口

  • HalconCpp::setSystem,详细内容可参考halcon参考文档,写得很详细。
    image.png

  • 算子串、并行计算开关
    里面也说了什么情况下关闭并行计算是合适的,以及关闭哪一个步骤的并行计算。
    image.png

2.示例:

  • 基于形状的模板匹配默认是并行计算的
    基于形状的模板匹配.png

  • 主要过程代码

void speedTest()
{
	HalconCpp::HImage img, temp;
	HalconCpp::ReadImage(&img, "G:\\imageData\\src_temp4.png");
	HalconCpp::ReadImage(&temp, "G:\\imageData\\src_temp.png");

	HalconCpp::HTuple model;

	printf("create model\n");
	createModel(temp, 10, model);

	printf("find template\n");
	clock_t start_time = clock();//记录起始时间
	for (int i = 0; i < 3000; i++)	findTemplate(img, model, 10);
	clock_t end_time = clock();//记录结束时间
	auto run_time = double(1000 * (end_time - start_time)) / CLOCKS_PER_SEC;//单位为毫秒
	std::cout << "run time: " << run_time << "ms\n";

}

void setParalize(bool flag=true)
{
	//这里的HalconCpp::SetSystem设置对于halcon是全局的,
	//当设置"parallelize_operators",为"false"时
	//所有默认并行计算的算子都会变成串行计算。
	if (flag == false)
	{
		HalconCpp::SetSystem("parallelize_operators", "false");
	}
	else if (flag == true)
	{
		HalconCpp::SetSystem("parallelize_operators", "true");
	}
	else
	{
		HalconCpp::SetSystem("parallelize_operators", "true");
	}
}

int main()
{
	speedTest();
	setParalize(false);
	speedTest();
	setParalize(true);
	speedTest();
}
  • 运行结果
    CPU.png
    对于基于形状的模板匹配,从CPU占用和运行时间来看,并行计算CPU整体占用能到70%,串行的话只有13%,运行时间:并行7192ms,串行:25012ms。
    CPU占用:并行是串行的5倍左右,
    运行时间:并行的只有串行的29%。
    用SetSystem设置的关闭并行计算,开启并行计算都是ok的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值