Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VS2019自带的增强型指令集和自我优化的版本速度比较.

VS2019自带的增强型指令集和自我优化的版本速度比较.

作者头像
用户1138785
发布于 2024-02-28 00:09:29
发布于 2024-02-28 00:09:29
21400
代码可运行
举报
运行总次数:0
代码可运行

  去年年底把工程项目由VS的2015升级到2019版本,本以为直接配置下运行环境就可以了,但是一编译发现一大堆错误,所有的错误都指向一系列的指令集,比如_mm_exp_ps、_mm_log_ps、_mm_pow_ps等等,后面发现原来从2019版本开始,编译器已经自带了这些常用的函数,所以自己函数和系统的重名了,也就无法通过编译了。

   这个时候只能把自己大函数名都适当的进行修改,再重新编译了.

  我们在intel的关于指令集方面的官方网站也发现了一些信息: 比如_mm_exp_ps,其说明如下:

  注意其中的Sequence说明这是由一些其他的指令组合而成的。 

  既然系统也提供了这类函数,那么他们的效率和精度和我们自己写的相比又有多大的差异和不同呢,一直想做个比较,今天就抽点时间做点测试.

   我们先看看精度,以exp为代表,测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    __m128 s = _mm_setr_ps(0, 3, 4, 6);
    __m128 d1 = _mm_exp_ps(s);
    __m128 d2 = _mm_fexp_ps(s);
    for (int i = 0; i < 4; i++)
    {
        printf("%f    %f    %f  \n", d1.m128_f32[i], d2.m128_f32[i], exp(s.m128_f32[i]));
    }

  运行结果如下所示:

  其中的_mm_fexp_ps的代码来自于github上的sse_mathfun文件里。

  可见大家的精度上差不多,在某些情况下和标准的数学结果都有差异。 同样测试了sin,cos,log,pow等函数,精度也都差不多,说明大家的计算方法差异不大。

  下面再测试下速度,测试代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LARGE_INTEGER nEndTime, nBeginTime, nFreq;
double time;
QueryPerformanceFrequency(&nFreq);
int Length = 100000;
float* Src = (float*)malloc(Length * sizeof(float));
float* Dest = (float*)malloc(Length * sizeof(float));
QueryPerformanceCounter(&nBeginTime);//获取开始时刻计数值

for (int Y = 0; Y < 10000; Y++)
{
    for (int X = 0; X < Length; X += 4)
    {
        __m128 SrcV = _mm_loadu_ps(Src + X);
        __m128 DstV = _mm_exp_ps(SrcV);
        _mm_storeu_ps(Dest + X, DstV);
    }
}
QueryPerformanceCounter(&nEndTime);//获取停止时刻计数值
time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart;//(开始-停止)/频率即为秒数,精确到小数点后6位
printf("%f \n", time);

QueryPerformanceCounter(&nBeginTime);//获取开始时刻计数值
for (int Y = 0; Y < 10000; Y++)
{
    for (int X = 0; X < Length; X += 4)
    {
        __m128 SrcV = _mm_loadu_ps(Src + X);
        __m128 DstV = _mm_fexp_ps(SrcV);
        _mm_storeu_ps(Dest + X, DstV);
    }
}
QueryPerformanceCounter(&nEndTime);//获取停止时刻计数值
time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart;//(开始-停止)/频率即为秒数,精确到小数点后6位
printf("%f \n", time);

free(Src);
free(Dest);

  不同的函数,测试耗时比较如下表:

   综合比较起来,似乎自定义的函数含有较大的优势,所以可以自行取舍了。

   另外,还注意到,在标准的SSE指令集里,没有针对整数的除法指令,而在VS2019自带的指令里,已经有了这些函数,当然他们也不是原生的指令,而是多个指令组合的。我们测试了其中的一个函数_mm_div_epi32,发现这个的速度并不理想,比自己写的要差一个档次,而且他对除零还是直接报错误,所以这个方面的东西还是自己弄比较好,比如我们自定的四个32位整数除法如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//    四个浮点数的除法a/b,如果b中某个分量为0,则对应位置返回0值
inline __m128 _mm_divz_ps(__m128 a, __m128 b)
{
    //return _mm_blendv_ps(_mm_div_ps(a, b), _mm_setzero_ps(), _mm_cmpeq_ps(b, _mm_setzero_ps()));
    return _mm_and_ps(_mm_div_ps(a, b), _mm_cmpneq_ps(b, _mm_setzero_ps()));
}

