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

c++并行计算库TBB和PPL的基本用法 并行库充分利用多核的优势,通过并行运算提高程序效率,本文主要介绍c++中两个知名的并行库,一个是intel开发的TBB,一个是微软开发的PPL。本文只介绍其基本的常用用法:并行算法和任务。 TBB(Intel® Threading Building Blocks ) TBB是intel用标准c++写的一个开源的并行计算库。它的目的是提升数据并行计算的能力,可以在他的官网上下载最新的库和文档。T... 阅读详情

在上一篇文章中,我们成功验证了Intel Threading Building Blocks (TBB) 与 OpenMP 在多线程并行处理方面的加速潜力。为了更深入地理解这些技术在实际应用场景中的效能提升,接下来我们将目光转向目标开发板环境,进一步探究这两种框架在嵌入式系统上的实际加速效果。
一、OPENMP加速效果测试
在探讨OPENMP对性能提升的影响时,我们首先遇到了一个有趣的插曲。通常情况下,OpenMP作为一项编译器层面的支持特性,只需在编译阶段通过简单的命令行标志即可启用,例如在使用make构建时追加-fopenmp参数,或在CMake项目中配置如set(CMAKE_CXX_FLAGS “-fopenmp”),即可轻松为项目开启并行处理能力。

然而,在针对RV1106平台的交叉编译环境中,我们发现原生的交叉编译工具链并不支持OpenMP功能。通过执行arm-rockchip830-linux-uclibcgnueabihf-gcc -v来查看编译器详细信息时,注意到其构建选项中包含了–disable-libgomp,这意味着该编译器在构建之初就已排除了对OpenMP库的支持。这可能是因为RV1106芯片本身为单核架构,考虑到硬件资源有限,制造商在设计工具链时并未考虑多线程并行处理的需求。
RV1106交叉编译器能力
尽管如此,面对手头仅有的嵌入式开发环境限制,我们并未止步于此。经过深入研究和探索,最终成功实现了对该交叉编译器OpenMP支持的集成。虽然整个过程尚未完全优化与标准化,此处暂且略过具体实现细节,我们将简要概述如何使编译器支持OpenMP以及随后进行的测试效果评估。

交叉编译器不支持的临时解决办法:
1、从源码编译openmp:
官网介绍:https://www.openmp.org/specifications/
下载地址:https://github.com/OpenMP/sources
编译过程比较简单:在源码中将makefile的configure 后面指定当前的编译工具链路径和生产路径。

all: 
	mkdir src/libgomp/build ;          \
	cd src/libgomp/build &&            \
	../configure --host=arm-rockchip830-linux-uclibcgnueabihf && \
	$(MAKE)

2、编译好的libgomp放入工具链
我生成的libgomp 路径在 libgomp-master\src\libgomp\build.libs 下面,将其中的
libgomp.so libgomp.so.1 libgomp.so.1.0.0 以及上一级目录的libgomp.spec 一共四个文件拷贝到工具链的以下两个路径:

/arm-rockchip830-linux-uclibcgnueabihf/arm-rockchip830-linux-uclibcgnueabihf/lib/lib
/arm-rockchip830-linux-uclibcgnueabihf/arm-rockchip830-linux-uclibcgnueabihf/sysroot/lib/

编译测试:
在编译过程中,直接加入-fopenmp指令:

arm-rockchip830-linux-uclibcgnueabihf-g++ OptCvTestWin.cpp -o test -fopenmp

即可生成可执行文件。
此处不用cmake编译,因为写好的cmakelist中配置的-fopenmp不生效。

加速效果:

