C++基础10:并行加速与OpenCV数据结构

目录

一.程序加速

1.编程基本原则

2.代码优化策略

3.SIMD

4.openMP

二.避免内存拷贝(OpenCV)

1.什么是图像

2.Mat

3.Step

4.ROI


一.程序加速

1.编程基本原则

短、简洁、有效率

2.代码优化策略

        a)选择合适的算法(算法复杂度)

        b)代码简洁简单(易读)

        c)高效的内存读写(地址相连效率高)

        d)避免内存拷贝(代码会变得更加复杂)(指针)

        e)循环里面或者执行很多次不要加printf(),cout,会阻塞程序执行

        f)查表法(计算机擅长整数的加法乘法)(三角函数精度要求不高用查表法)

        g)SIMD, OpenMP

3.SIMD

一个指令处理多个数据

C++基础10:并行加速与OpenCV数据结构_第1张图片

两个向量相加,将几个元素一起装在到寄存器里面去,一个指令一次加完,上面提速4倍

  • OpenCV: Universal intrinsics
  • 使用OpenCV中的universal intrinsics为算法提速(1)(2)(3)
    • 使用OpenCV中的universal intrinsics为算法提速 (1)
    • 使用OpenCV中的universal intrinsics为算法提速 (2)
    • 使用OpenCV中的universal intrinsics为算法提速 (3)

4.openMP

SIMD是在一个cpu核上

openMP将任务分给不同cpu核去运行

C++基础10:并行加速与OpenCV数据结构_第2张图片

#include 
#pragma omp parallel for
for (size_t i = 0; i < n; i++)
{
   c[i] = a[i] + b[i];
}

二.避免内存拷贝(OpenCV

1.什么是图像

C++基础10:并行加速与OpenCV数据结构_第3张图片

C++基础10:并行加速与OpenCV数据结构_第4张图片

C++基础10:并行加速与OpenCV数据结构_第5张图片

2.Mat

C++基础10:并行加速与OpenCV数据结构_第6张图片

C++基础10:并行加速与OpenCV数据结构_第7张图片

Refcount,OpenCV申请内存时多申请4个字节,记录这块内存被多少头引用

头释放Refcount-1,减到0,将数据mat释放

3.Step

4行3列矩阵

每一行3个字节

可以申请3,4,8个字节

如果是8的话可以做内存对齐,做SIMD时比较方便

4.ROI

C++基础10:并行加速与OpenCV数据结构_第8张图片

  • Mat A
    • rows=100
    • cols=100
    • step=100
    • data=0xABCDEF00
  • Mat B
    • rows=100
    • cols=100
    • step=100
    • data=0xABCDEF00
  • Mat C
    • rows=30
    • cols=28
    • step=100  第二行=第一行+step(偏移100个地址)加29次到30
    • data=0xABCE0698

你可能感兴趣的:(C++,opencv,c++,算法)