Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践

背景:在某个嵌入式上的图像处理项目功能开发告一段落,进入性能优化阶段。尝试从多线程上对图像处理过程进行加速。经过初步调研后,可以从OPENMP,TBB这两块进行加速,当前项目中有些算法已采用多线程加速,这次主要是对比以上两个加速模块与多线程加速效果的对比。现在PC上实验,然后再移植相关库。

环境准备:WIN11 ,VS2022 ,Debug 64
1、编译OPENCV。
经测试,编译过程是否选择TBB,MP相关选项对加载对应库和使用不影响。
2、安装TBB。(https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html)
VS配置之打开相关模块。打开TBB支持
打开openmp支持

对比过程:实验对比的对象包括:
1、基础FOR循环。
2、多线程。
3、原数据相同的TBB。
4、原数据独立的TBB。
5、原数据相同的OPENMP;
6、原数据独立的OPENMP;
测试数据为960*600的图像,测试内容为对该图进行大尺寸滤波操作。

测试代码:

#include <fstream>
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <omp.h>
#include <future>
#include <thread>
#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>int main()
{const static int iCnt = 50;//循环次数Mat imori = imread("ori.png");cvtColor(imori, imori, COLOR_BGR2GRAY);Mat imoriMt, imoriMP, imoriTbb, imoriAMP[iCnt], imoriATBB[iCnt];imori.copyTo(imoriMt);imori.copyTo(imoriMP);imori.copyTo(imoriTbb);for (size_t i = 0; i < iCnt; i++){imori.copyTo(imoriAMP[i]);imori.copyTo(imoriATBB[i]);}Mat imRslt[iCnt], imRsltMt[iCnt], imRsltMP[iCnt], imRsltAMP[iCnt],imRsltTbb[iCnt], imRsltATBB[iCnt];std::vector<std::future<void>> vFutures(iCnt);double start1 = omp_get_wtime();{for (int i = 0; i < iCnt; i++){Mat kealMN = Mat::ones(25, 25, CV_32F);filter2D(imori, imRslt[i], CV_32F, kealMN, Point(-1, -1), 0, BORDER_REFLECT_101);}}double end1 = omp_get_wtime();cout << " cv Normal Time = " << (end1 - start1) << endl;double startMt = omp_get_wtime();int i = 0;for (auto iter = vFutures.begin(); iter != vFutures.end(); iter++, i++)*iter = std::async([](cv::Mat* imRslt, Mat imori, int i) {Mat kealMN = Mat::ones(33, 33, CV_32F); filter2D(imori, imRslt[i], CV_32F, kealMN, Point(-1, -1), 0, BORDER_REFLECT_101); }, imRsltMt, imoriMt, i);for (auto iter = vFutures.begin(); iter != vFutures.end(); iter++)iter->get();double endMt = omp_get_wtime();cout << " cv MThread Time = " << (endMt - startMt) << endl;double startMP = omp_get_wtime();
#pragma omp parallel num_threads(iCnt){
#pragma omp forfor (int i = 0; i < iCnt; i++){Mat kealMN = Mat::ones(33, 33, CV_32F);filter2D(imoriMP, imRsltMP[i], CV_32F, kealMN, Point(-1, -1), 0, BORDER_REFLECT_101);}}double endMP = omp_get_wtime();cout << " cv MP Time = " << (endMP - startMP) << endl;double startAMP = omp_get_wtime();
#pragma omp parallel num_threads(iCnt){
#pragma omp forfor (int i = 0; i < iCnt; i++){Mat kealMN = Mat::ones(33, 33, CV_32F);filter2D(imoriAMP[i], imRsltAMP[i], CV_32F, kealMN, Point(-1, -1), 0, BORDER_REFLECT_101);}}double endAMP = omp_get_wtime();cout << " cv AMP Time = " << (endAMP - startAMP) << endl;double startTbb = omp_get_wtime();tbb::parallel_for(tbb::blocked_range<size_t>(0, iCnt),[&](tbb::blocked_range<size_t> r) {for (size_t i = r.begin(); i < r.end(); i++){Mat kealMN = Mat::ones(33, 33, CV_32F);filter2D(imoriTbb, imRsltTbb[i], CV_32F, kealMN, Point(-1, -1), 0, BORDER_REFLECT_101);}});double endTbb = omp_get_wtime();cout << " cv Tbb Time = " << (endTbb - startTbb) << endl;double startATbb = omp_get_wtime();tbb::parallel_for(tbb::blocked_range<size_t>(0, iCnt),[&](tbb::blocked_range<size_t> r) {for (size_t i = r.begin(); i < r.end(); i++){Mat kealMN = Mat::ones(33, 33, CV_32F);filter2D(imoriATBB[i], imRsltATBB[i], CV_32F, kealMN, Point(-1, -1), 0, BORDER_REFLECT_101);}});double endATbb = omp_get_wtime();cout << " cv Atbb Time = " << (endATbb - startATbb) << endl;getchar();return 0;}

实验结果:
处理结果

实验结论:
1、OPENMP,TBB可以有效对并行处理进行加速,其效果与多线程处理基本持平。
2、OPENMP,TBB的优势在于代码编写相对简单,也不用考虑线程数的设置。
3、OPENMP,TBB的基础数据独立与否,对测试速度基本不影响(待定,有的同学说会导致各线程等待访问同一数据,引起耗时增加),也可能和PC的性能较好有关。但尽量去保证数据独立性,避免处理结果错误。

ARM实践 TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FRDM‐K64F开发板 ARM Mbed 在线编译器嵌入式和物联网开发

传感器和执行器 传感器是将物理参数转换为电输出的设备。 传感器是换能器的一种。 传感器可分为模拟传感器和数字传感器。 模拟传感器以电压和电流的形式提供输出。 微控制器需要 ADC&#xff08;模数转换器&#xff09;读取来自模拟传感器的数据。 许多较新的传感器都是数字传…

僵尸进程以及解决办法、僵死进程有什么区别?

僵尸进程是指已经结束但父进程没有回收它的资源的进程。它们在进程表中仍占有一个位置&#xff0c;但不能被调度运行。僵尸进程会浪费系统的资源&#xff0c;如果过多&#xff0c;可能导致系统无法创建新的进程。僵尸进程的产生原因是父进程没有及时调用 wait 或 waitpid 函数来…

【蓝桥杯冲冲冲】[NOIP2000 提高组] 方格取数

蓝桥杯备赛 | 洛谷做题打卡day19 文章目录 蓝桥杯备赛 | 洛谷做题打卡day19[NOIP2000 提高组] 方格取数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 [NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N…

如何用甘特图跟踪项目进度

甘特图是一个简单但是极其强大的项目管理工具,能够清晰可视化复杂项目的进度,在项目跟踪和控制上发挥重要作用。任何一个严肃的项目组织者都会使用甘特图来规划和管理项目中的任务。 甘特图的纵坐标表示项目的各项活动或任务,横坐标表示项目的时间进度。每个任务用一条横条表示…

Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理

word、excel、pdf、image转换工具类 1.感谢2.包含的工具类3.lib文件说明3.1 使用的3.2 未使用的 4.核心代码4.1 WordToPdfUtil4.2 ExcelToPdfUtil4.3 PdfToImageUtil 6.问题处理6.1 Word中文无法转换6.2 Excel中文无法转换 7.总结 1.感谢 感谢小伙伴儿的分享&#xff1a; ● 不…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

permanent property翻译为永久产权属于错误,应该是正式产权、法定产权

很多人说美国房子是永久产权。再配上“风能进&#xff0c;雨能进&#xff0c;国王不能进”&#xff0c;于是给人一种误解&#xff0c;就是永远所有。现实性是什么呢&#xff1f;你今天不交房产税、物业费&#xff0c;明天就被拍卖。这就是所谓的永久产权&#xff1f;显然不是。…

MySQL新类型JSON的用法讲解

前言 MySQL相信大家应该不陌生吧&#xff0c;都知道MySQL有很多数据类型&#xff0c;包括int&#xff0c;char&#xff0c;verchar&#xff0c;这些也是平时建表使用比较多的类型&#xff0c;在MySQL 8引入了新的数据类型——JSON&#xff0c;它使得在数据库中存储和查询 JSON…

QT容器分类与QSet应用

一.QT容器分类 Qt提供了多种容器类&#xff0c;大致可以分为以下几类&#xff1a; 1.顺序容器&#xff1a;这类容器按照线性顺序&#xff08;如列表或数组&#xff09;存储元素。例如&#xff0c;QList, QLinkedList, QVector, QStack, 和 QQueue。 2.关联容器&#xff1a;这…

LLM应用开发与落地:基于上下文的文本信息检测与提取

最近一直用LLM解决各种各样的问题&#xff0c;感觉已经脱离不了LLM了。每次使用LLM解决一个之前解决不了的问题&#xff0c;或者大大提升我的工作效率的时候&#xff0c;我内心都小小会激动一下。我想这是只通过看文章或只是研究AI理论感受不到的小确幸。我也因此更加确信LLM是…

react-jss书写样式

目录 react-jss的使用 react-jss的使用 实现组件化样式、动态样式、避免样式冲突 npm install react-jss yarn add react-jss// 使用 import React from react; import { createUseStyles } from react-jss;const useStyles createUseStyles({myButton: {color: green,margi…

Kotlin MultiPlatform:构建跨平台应用的未来

Kotlin MultiPlatform&#xff1a;构建跨平台应用的未来 1 引言 1.1 Kotlin MultiPlatform简介 Kotlin MultiPlatform&#xff08;简称KMP&#xff09;是一种由JetBrains开发的跨平台开发解决方案&#xff0c;它建立在Kotlin语言之上。KMP允许开发者使用一套Kotlin代码来构建…

【2024】Docker部署Redis

1.说明&#xff1a; 因为容器实例的运行是有生命周期的&#xff0c;一些redis的备份、日志和配置文件什么的最好还是放在服务器本地。这样当容器删除时&#xff0c;我们也可以保留备份和日志文件。所以先在本地服务器安装redis并配置文件设置。下面是安装步骤: 2.安装步骤 1…

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

Android源码设计模式解析与实战第2版笔记(二)

第二章 应用最广的模式 — 单例模式 单例模式的定义 确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 单例模式的使用场景 确保某个类有且只有一个对象的场景&#xff0c;避免产生多个对象消耗过多的资源&#xff0c;或者某种类型的对象只应…

压电式、电磁式蜂鸣器设计电路

蜂鸣器常用分类从两方面 声源类型&#xff1a;压电蜂鸣器( Piezoceramic Element Buzzers )、电磁蜂鸣器( Magnetic Buzzers ) 驱动类型&#xff1a;有源蜂鸣器( Indicators )、无源蜂鸣器( Transducers ) 一、电磁式蜂鸣器 无源电磁式设计电路 电磁蜂鸣器的线圈类似于电感&am…

“文心一言”揭秘:智能语言模型的新里程碑

前文 在数字化、信息化的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术如同一匹黑马&#xff0c;不断刷新着我们对科技发展的认知。其中&#xff0c;智能语言模型作为AI领域的一大分支&#xff0c;更是引领着自然语言处理&#xff08;NLP&#xff09;技术的革新。…

web前端项目-动画特效【附源码】

文章目录 一&#xff1a;赛车游戏动画HTML源码&#xff1a;JS源码&#xff1a;CSS源码&#xff1a;&#xff08;1&#xff09;normalize.css&#xff08;2&#xff09;style.css 二&#xff1a;吉普车动画演示HTML源码&#xff1a;CSS源码&#xff1a;&#xff08;1&#xff09…

ARM Cortex-A 内核的运行模式切换

ARM Cortex-A 内核的运行模式切换 ARM Cortex-A系列内核的处理器支持多种运行模式的切换。 不同的运行模式能满足不同的需求,如响应中断、运行操作系统内核、处理异常等。 目录 1 ARM Cortex-A 内核的处理器什么场景下有切换运行模式的需求 2 ARM Cortex-A 内核的处理…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 本篇文章是对已有一篇文章的整理归纳&#xff0c;并对文章中…