# ./test 
 cv F1 Time = 79  rslt 3.20518e+10
 cv F2 Time = 153  rslt 3.20518e+10
 cv F1 Time = 91  rslt 2.99779e+10
 cv F2 Time = 166  rslt 2.99779e+10
 cv F1 Time = 76  rslt 2.93042e+10
 cv F2 Time = 166  rslt 2.93042e+10
 cv F1 Time = 75  rslt 3.1813e+10
 cv F2 Time = 158  rslt 3.1813e+10
 cv F1 Time = 75  rslt 3.18925e+10
 cv F2 Time = 177  rslt 3.18925e+10
 cv F1 Time = 81  rslt 3.07783e+10
 cv F2 Time = 158  rslt 3.07783e+10
 cv F1 Time = 90  rslt 3.05833e+10
 cv F2 Time = 156  rslt 3.05833e+10
 cv F1 Time = 76  rslt 2.83669e+10
 cv F2 Time = 158  rslt 2.83669e+10
 cv F1 Time = 91  rslt 3.42625e+10
 cv F2 Time = 170  rslt 3.42625e+10
 cv F1 Time = 75  rslt 3.44049e+10
 cv F2 Time = 163  rslt 3.44049e+10

对比了多线程方案F1与常规单线程方案F2的执行速度(单位ms)。实验发现,随着OpenMP线程数从2增至10,F1的加速效果逐步提升;但超过10个线程后,加速收益不再明显增加。这表明存在一个最优线程数阈值,在该范围内使用OpenMP能有效提高程序性能。

测试的代码放出来:
整体上跑10遍观察效果,选取其中一部分数据打印看结果是否一致。

#include <fstream>
#include <iostream>
#include <vector>
//#include <opencv2/opencv.hpp>
//#include "libgomp.h"
#include <future>
#include <thread>
//#include <tbb/parallel_for.h>
//#include <tbb/blocked_range.h>
#include <chrono>
//using namespace cv;
using namespace std;

typedef std::chrono::system_clock::time_point SYS_TIME;
SYS_TIME getClock()
{
    return std::chrono::system_clock::now();
}
double getMsTime(SYS_TIME start, SYS_TIME end)
{
    return  std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
}
int main()
{for (int j =0; j <10; j++)
{
    const int iCnt = 1000000;
    std::vector<float> data1(iCnt);
    std::vector<float> data2(iCnt);
    for (float i = 0; i < iCnt; ++i) {
        data1[i] = rand(); // 假设填充了随机整数
		data2[i] = data1[i];
    }
	float fv1=0;
    SYS_TIME start = getClock();
#pragma omp parallel num_threads(4)
    {
#pragma omp for
        for(int i = 0; i < iCnt; i++)
        {
			data1[i]+=i;
			if(i>iCnt/3&&i<iCnt/3+30)
				fv1+=data1[i];
        }
    }
    cout << " cv F1 Time = " << getMsTime(start, getClock()) <<"  rslt "<< fv1  << endl;

	float fv2=0;
    SYS_TIME start2 = getClock();
    {
        for (float i = 0; i < iCnt; i++)
        {
			data2[i]+=i;
			if(i>iCnt/3&&i<iCnt/3+30)
				fv2+=data2[i];
        }
    }
    cout << " cv F2 Time = " << getMsTime(start2, getClock()) <<"  rslt "<< fv2  << endl;
}    return 0;
}

后记:
在本阶段的技术探索中,我们遇到了CMakeLists.txt中设置的OpenMP编译选项未能生效的问题。尽管GPT暂时无法给出具体原因,但当前的重点已转向验证OpenMP的实际加速效果,并发现尽管其在基准测试中表现出显著优势,但在实际业务工程应用时却遭遇了挑战。由于现有工程完全依赖于由CMake构建的Makefile体系,直接修改Makefile以整合OpenMP支持无疑会增加额外的工作量。
在这里插入图片描述
1、一种解决方案是联系RK(瑞芯微)厂家,请求提供一个内建OpenMP支持的交叉编译器版本,或者自行构建这样一个工具链。然而,鉴于目前的知识储备尚不足以完成这一任务,该方案暂时尚未实施
2、另个一个可行的方案是,将预先编译好的libgomp库作为静态或动态链接库与可执行文件进行链接。这种方法虽然理论上可行,但在调用OpenMP接口和管理库依赖方面可能会遇到复杂性问题,需要进一步技术评估。

接下来的步骤,我们将把注意力转向Intel Threading Building Blocks (TBB) 并行编程库,计划对其进行编译和测试验证,以对比分析其对项目性能提升的效果。

