SSE与AVX指令集

SSE指令集是英特尔提供的基于SIMD单指令多数据,也就是说同一时间内,对多个不同的数据执行同一条命令)的硬件加速指令,通过使用寄存器来进行并行加速。经过几代的迭代,最新的SSE4已经极大地扩展了指令集的功能,并且随后已经从128位寄存器继续扩展到256位的指令。

想要使用SSE或AVX指令集,需要包含以下头文件

#include <mmintrin.h>   //mmx, 4个64位寄存器
#include <xmmintrin.h>  //sse, 8个128位寄存器
#include <emmintrin.h>  //sse2, 8个128位寄存器
#include <pmmintrin.h>  //sse3, 8个128位寄存器
#include <smmintrin.h>  //sse4.1, 8个128位寄存器
#include <nmmintrin.h>  //sse4.2, 8个128位寄存器
#include <immintrin.h>  // avx, 16个256位寄存器

checkHardwareSupportCV_SSE系列指令集的预编译符号定义在opencv2/core/cvdef.hpp这个头文件中,如果你不包含这个头文件的话,把源码拷贝到自己的函数中 。

/* CPU features and intrinsics support */
#define CV_CPU_NONE             0
#define CV_CPU_MMX              1
#define CV_CPU_SSE              2
#define CV_CPU_SSE2             3
#define CV_CPU_SSE3             4
#define CV_CPU_SSSE3            5
#define CV_CPU_SSE4_1           6
#define CV_CPU_SSE4_2           7

检测是否支持指令集

#define USE_SSE2  (cv::checkHardwareSupport(CV_CPU_SSE2))
#define USE_SSE4_2  (cv::checkHardwareSupport(CV_CPU_SSE4_2))
#define USE_AVX  (cv::checkHardwareSupport(CV_CPU_AVX))
#define USE_AVX2  (cv::checkHardwareSupport(CV_CPU_AVX2))

在上述代码中,如果编译符号CV_SSE被定义过,则调用checkHardwareSupport(CV_CPU_SSE); 获取你的电脑上的CPU是否支持CPU_SSE指令集优化特性。如果查询结果为真,就说明你的CPU在当前状态下支持CPU_SSE指令集优化特性。如果查询结果为假,就说明你的CPU不支持CPU_SSE指令集优化。但是这并不说明你的CPU硬件本身不支持SSE指令集优化特性

相关函数

CPU指令集优化功能可以根据需要开启或关闭:
首先可以使用此函数 bool cv::useOptimized()来查询当前是否开启了CPU指令集优化功能;
可以使用函数void cv::setUseOptimized(bool onoff)来设置是否开启CPU指令集优化功能;
可以使用此函数 bool checkHardwareSupport(int feature);来查询你的CPU是否支持某种指令集优化特性。

 //设置是否启用指令集优化特性cv::setUseOptimized(true);//获取当前机器的CPU指令集支持特性bool opt_status = cv::useOptimized();std::cout << "当前的指令集优化状态:" << opt_status << std::endl;//检查硬件支持volatile bool simd = cv::checkHardwareSupport(CV_CPU_SSE);std::cout << "HardwareSupport(CV_CPU_SSE): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_MMX);std::cout << "HardwareSupport(CV_CPU_MMX): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_SSE2);std::cout << "HardwareSupport(CV_CPU_SSE2): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_SSE3);std::cout << "HardwareSupport(CV_CPU_SSE3): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_SSSE3);std::cout << "HardwareSupport(CV_CPU_SSSE3): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_SSE4_1);std::cout << "HardwareSupport(CV_CPU_SSE4_1): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_SSE4_2);std::cout << "HardwareSupport(CV_CPU_SSE4_2): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_POPCNT);std::cout << "HardwareSupport(CV_CPU_POPCNT): " << simd << std::endl;simd = cv::checkHardwareSupport(CV_CPU_AVX);std::cout << "HardwareSupport(CV_CPU_AVX): " << simd << std::endl;//输出
当前的指令集优化状态:1
HardwareSupport(CV_CPU_SSE): 1
HardwareSupport(CV_CPU_MMX): 1
HardwareSupport(CV_CPU_SSE2): 1
HardwareSupport(CV_CPU_SSE3): 1
HardwareSupport(CV_CPU_SSSE3): 1
HardwareSupport(CV_CPU_SSE4_1): 1
HardwareSupport(CV_CPU_SSE4_2): 1
HardwareSupport(CV_CPU_POPCNT): 1
HardwareSupport(CV_CPU_AVX): 1

main()主函数中通过setUseOptimized()函数来设置是否启用OpenCV的指令集优化功能。

CPU加速

