概述
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的全部内容,希望文章能够帮你解决opencv cpu指令集SSE/AVX所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复