opencv之并行计算多线程parallel_for_

这篇具有很好参考价值的文章主要介绍了opencv之并行计算多线程parallel_for_。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、加速案例

三、代码分析      


一、前言

        OpenCV提供了多线程处理的API。从OpenCV 4.5版本开始,它引入了对C++11标准的并行算法的支持。这意味着你可以使用多线程来加速你的OpenCV代码。在OpenCV中,利用parallel_for_接口实现并行加速。

二、加速案例

        先看一个案例,以下代码中,有两个函数:

  • my_test1() 函数就是一个最常见的串行处理函数(默认随便将10000个数进行加减乘除);
  • my_test2() 函数是利用parallel_for_实现并行处理。

注意:opencv使用的版本是4.5。

#include<opencv2/opencv.hpp>
using namespace cv;
#include <numeric> // std::iota 

const int g_num = 10000;

// 单线程
void my_test1(double* p_arr)
{
     for (size_t i = 0; i < g_num; i++)
     {
         int p_arr_i = p_arr[i];
         for (size_t j = 0; j < g_num; j++)
         {
              double num1 = p_arr_i * (j > 10 ? 10 : j);
              double num2 = std::pow(num1, 2);
              double num3 = std::sqrt(num2);
              p_arr[i] = num3;
              p_arr[i] = p_arr_i * num3;
              p_arr[i] = p_arr[i] / num3;
         }
     }
}


// 多线程 
void my_test2(double* p_arr)
{
     
     parallel_for_(Range(0, g_num), [&](const Range& r)
         {
             for (int oc = r.start; oc < r.end; oc++)
             {
                 // 类似于cuda核函数部分
                 int p_arr_i = p_arr[oc];
                 for (size_t j = 0; j < g_num; j++)
                 {
                     double num1 = p_arr_i * (j > 10 ? 10 : j);
                     double num2 = std::pow(num1, 2);
                     double num3 = std::sqrt(num2);
                     p_arr[oc] = num3;
                     p_arr[oc] = p_arr_i * num3;
                     p_arr[oc] = p_arr[oc] / num3;
                 }
             }
         });
 }
 
int main()
{
     double numbers[g_num];
     int st = 0;
     std::iota(numbers, numbers + g_num, st); // 100 101 102 103 
 
 
     double t = (double)getTickCount();
     my_test1(numbers);
     t = (double)getTickCount() - t;
 
     double t2 = (double)getTickCount();
     my_test2(numbers);
     t2 = (double)getTickCount() - t2;
 
     printf("my_test1 costs time = %.1fms\n", t * 1000 / getTickFrequency());
     printf("my_test2 costs time = %.1fms\n", t2 * 1000 / getTickFrequency());
 
 
     system("pause");
     return 0;
}

如下图,my_test2函数执行速度是my_test1的10倍!

++i i++ parallel_for,OpenCV高级篇,opencv,人工智能,计算机视觉

三、代码分析      

 对于opencv这个多线程加速(其他加速框架,例如cuda也是同理),任务必须足够复杂再有加速效果,例如:数组中,每个像素+1这种简单的任务,还不如for循环单线程快。另外就是,opencv这个并行API:parallel_for_使用简单,无非就是把适合并行的“核函数”部分写到合适位置,例如:

parallel_for_(Range(0, g_num), [&](const Range& r)
        {
            for (int oc = r.start; oc < r.end; oc++)
            {
                // 代码中并行部分,类似于核函数部分
                int p_arr_i = p_arr[oc];
                for (size_t j = 0; j < g_num; j++)
                {
                    double num1 = p_arr_i * (j > 10 ? 10 : j);
                    double num2 = std::pow(num1, 2);
                    double num3 = std::sqrt(num2);
                    p_arr[oc] = num3;
                    p_arr[oc] = p_arr_i * num3;
                    p_arr[oc] = p_arr[oc] / num3;
                }
            }
        });

以下是串行处理代码,和上面并行代码对比,写法其实差不多。文章来源地址https://www.toymoban.com/news/detail-775808.html

for (size_t i = 0; i < g_num; i++)
     {
         int p_arr_i = p_arr[i];
         for (size_t j = 0; j < g_num; j++)
         {
              double num1 = p_arr_i * (j > 10 ? 10 : j);
              double num2 = std::pow(num1, 2);
              double num3 = std::sqrt(num2);
              p_arr[i] = num3;
              p_arr[i] = p_arr_i * num3;
              p_arr[i] = p_arr[i] / num3;
         }
     }

