首页 > 其他分享 >VS2019自带的增强型指令集和自我优化的版本速度比较.

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

时间:2024-02-27 15:24:37浏览次数:14  
标签:__ ps 函数 VS2019 增强型 float m128 mm 指令集

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

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

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

        

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

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

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

    __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等函数,精度也都差不多,说明大家的计算方法差异不大。

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

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位整数除法如下代码:

//    四个浮点数的除法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及其以上版本确实提供了很多原来没有指令集函数,如果想快速的实现某些功能,这些确实是一大利器。但是知道他们各自的特性对于做特定条件下的优化还是很有意义的。

 

翻译

搜索

复制

<iframe></iframe>

标签:__,ps,函数,VS2019,增强型,float,m128,mm,指令集
From: https://www.cnblogs.com/Imageshop/p/18036936

相关文章

  • [转帖]AVX-512指令集的前世今生
    https://zhuanlan.zhihu.com/p/136099964 什么是指令集计算机上的任何程序最终要编译成一条条指令才能让CPU识别并执行,指令集是指CPU能执行的所有指令的集合,每一指令对应一种操作,CPU依靠指令来计算和控制系统,指令执行能力是衡量CPU性能的重要指标,指令集也与CPU效率有密......
  • 在我的VS2019中重新配置2017项目生成的google test 项目
    原来的项目是其他版本的VS配置的,自己下载下来时候,本机也没有装GoogleTest所以用不起。如果重建项目在一个个引入工程代码太麻烦(文件多),所以我就想着有没有什么办法快捷配置,不用重建工程以下是我的一个配置方法,供大家交流学习:1.首先你本机要安装上GoogleTest,安装方法自查;2.如......
  • [转]vs2019升级后,启动调试,谷歌浏览器无法正常使用 - 温故纳新 - 博客园
    解决方法:vs2019按如下步骤设置:工具  =》 选项  =》调试 =》 常规 =》勾选“启用APS.NET 的 Javascript 调试(Chrome和IE)”---------------------作者:温故纳新来源:CNBLOGS原文:https://www.cnblogs.com/tomorrow0/p/14383870.html版权声明:本文为作者原创文章,转载请......
  • 《c++dll篇》VS2019生成dll及调用
    VS2019生成dll及调用生成DLL1.创建dll工程2.编写dll函数经过上述过程后工程中会生成几个自带的文件,可以自行创建或者更名,我直接在上面进行编写了。如下我先在pch.h中创建我需要调用函数的声明,他们分别用于实现加法和取最大值的功能,你可以根据自己的需求更改成自己的子程序。......
  • 1.5A 电源模块TPSM5601R5HEXTRDAR、TPSM5601R5HRDAR使用增强型 Hotrod™ QFN封装
    采用增强型Hotrod™QFN封装的TPSM5601R5Hx60V输入、1V至16V输出、1.5A电源模块器件说明:TPSM5601R5Hx电源模块是一款高度集成的1.5A电源解决方案,在热增强型QFN封装内整合了一个带有功率MOSFET的60V输入降压直流/直流转换器、一个屏蔽式电感器和多个无源器件。此......
  • VS2019,无法启动程序xxx.exe,系统找不到指定的文件,重新生成解决方案报错
     调试程序报错如图一、尝试重新生成解决方案二、如果生成解决方案也报错,重新安装.netSDK本人所用为VS2019,.net5,到官网下载.net5的SDK重新安装后,恢复正常,重新生成成功,启动调试成功。.net各版本下载地址:https://dotnet.microsoft.com/en-us/download/dotnet.net5下载地址:h......
  • IDE之VS:Visual Studio的简介(包括 VS2013、VS2015、VS2017、VS2019、VS2022)、安装、
    原文链接:https://blog.csdn.net/qq_41185868/article/details/81052119最近开始使用vs2019,应该是最新的版本。之前都是vs2015,感觉19更智能,兼容性更好,速度也更快。详细了解下这几个版本。1、简介:MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品,功能完备的I......
  • Qt 5.9.6+VS2019 community 环境配置
    介绍GCCminGW安装Qt5.9.6安装VS2019community略配置VS2019community在VS的管理拓展里面下载Qtvisualstudiotools如果下得很慢就手动下载vsaddin......
  • 指令集,架构,都是什么意思?
    背景:我上网冲浪,经常看到指令集,架构,这都是什么?还有,什么AMD,ARM,我总是分不清,他们是啥? 整理: 问题1:指令集是什么?是一种标准。AI回答:指令集是一种计算机处理器能够理解和执行的指令的集合。指令集架构可以被视为一种标准,因为它定义了处理器与软件之间的接口。问题2:......
  • opencv4.8+vs2019 运行出现一堆[INFO:XXX]信息
    前言Opencv+vs2019搭建成功运行后出现一堆INFO信息,虽说不影响程序运行但是会占据控制台窗口,覆盖正常调试输出出现时机:在每次需要显示图像时均会出现,如:namedWindow、imshow函数调用时。 一、现象分析这些不是错,是OpenCV在启动时加载GUI(图形用户界面)后端注册表的信息,显示的是......