//    四个32位整数的除法,当某个除数为0时,返回0
inline __m128i _mm_divz_epi32(__m128i A, __m128i B)
{
    return _mm_cvtps_epi32(_mm_divz_ps(_mm_cvtepi32_ps(A), _mm_cvtepi32_ps(B)));
}

  即使在除数确当不为0的情况下,系统自带的_mm_div_epi32函数也要比_mm_divz_epi32慢2倍以上,所以目前也不清楚这个是为什么。 当然,VS2019及其以上版本确实提供了很多原来没有指令集函数,如果想快速的实现某些功能,这些确实是一大利器。但是知道他们各自的特性对于做特定条件下的优化还是很有意义的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
  查表算法,无疑也是一种非常常用、有效而且快捷的算法,我们在很多算法的加速过程中都能看到他的影子,在图像处理中,尤其常用,比如我们常见的各种基于直方图的增强,可以说,在photoshop中的调整菜单里80%的算法都是用的查表,因为他最终就是用的曲线调整。
用户1138785
2022/10/28
1.6K0
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
SSE图像算法优化
  图像金字塔技术在很多层面上都有着广泛的应用,很多开源的工具也都有对他们的建立写了专门的函数,比如IPP,比如OpenCV等等,这方面的理论文章特别多,我不需要赘述,但是我发现大部多分开源的代码的实现都不是严格意义上的金字塔,而是做了一定的变通,这种变通常常为了快捷的实现类似的效果,虽然这种变通不太会影响金字塔的效果,但是我这里希望从严格意义上对该算法进行优化,比如简要贴一下下面的某个高斯金字塔的代码:
用户1138785
2019/05/24
1.1K0
SSE图像算法优化系列2-高斯滤波
或许大多数人对于高斯滤波的印象都停留在使用一个高斯在图像滑动然后计算结果。这的确没错,但从速度上考虑这种模式是难以优化的。也导致在极大分辨率图像上进行高斯滤波是压根不可行的。幸运的是,高斯滤波实际上还有另外一种表达方式,那就是递归表达。这最早见于《Recursive implementation of the Gaussian filter》论文中:
BBuf
2019/12/04
1.2K0
SSE图像算法优化系列2-高斯滤波
【AI PC端算法优化】一,一步步优化RGB转灰度图算法
公众号输入 「高性能计算」 关键词获取刘文志大佬的《并行编程方法与优化实践》电子书以及我整理的SSE指令集PDF。
BBuf
2020/04/15
1.7K0
【AI PC端算法优化】一,一步步优化RGB转灰度图算法
【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。
        研究这个前前后后也有快两三个月了,因为之前也一直在弄模板匹配方面的东西,所以偶尔还是有不少朋友咨询或者问你有没有研究过linemod这个算法啊,那个效率啥的还不错啊,有段时间一直不以为然,觉得我现在用的那个匹配因该很不错的,没必要深究了。后来呢,还是忍不住手痒,把论文打出来看了看,又找了点资料研究了下,结果没想到一弄又是两个月过去了,中间也折腾了很久,浪费了不少时间。总算还是有点收获,稍微整理下做个交流。
用户1138785
2022/05/09
1.6K0
【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。
【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。
作者网名:laviewpbt 是图像处理,算法实现与加速优化方面的大神!其开发的imageshop软件大小只有1MB,却实现了非常丰富与复杂的各种图像处理功能, 邮箱地址为:Email: laviewpbt@sina.com 博客地址:https://www.cnblogs.com/Imageshop/
OpenCV学堂
2020/03/31
9380
SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
根据文章内容总结的摘要
用户1138785
2018/01/03
2.2K0
SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
[强基固本-视频压缩]第十二章:向量指令 第一部分
向量计算是在执行单个处理器指令时,对多个数据块同时执行相同类型的多个操作。这一原理也被称为 SIMD(单指令多数据)。这个名字源于与向量代数的明显相似性:向量之间的操作具有单一符号表示,但涉及对向量各分量执行多个算术操作。
用户1324186
2024/03/20
2440
[强基固本-视频压缩]第十二章:向量指令 第一部分
解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。
用户1138785
2018/01/03
1.8K0
解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。
深度优化局部拉普拉斯金字塔滤波器
基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物,写了很多文章)提出的,我在4年前曾经参考有关代码实现过这个算法,但是速度也是非常慢的,所以当时也没有继续做深入的研究,前段时间做另外一个算法时仔细的研究了下高斯和拉普拉斯金子塔的优化,因此又抽时间仔细的分析了算法的论文和代码,由于论文的理论部分还有一些我没有想清楚,因此在这里我只对研读过程中涉及的代码方面的优化做个解读。
用户1138785
2019/05/24
1.3K0
[快速阅读六] 统计内存数据中二进制1的个数(SSE指令集优化版).
  关于这个问题,网络上讨论的很多,可以找到大量的资料,我觉得就就是下面这一篇讲的最好,也非常的全面:
