SIMD即单指令多数据流(Single Instruction Multiple Data)指令集,是通过一条指令同时对多个数据进行运算的硬件加速技术,在传统计算,中使用标量运算一次只能对一对数据执行乘法操作,但是如果使用了SIMD加速,可同时对多对数据进行执行操作,常见的有x86体系下的sse/avx等

传统标量计算:

 SIMD加速计算:

这个过程和现代GPU计算有着相通之处,极大的利用并行计算能力

这个过程及其相似与向量计算过程,数据组织的时候,尽量将数据组织成纵向化或者向量化

同样一条指令下面,并行进行了四个乘法计算,这一过程可以大大加速运算流程,在go语言源码中利用了大量该类计算方法

间隔简单的使用方法:

#include<stdio.h>
#include<emmintrin.h>int  main()
{__m128 v1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);__m128 v2 = _mm_set_ps(5.0f, 6.0f, 7.0f, 8.0f);__m128 result = _mm_add_ps(v1, v2);printf("%f,%f,%f,%f",result[3],result[2],result[1],result[0]);
}

下面将举个例子利用流水线加速128组浮点数的加运算,来看看没有加速下的运行效率和使用SIMD优化下的效率

传统方式实现10000次128组浮点数的加法:

#include<iostream>
#include <chrono>#define FNUM 128int  main()
{   clock_t start,end;static_assert(FNUM%4==0, "error");float data0[FNUM];float data1[FNUM];float data2[FNUM];std::chrono::steady_clock::time_point  now = std::chrono::steady_clock::now();for(int x=0;x<10000;++x){for(int i=0;i<FNUM;++i){data2[i]=data1[i]+data0[i];}}auto t2 = std::chrono::steady_clock::now();std::chrono::duration<double> time_span = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - now);std::cout<<time_span.count()<<std::endl;
}

由于现代计算机速度非常快,所以将这个过程执行10000次,以获取更加准确的时间

时间如下:

通过SIMD实现10000次128组浮点数的加法:

#include<iostream>
#include <chrono>
#include<emmintrin.h>#define FNUM 128using namespace std;
using namespace std::chrono;int  main()
{static_assert(FNUM%4==0, "error");float data0[FNUM];float data1[FNUM];float data2[FNUM];int step=FNUM/4;std::chrono::steady_clock::time_point  now = std::chrono::steady_clock::now();for(int i=0;i<10000;i++){for(int i=0;i<step;++i){__m128 v1 = _mm_set_ps(data0[i*step+0],data0[i*step+1],data0[i*step+2],data0[i*step+3]);__m128 v2 = _mm_set_ps(data1[i*step+0],data1[i*step+1],data1[i*step+2],data1[i*step+3]);__m128 result = _mm_add_ps(v1, v2);}}auto t2 = std::chrono::steady_clock::now();std::chrono::duration<double> time_span = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - now);std::cout<<time_span.count()<<std::endl;
}

时间如下:

流水线加速和传统方法一样可能的原因:

在一些情况下,使用了流水线加速后计算速度可能会一样变得比原来更慢,原因在于现代编译器完成了大量优化工作,可能一些计算被编译器已经处理为了SIMD,所以会变得非常快

使用SIMD指令加速计算相关推荐

  1. Cortex-M4和Cortex-M7中的SIMD指令

    SIMD指令简介 单指令多数据流,即SIMD(Single Instruction, Multiple Data)指一类能够在单个指令周期内同时处理多个数据元素的指令集,利用的是数据级并行来提高运行效 ...

  2. 使用SIMD指令实现数据库运算(论文阅读笔记)

    摘要 现代cpu的指令允许在多个数据元素上并行执行基本操作.这些指令称为SIMD指令,因为它们将一条指令应用于多个数据元素.SIMD技术最初被内置到商业处理器中,以加速多媒体应用程序的性能.SIMD指 ...

  3. GCC中SIMD指令的应用方法

    X86架构上的多媒体应用开发,如果能够使用SIMD指令进行优化, 性能将大大提高.目前,IA-32的SIMD指令包括MMX,SSE,SSE2等几级. 在GCC的开发环境中,有几种使用SIMD指令的方式 ...

  4. 【NEON Intrincics加速计算案例】使用neon加速计算视频FullRange转LimitedRange

    目标 使用 neon intrinsic指令对视频的full range转limited range进行加速,转换公式为: // Y通道 data[i] = (219 * data[i]) / 255 ...

  5. 【27】SIMD:如何加速矩阵乘法?

    [计算机组成原理]学习笔记--总目录 [27]SIMD:如何加速矩阵乘法? 引言 一.超线程:Intel 多卖给你的那一倍 CPU 1.背景 2.超线程(Hyper-Threading)技术 二.SI ...

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

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

  7. TNN行业首发Arm 32位 FP16指令加速,理论性能翻倍

    转自:https://cloud.tencent.com/developer/article/1774206 https://www.cnblogs.com/zhangshenghui/p/11825 ...

  8. 余弦相似度使用NEON指令加速

    余弦相似度使用NEON指令加速 背景 参考资料 公式 代码实现(未用NEON) 使用NEON加速 加速效果 编译信息 测试使用的arm cpu信息 背景 余弦相似度是通过计算两个向量的夹角余弦值来评估 ...

  9. Pytorch之GPU加速计算问题以及model=model.to(device)

    文章目录 model=model.to(device) GPU加速计算问题 技巧一 model=model.to(device) model=model.to(device) 这个有什么用,其实就是把 ...

最新文章

  1. VI连接esx主机时报错“client.xml”错误
  2. sap中二级品报工问题解决方案
  3. html显示高亮c++
  4. 4、requests-基础
  5. Unity3d常用插件
  6. C语言实现辗转相除法计算两数最大公约数
  7. 0423-mysql查询语句大全
  8. ie6的png24问题
  9. 乐源机器人没电提醒吗_云迹讲解机器人,你的专属机器人服务专家
  10. 教师资格证考试计算机知识题库,教师资格考试《高中信息技术》试题
  11. android:persistent属性研究
  12. 无法访问该文件可能已损坏 或者服务器,win7系统打开xls文件提示无法访问文件可能损坏的解决方法...
  13. php实现大文件分片上传
  14. MTK MT6771处理器,helio P60芯片参考资料
  15. 设计模式(一):简介
  16. Git:真实 merge
  17. comsol如何定义狄利克雷边界_在变分问题中指定边界条件和约束
  18. 面试最后总会问到的开放性面试题
  19. 信息检索——扩展词模型研究与应用论文
  20. 查询局域网电脑的IP,端口号,MAC地址 黑客技术入门

热门文章

  1. 威尔逊定理证明——杨子曰数学
  2. 线性表之线性表与数组的区别
  3. Dijkstra算法指定任意两点距离(邻接矩阵法)
  4. 计算机械结构变形,机械结构设计-力学原理设计准则
  5. uniapp小程序开发自定义相机、拍照、上传
  6. 基础版微信模板消息开发详解,附代码PHP
  7. 一维数据可视化:累积分布函数(Cumulative Distribution Function)
  8. Selenium测试报错 Other element would receive the click 问题
  9. 监控页面所有 ajax请求
  10. 保护私密文件夹,可以这样设置隐藏起来