惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 聂微东
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
美团技术团队
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
博客园_首页
宝玉的分享
宝玉的分享
C
Check Point Blog
爱范儿
爱范儿
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
The Register - Security
The Register - Security
U
Unit 42
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Docker
博客园 - Franky
博客园 - 【当耐特】
腾讯CDC
N
Netflix TechBlog - Medium
Jina AI
Jina AI
博客园 - 司徒正美
Last Week in AI
Last Week in AI
PCI Perspectives
PCI Perspectives
GbyAI
GbyAI
Security Archives - TechRepublic
Security Archives - TechRepublic
J
Java Code Geeks
Cloudbric
Cloudbric
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Y
Y Combinator Blog
F
Full Disclosure
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
L
LINUX DO - 最新话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Security Affairs
Recent Announcements
Recent Announcements
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts

博客园 - 凤凰_1

多边形近似:最小周长多边形算法MPP 多阈值otsu的opencv实现 在Opencv中自定义了一个相位函数,获取复数矩阵的相位 cvIsInf与cvIsNan函数 Mandelbrot set 以parallel_for_实现 CV_WRAP和CV_EXPORTS_W opencv超级像素示例 opencv中自定义的双线性二次插值的图像旋转及缩放 在Qt中,如何在sheets末端添加新的sheet opencv4.x 中的plot函数绘制二维Mat C++版DNN最简主体框架 C++版全连接神经网络 C++版加载MNIST图像集合 C++版的神经网络训练用的图像集合加载 c\c++宏定义,四个参数求最大值 - 凤凰_1 - 博客园 自定义c++二维动态数组 用Cmake 编译OpenCV常见的错误 Opencv中的dft()和idft()示例 C++仿Matlab的bsxfun函数
opencv的并行操作parallel_for_的问题
凤凰_1 · 2024-06-19 · via 博客园 - 凤凰_1

第一次运行时,并行计算会比普通计算要快很多,如图1所示。可是第二次运行,两种方式所用时间基本差不多,有高手能指点下吗?

这段程序我是参考了下面这篇文章:

OpenCV并行加速Parallel_for_与ParallelLoopBody教程_void operator()(const range& range)-CSDN博客

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

using namespace cv;
using namespace std;

class PllMul:public ParallelLoopBody//并行计算类
{
public:
    PllMul(const Mat& _src1,const Mat&_src2,Mat& _result)
    {
        int cn=_src1.channels();
        _src1.convertTo(src1,CV_32FC(cn));
        _src2.convertTo(src2,CV_32FC(cn));
        _result.convertTo(result,CV_32FC(cn));

        CV_Assert(src1.channels()==src2.channels()
                  &&src1.rows==src2.rows
                  &&src1.cols==src2.cols);
        rows=src1.rows;
        cols=src1.cols;
    }
    void operator()(const Range&range)const //重载括号()运算符
    {
        int totalPixs=range.end-range.start;
        float *presult=(float*)(result.data);
        float *ps1    =(float*)(src1.data);
        float *ps2    =(float*)(src2.data);
        int cn=src1.channels();
        for(int i=0;i<totalPixs;i++)
        {
            for(int k=0;k<cn;k++)
                presult[k]=ps1[k]*ps2[k];

            presult+=cn;
            ps1    +=cn;
            ps2    +=cn;
        }
    }
    Mat result;//为了方便测试,设为了共有成员
private:
    Mat src1;
    Mat src2;
    int rows;
    int cols;
};
class MyMul             //普通计算类
{
public:
    MyMul(const Mat& _src1,const Mat&_src2,Mat& _result)
    {
        int cn=_src1.channels();
        _src1.convertTo(src1,CV_32FC(cn));
        _src2.convertTo(src2,CV_32FC(cn));
        _result.convertTo(result,CV_32FC(cn));

        CV_Assert(src1.channels()==src2.channels()
                  &&src1.rows==src2.rows
                  &&src1.cols==src2.cols);
        rows=src1.rows;
        cols=src1.cols;

    }
    void operator()(const Range&range)const //重载括号()运算符
    {
        int totalPixs=range.end-range.start;
        float *presult=(float*)(result.data);
        float *ps1    =(float*)(src1.data);
        float *ps2    =(float*)(src2.data);
        int cn=src1.channels();
        for(int i=0;i<totalPixs;i++)
        {
            for(int k=0;k<cn;k++)
                presult[k]=ps1[k]*ps2[k];

            presult+=cn;
            ps1    +=cn;
            ps2    +=cn;
        }
    }
    
    Mat result;//为了方便测试,设为了共有成员
private:
    Mat src1;
    Mat src2;
    int rows;
    int cols;
};
void testMllWithoutParallel(Mat &s1,Mat&s2,Mat&result1)//普通计算模式测试
{
    result1=Mat(s1.size(),s1.type(),Scalar::all(0));
    PllMul mul(s1,s2,result1);
    mul(Range(0,s1.rows*s1.cols));//调用括号()运算符函数
    cout<<"OK!"<<endl;
}
void testPllMllWithParallel(Mat&s1,Mat&s2,Mat&result)//并行计算模式测试
{
    result=Mat(s1.size(),s1.type(),Scalar::all(0));
//    PllMul mul();
    cv::parallel_for_(Range(0,s1.rows*s1.cols),PllMul(s1,s2,result));//隐式调用括号()运算符函数
    cout<<endl<<"OK!"<<endl;
}
int main()
{
    Mat s1(1000,1000,CV_8UC3),s2(1000,1000,CV_8UC3);
    Mat result1,result2;
    randu(s1,0,10);randu(s2,0,10);
    clock_t start,stop;

    start=clock();
    testMllWithoutParallel(s1,s2,result1);
    stop=clock();
    cout<<"Running time using \'parallel for \':" << (double)(stop - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl;

    start=clock();
    testPllMllWithParallel(s1,s2,result2);
    stop=clock();
    cout << "Running time using \'common call function \':" << (double)(stop - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl;

    return 0;
}

       图1. 第一次运行结果

 图2. 第二次运行结果