C++常用库使用实例(四) Threading Building Blocks (TBB) ntel的Threading Building Blocks (TBB) 是一个用于C++的并发编程库,它提供了丰富的数据结构和算法来帮助开发者充分利用多核处理器的性能。以下是一个使用ZeroMQ的基本例子,包括一个服务器端和一个客户端,展示了如何在C++中进行简单的消息发送和接收。为Windows上的C++项目开发者提供了一个非常方便的第三方库管理方案,极大地简化了库的安装和项目配置过程。安装的库,你需要配置你的项目,使之能够找到库文件。 阅读详情

相关推荐

TBB——使用lambda进行并行加速

TBB是Intel的并行加速框架,有CPU进行线程的管理,可以支持AMD。因为是CPU直接进行线程的管理,会比普通的线程速度更快,同时比起普通线程需要自己管理TBB不需要自己去管理,相对会方便一定,他可以自己确定需要开辟的线程数,同时有很好的扩展性,除了可以发挥更好的性能优势外,在CPU进行升级之后它也可以自动进行扩展。 看到教程中使用TBB都是以对象为例的,但是需要写一个类,个人觉得比较实用的还是lambda表达式的形式,毕竟一般都是对某个方法使用线程,不想去封装一个类。 tbb::parallel_fo

windxgz的博客 1898

c++多线程学习(OpenMP、tbb)

c++并行学习

叶 2627

OpenCV跨平台开发实战:Windows与Linux环境配置、编译部署全解析

计算机视觉作为人工智能的核心领域之一,旨在使计算机能够从图像或视频中获取信息、理解内容并做出决策。其基本原理涉及图像处理、特征提取、模式识别等多个层面,通过算法模拟人类视觉系统。这项技术的价值在于将物理世界的视觉信息转化为可计算、可分析的数据,极大地拓展了机器的感知能力。在工程实践中,计算机视觉技术已广泛应用于工业自动化、智能安防、自动驾驶、医疗影像分析以及增强现实等多个关键场景。实现这些应用的基础,离不开稳定、高效的开发环境搭建,尤其是在不同的操作系统平台上。本文聚焦于OpenCV这一核心工具库,深入探讨

weixin_30425949的博客 307

opencv中的TBB