到了这里,关于opencv之并行计算多线程parallel_for_的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 任务并行类库Parallel调用示例

    Task Parallel Library 是微软.NET框架基础类库(BCL)中的一个,主要目的是为了简化并行编程,可以实现在不同的处理器上并行处理不同任务,以提升运行效率。Parallel常用的方法有For/ForEach/Invoke三个静态方法。

    2024年02月04日
    浏览(33)
  • Java Stream对象并行处理方法parallel()

            Stream.parallel() 方法是 Java 8 中 Stream API 提供的一种并行处理方式。在处理大量数据或者耗时操作时,使用 Stream.parallel() 方法可以充分利用多核 CPU 的优势,提高程序的性能。本文将从以下几个方面对 Stream.parallel() 进行详解。 什么是 Stream.parallel() 方法         

    2024年02月16日
    浏览(63)
  • 如何解决“library load load opencv_core_parallel_tbb460_64d.dll =>FAILED”类的信息

    如何解决“library load load opencv_core_parallel_tbb460_64d.dll =FAILED”类的信息 对于这类信息不会影响release的发布版结果,但是debug会有错误信息输出,如果是强迫症患者可以考虑以下的两种方法: 1、直接将opencv的Log日志等级修改,比如:OPENCV_LOG_LEVEL=e,这样可以避免输出此类信息,

    2024年02月16日
    浏览(40)
  • 解放计算力:使用并行处理提升python for循环速度

    Python 是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈。幸运的是,Python 提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作。本文将介绍如何使用并行处理技术来优化 for 循环,从而提高 Python 程序的执行速度。

    2024年02月10日
    浏览(49)
  • 【Linux】使用Bash和GNU Parallel并行解压缩文件

    在本教程中,我们将学习如何使用Bash脚本和GNU Parallel实现高效并行解压缩多个文件。这种方法在处理大量文件时可以显著加快提取过程。 先决条件 确保系统上已安装以下内容: Bash GNU Parallel 你可以使用以下命令在不同Linux系统上安装它们: 在Ubuntu上安装 在CentOS上安装 想象

    2024年02月04日
    浏览(39)
  • 每日一博 - MPP(Massively Parallel Processing,大规模并行处理)架构

    MPP(Massively Parallel Processing,大规模并行处理)架构是一种常见的数据库系统架构,主要用于提高数据处理性能。它通过将多个单机数据库节点组成一个集群,实现数据的并行处理。 在 MPP 架构中,MPP采用 非共享架构(Share Nothing) , 每个节点都拥有独立的磁盘存储和内存系

    2024年02月12日
    浏览(43)
  • torch分布式数据并行:torch.nn.parallel.DistributedDataParallel(DDP),代码书写步骤

    多进程做多卡训练; 目录 1 初始化进程组: 2 当前进程所能用到的GPU卡的名称 3 将数据集随机分配到不同的GPU上 4 将train_sampler传入DataLoader中 5 将数据进行拷贝 6 模型放到GPU上 7 执行命令 8 模型保存 9 加载模型 10 注意事项 代码编写流程: 1 初始化进程组: ‘nccl’ 指定GPU之

    2024年02月15日
    浏览(37)
  • 实际并行workers数量不等于postgresql.conf中设置的max_parallel_workers_per_gather数量

    本文件的源码来自PostgreSQL 14.5,其它版本略有不同 并行workers并不能显箸提升性能。个人不建议使用并行worker进程,大多数情况下采用postgresql.conf默认配置即可。 PostgreSQL的并行workers是由compute_parallel_worker函数决定的,compute_parallel_worker是估算扫描所需的并行工作线程数,并不

    2024年02月10日
    浏览(34)
  • Opencv for unity 下载

    GitHub - EnoxSoftware/VideoPlayerWithOpenCVForUnityExample: This example shows how to convert VideoPlayer texture to OpenCV Mat using AsyncGPUReadback. OpenCV for Unity | Integration | Unity Asset Store

    2024年02月03日
    浏览(23)
  • 【Qt 多线程+opencv 读取和显示图像】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 加入了信号与槽机制来处理多线程中的图像数据: 创建工作线程类 :首先创建一个工作线程类,它从

    2024年02月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包