OpenCV速度没有达到项目要求怎么办,其实OpenCV发展到今天在不同的架构平台上都有一些底层的指令集支持的加速方法,在Windows系统下,OpenCV编译默认支持加速SSE3 指令集,同时还额外支持SSE4.2、AVX、AVX2等加速指令集,在编译时候CMake配置文件提供了下面选项支持:

CPU_BASELINE=SSE2 CPU_BASELINE=AVX 需要C++编译器支持 CPU_DISPATCH=SSE4_2,AVX CPU_DISPATCH=AVX CPU_DISPATCH=AVX,AVX2 额外的加速支持,同样需要编译器支持。

opencv cpu指令集SSE/AVX相关推荐

  1. TensorFlow CPU环境 SSE/AVX/FMA 指令集编译

    TensorFlow CPU环境 SSE/AVX/FMA 指令集编译 sess.run()出现如下Warning W tensorflow/core/platform/cpu_feature_guar ...

  2. 一文读懂SIMD指令集 目前最全SSE/AVX介绍

    SIMD指令集 SSE/AVX 概述 参考手册 Intel® Intrinsics Guide Tommesani.com Docs Intel® 64 and IA-32 Architectures ...

  3. (TF)Anaconda安装Tensorflow+Keras+Jupyter Notebook 老电脑(CPU不支持AVX指令集)

    (TF)Anaconda安装Tensorflow+Keras+Jupyter Notebook 老电脑(CPU不支持AVX指令集) 目录     - 1.安装anaconda最新版本     - 2. ...

  4. TensorFlow SSE/AVX/FMA 指令集编译

    当TensorFlow出现 I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions th ...

  5. SSE/AVX指令集学习笔记

    ​ 因为最近在做SSE/AVX指令集优化视频编码的某些模块,所以要学习SSE指令集的用法.本帖主要记录本人用到的函数的用法. 一.SSE指令(128位寄存器) __m128i _mm_load_si1 ...

  6. SIMD 编程的优势与SIMD指令:SSE/AVX 与编程demo

    资源:https://download.csdn.net/download/Rong_Toa/18745608 <Benefits of SIMD Programming | SIMD的优势&g ...

  7. 单指令多数据SIMD的SSE/AVX指令集和API

    https://software.intel.com/sites/landingpage/IntrinsicsGuide/# Technologies MMX SSE SSE2 SSE3 SSSE3 ...

  8. 如何查看CPU指令集

    如何查看CPU指令集 芯片 指令集 Intel i5 x86.MMX.SSE.SSE2.SSE3.SSSE3.x86-64.SSE4.SSE4.2.EM64T.SSE4.1.VT-X.AES.AVX. ...

  9. CPU指令集是什么东西,以及指令集的架构有哪些(有哪些大类),以及具体的指令集都有哪些

    这篇文章来自于农夫山泉,我们是大自然的搬运工,哈哈,文章来源于网络 https://blog.csdn.net/yu132563/article/details/55251534 这个问题包括CPU的 ...

最新文章

  1. 人工神经网络-2020-第十四周-人工神经网络硬件实现-备课
  2. 谷歌开发者工具详解 Network篇
  3. IT人士的知识管理-第一篇
  4. 真静态和伪静态的区别
  5. 宣布EAXY:使Java中的XML更容易
  6. 高通总裁安蒙在“GSMA Thrive”中分享了哪些关键信息?
  7. [转载] ASP.NET MVC4使用百度UEDITOR编辑器
  8. C#-记录一些常见的语法特性
  9. Extjs项目实战视频教程
  10. 组合使用Memento模式与Command模式实现多级Redo和Undo
  11. endnote中科大版区别_EndNote X7
  12. Asterisk增加g729编码支持
  13. 《信任的速度》读后感
  14. [隐匿的学习笔记]JVM(2)运行时数据区
  15. YOUKU播放器 研究
  16. bmi计算器公式_bmi计算公式
  17. 北京公积金贷款不够用 提升额度或有利刚需购房
  18. 优雅编程之这样使用枚举和注解,你就“正常”了(二十九)
  19. 使用有道词典API做一个简单的翻译页面 HTML+JS+有道词典API(代码可直接运行)
  20. 易基因|3文聚焦:宏病毒组测序在肠病中的应用研究

热门文章

  1. SEO将要苏醒,请乘坐你网络营销的班车
  2. linux内核编译和安装
  3. 关于成功的7个小故事
  4. 2021年广东省安全员B证(项目负责人)证考试及广东省安全员B证(项目负责人)作业考试题库
  5. VBA宏:outlook收件箱中发件人使用联系人
  6. 电子商务专业(技术方向)学习经验(忠告)
  7. Linux下lt9611调试总结
  8. 通信工程计算机论文,电子通信工程论文范文
  9. java label设置字体颜色_Java中怎么设置JLabel的字体样式,大小,颜色
  10. 运筹学——各类求解优化