通过观察源码,opencv3.0中只有canny和histogram里面有TBB版的代码,而且opencv3.0默认附带IPP加速,在执行IPP版的代码后就不会执行TBB版的,所以opencv声称的所谓TBB很鸡肋,要想把代码改写为多线程的,还是要亲自调用TBB库 相关: OpenCV对TBB的支持 VS2010+OpenCV2.3.1环境下使用tbb加速示例 TBB(Intel

Kelvin_Yan的专栏 6223

上下文理解的AI增强方案:AI应用架构师的架构洞察

本文将从AI应用架构师的视角,深入探讨“上下文理解”的技术本质、核心挑战,以及一套可落地的上下文增强架构方案。我们会拆解上下文理解的底层需求,分析架构设计中的关键决策,并通过具体案例展示如何构建一个能“记住过去、理解现在、预测未来”的AI系统。三个维度:上下文的内容范围(短期/中期/长期)、数据类型(文本/结构化/多模态)、技术挑战(窗口限制/信息过载/跨会话一致性);三种架构模式:分层上下文存储(热/冷数据分离)、上下文路由(按需筛选)、动态压缩(适配模型窗口);四个关键组件。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 220

PM1132-220V转5V电源芯片:SOT-23-3封装的高效电源解决方案

在现代电子设备小型化和高效化的趋势下,PM1132芯片凭借其的能力与特性,成为工业控制IoT设备及便携电器的理想电源管理方案。以下从核心技术设计挑战和应用实践展开分析。

M_D13Z476I000l的博客 804

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

OPENMP,TBB,多线程加速效果的对比

lez1021的博客 1979

gnuradio+b210实现FM收音机

gnuradio+b210实现FM收音机环境介绍FM接收1 Flow Graph2 变量参数FM发射1 Flow Graph 环境介绍 Name Version gnuradio 3.7.14.0 uhd 3.15.0.0 ubuntu 18.04 usrp b210 参考 https://www.ijedr.org/papers/IJEDR1702038.pdf Audio File Transmission using GNURADIO and USRP FM接

u011745228的博客 5126

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

在RV1106上尝试编译TBB加速工具

lez1021的博客 1392

OpenCV13-图像噪声:椒盐噪声和高斯噪声

考虑到椒盐噪声会在图像中的任何一个位置随机产生,因此对于椒盐噪声的生成,需要使用OpenCV中能够产生随机数的函数。OpenCV中也没有专门为图像添加高斯噪声的函数,对早在图像中添加椒盐噪声的过程,可以根据需求利用能够产生随机数的函数来完成在图像中添加高斯噪声的任务。椒盐噪声又称作脉冲噪声,他会随机改变图像中的像素值,其样子就像是在图像上随机地撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。函数能够产生均匀分布或者高斯分布的随机数,可以利用该函数产生符合高斯分布的随机数,之后在图像中加入这些随机数即可。

SHLYYY 5122

AI嵌入式系统测试:从确定性验证到概率性评估的体系构建

软件测试是保障系统质量的关键环节,其核心在于验证功能是否符合预期。传统嵌入式测试聚焦于确定性逻辑,通过代码覆盖、边界值分析等方法确保时序、内存等指标的精确性。随着人工智能技术的普及,深度学习模型以其概率性输出和复杂非线性映射的特性,为嵌入式系统带来了新的能力,也彻底改变了测试的范式。AI模型的‘黑盒’特性使得测试目标从‘绝对正确’转向‘置信度满足’,并催生了准确率、F1分数等新指标。在工程实践中,这种融合要求测试体系必须扩展维度,将数据质量、模型量化损失、资源约束下的精度与性能权衡纳入核心考量。尤其在嵌入式

weixin_26766559的博客 382

openmp编程在linux下编译命令,OpenMP在ARM-Linux以及NDK中的编译和使用

以前对OpenCV在ARM-Linux,ARM-Android上的优化做了很多编译方面的努力,例如添加TBB支持,添加CUDA支持(NvidiaK1平台上)。这次突然听同事说增加了OpenMP选项后,在Windows+X86上有极大的优势,adaboost速度提高3倍。所以赶快在ARM-Android-NDK上测试一下。0. OpenMP基础:OpenMP(OpenMulti-Processing...

weixin_42635849的博客 1474

京东豆自动领取脚本配置教程

腾讯云/阿里云服务器(Docker环境):全自动跑脚本领京豆(无需本地代理,使用加速源)

AIOT魔法师 859

cpu和gpu常见加速方法

特别是 OpenCL 为应用程序提供了对 GPU 的访问,在计算机视觉中,许多算法可以在 GPU 上比在 CPU 上更有效地运行:例如 图像处理、矩阵运算、计算摄影、物体检测等。当选择忽略这些#pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。程序员通过在源代码中加入专用的#pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。3)灵活地适合不同的多核平台。

tony365的博客 9134

YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

大家好!欢迎阅读本专栏。本专栏涵盖了YOLO8中C2f、主干网络、检测头、注意力机制、Neck等多种结构的创新,同时也包括了 YOLO相关的基础知识以及相关项目。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 3万+

Python爬虫抓取学术期刊数据(Springer、Elsevier)

本文详细介绍了如何使用Python爬虫抓取学术期刊网站(如Springer、Elsevier)上的文章信息,并进行数据清洗和存储。我们使用了requestsSeleniumpandas等技术,通过模拟浏览器行为来绕过反爬虫机制,并将数据保存为Excel文件,方便后续分析。未来,我们可以通过加入更多的期刊网站数据源,扩展爬虫的功能,抓取更多的学术数据。同时,结合自然语言处理(NLP)技术,可以对抓取的文章进行自动化的摘要提取和主题分类,为学术研究提供更多的支持。

2201_76125261的博客 1487

跨平台部署实战:OpenCV完整安装与优化指南

OpenCV作为计算机视觉领域的标准库,其跨平台部署能力直接影响项目开发效率。本文提供macOS、Linux、Windows三平台的OpenCV完整安装方案,涵盖源码编译、Python绑定、性能优化等关键技术细节,为中级开发者和技术决策者提供可落地的部署策略。 ## 系统架构与核心组件 OpenCV采用模块化设计,核心架构包含基础模块、图像处理、机器学习、深度学习等组件。在部署前需了解各模块依

gitblog_00768的博客 739

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

二、RK3588-实战:从源码编译到部署OpenCV-4.8.1(C++)的完整指南

本文详细介绍了在RK3588开发板上从源码编译到部署OpenCV-4.8.1(C++)的完整指南。通过优化CMake配置、调整编译参数和系统设置,显著提升OpenCV在RK3588上的性能表现,特别适合需要处理高清视频流或复杂算法的嵌入式应用场景。

weixin_30698297的博客 360

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OpenMP在ARM-Linux以及NDK中的编译和使用

OpenMP在ARM-Linux以及NDK中的编译和使用

jacke121的专栏 6235

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

国产系统OpenCV离线部署实战与优化

计算机视觉库OpenCV作为AI开发的核心组件,其跨平台部署能力直接影响项目落地效率。在国产操作系统生态中,由于特殊的CPU架构和软件包管理体系,常规安装方法往往失效。通过CMake定制编译参数、处理国产化依赖关系、优化二进制打包策略,可以实现OpenCV在龙芯等国产CPU平台的高效离线部署。本文以统信UOS为例,详解从源码编译、依赖闭环处理到制作自解压安装包的全流程,特别包含针对国产平台的性能调优技巧,如禁用OpenCL、启用TBB并行库等方案,实测可提升20%运行效率。这些方法同样适用于其他依赖复杂的A

a2850363633的博客 450

linux stlport 编译,OpenMP在ARM-Linux以及NDK中的编译和使用

OpenMP在ARM-Linux以及NDK中的编译和使用参考:http://blog.sina.com.cn/s/blog_602f87700102w1ki.html以前对OpenCV在ARM-Linux,ARM-Android上的优化做了很多编译方面的努力,例如添加TBB支持,添加CUDA支持(NvidiaK1平台上)。这次突然听同事说增加了OpenMP选项后,在Windows+X86上有极大的...

weixin_42691065的博客 221

基于树莓派5与OpenCV的嵌入式人脸识别系统实战指南

本文详细介绍了基于树莓派5与OpenCV的嵌入式人脸识别系统开发全流程,包括硬件准备、系统配置、OpenCV深度优化编译、现代人脸识别模型部署以及实际应用开发框架。通过实战案例和优化技巧,帮助开发者高效构建高性能嵌入式人脸识别系统,适用于智能门禁、考勤管理等场景。

weixin_30689307的博客 494

在macOS上从源码编译OpenCV:专业开发者的完整指南

想要在macOS上搭建专业的计算机视觉开发环境吗?OpenCV作为计算机视觉领域的瑞士军刀,为开发者提供了从基础图像处理到深度学习推理的全套工具。本文将带你深入探索在macOS系统上从源码编译OpenCV的最佳实践,无论是Apple Silicon还是Intel芯片,都能获得最优性能。 ## 🚀 为什么选择源码编译? 你可能已经尝试过`pip install opencv-python`的便

gitblog_07206的博客 410

opencv3.1 for arm 编译指南

1.CMAKE使用 cmake -DCMAKE_BUILD_TYPE=Release -DWITH_IPP=OFF -DWITH_OPENCL=ON -DWITH_OPENCL_SVM=OFF -DWITH_OPENCLAMDFFT=OFF -DWITH_OPENCLAMDBLAS=OFF -DBUILD_SHARED_LIBS=ON -DBUILD_IPP_IW=OFF -DBUILD_IT...

u011942916的专栏 460
上一篇: Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(一)
下一篇: Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(三)
沉木渡香
博客等级 码龄14年 652粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉木渡香

感谢鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值