用户1138785
2024/05/31
1610
[快速阅读六] 统计内存数据中二进制1的个数(SSE指令集优化版).
【算法随记七】巧用SIMD指令实现急速的字节流按位反转算法。
  字节按位反转算法,在有些算法加密或者一些特殊的场合有着较为重要的应用,其速度也是一个非常关键的应用,比如一个byte变量a = 3,其二进制表示为00000011,进行按位反转后的结果即为11000000,即十进制的192。还有一种常用的应用是int型变量按位反转,其基本的原理和字节反转类似,本文仅以字节反转为例来比较这个算法的实现。
用户1138785
2020/01/02
1.3K0
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
  搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的。于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris角点以及SUSAN角点。因此相关的理论还是有所了解的,不过那个时候重点在于实现,对于效率没有过多的考虑。
用户1138785
2023/11/02
6150
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
深度优化局部拉普拉斯金字塔滤波器。
基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物,写了很多文章)提出的,我在4年前曾经参考有关代码实现过这个算法,但是速度也是非常慢的,所以当时也没有继续做深入的研究,前段时间做另外一个算法时仔细的研究了下高斯和拉普拉斯金子塔的优化,因此又抽时间仔细的分析了算法的论文和代码,由于论文的理论部分还有一些我没有想清楚,因此在这里我只对研读过程中涉及的代码方面的优化做个解读。
OpenCV学堂
2019/03/07
2.5K0
【AI PC端算法优化】四,一步步将Sobel边缘检测加速22倍
继续优化技术的探索,今天以一个的Sobel算子进行边缘检测的算法为例来看看如何使用SSE指令集对其进行优化。
BBuf
2020/04/20
1.5K0
【AI PC端算法优化】四,一步步将Sobel边缘检测加速22倍
SSE图像算法优化系列四:图像转置的SSE优化(支持8位、24位、32位),提速4-6倍
本文介绍了如何利用SSE/AVX指令集进行CPU并行加速,以解决图像转置中存在的内存访问瓶颈问题。首先介绍了图像转置的算法和实现过程,然后通过具体示例展示了如何使用SSE/AVX指令集进行CPU并行加速,最后给出了针对不同CPU架构的优化策略。
用户1138785
2018/01/03
2.1K0
Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]
将饱和度考虑在内的函数将结果钳制到可以存储的最小/最大值。没有饱和的函数在饱和发生时忽略内存问题。
全栈程序员站长
2022/09/02
3.3K1
Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]
【AI PC端算法优化】六,优化一个简单的肤色检测算法
继续学习优化知识,这一节将以一个简单的肤色检测算法为例谈谈当一个算法中有比较运算符时,我们该如何向量化并进行加速,简单来说就是如何将比较运算语句写成SSE指令。
BBuf
2020/04/26
8730
【AI PC端算法优化】六,优化一个简单的肤色检测算法
【工程应用六】 继续聊一聊高效率的模板匹配算法(分水岭助威+蒙版提速)。
       总是写很长的复杂的文章,目前发现真的有点无法静心去弄了,感觉写代码的动力要比写文章强大的多,所以,往后的文章还是写的剪短一点吧。
用户1138785
2022/05/18
1.6K0
【工程应用六】 继续聊一聊高效率的模板匹配算法(分水岭助威+蒙版提速)。
【AI PC端算法优化】二,一步步优化自然饱和度算法
今天要介绍的自然饱和度算法是一个开源图像处理软件PhotoDemon(地址:https://github.com/tannerhelland/PhotoDemon)上的,原版是C#的,代码如下:
BBuf
2020/04/15
7340
【AI PC端算法优化】二,一步步优化自然饱和度算法
推荐阅读
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
1.6K0
SSE图像算法优化
1.1K0
SSE图像算法优化系列2-高斯滤波
1.2K0
【AI PC端算法优化】一,一步步优化RGB转灰度图算法
1.7K0
【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。
1.6K0
【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。
9380
SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
2.2K0
[强基固本-视频压缩]第十二章:向量指令 第一部分
2440
解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。
1.8K0
深度优化局部拉普拉斯金字塔滤波器
1.3K0
[快速阅读六] 统计内存数据中二进制1的个数(SSE指令集优化版).
1610
【算法随记七】巧用SIMD指令实现急速的字节流按位反转算法。
1.3K0
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
6150
深度优化局部拉普拉斯金字塔滤波器。
2.5K0
【AI PC端算法优化】四,一步步将Sobel边缘检测加速22倍
1.5K0
SSE图像算法优化系列四:图像转置的SSE优化(支持8位、24位、32位),提速4-6倍
2.1K0
Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]
3.3K1
【AI PC端算法优化】六,优化一个简单的肤色检测算法
8730
【工程应用六】 继续聊一聊高效率的模板匹配算法(分水岭助威+蒙版提速)。
1.6K0
【AI PC端算法优化】二,一步步优化自然饱和度算法
7340
相关推荐
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验