自动矢量化技术,是编译器代码优化技术的一种,即在不改变C/C++源代码的情况下,自动编译产生使用单指令多数据(Single Instruction Multiple Data,SIMD)指令集的二进制码,包括MMX,SSE,SSE2,SSE3,SSSE3,SSE4,AVX,而不是程序员手动编写汇编层次的优化代码。

举例如下:

float a[N], b[N], c[N];
for(int i=0; i<N; ++i)
c[i] = a[i] + b[i];

上述代码中,逐项相加,并且a,b,c三个数据间是相互独立的,因而编译器可以对其进行矢量化优化,比如对于SSE指令集,XMM 128位寄存器,一次可以执行4个浮点运算,即

float a[N], b[N], c[N];
int i;
for(i=0; i<N-4; i+=4)
{
__asm
{
movups xmm0, a[i];
addps  xmm0, b[i];
movups c[i], xmm0;
}
}
for(; i<N; ++i)
c[i] = a[i] + b[i];

当N较大时,如大于100,矢量优化后的执行速度提升是明显的。

同样,对于其它类型的数值运算,如整形和双精度浮点数,可用类似的指令如mulps,mulpd,addpd,subps,subpd等进行优化。

当循环内部有依赖关系导致无法优化时,编译器将产生通用汇编代码。

目前矢量优化技术在当前流行的编译器上已经得到支持,如Intel C++ Compiler,GCC,预计Microsoft Visual Studio 2010也支持,并且从Microsoft Visual Studio 2008的编译结果中发现,对于浮点操作,已经使用SSE指令movss,cvttps2dq等代替x87指令集。

当然,当循环体嵌套层次更深,循环体内实现代码较多时,编译器判断循环体内是否能进行矢量优化将会比较耗时。同时,虽然支持SSE2指令集的处理器已经非常普遍,但不保证会有使用较老机器的用户,因而在进行矢量化编译优化时,也可选择产生多份代码,如同时编译出通用汇编代码和SIMD优化汇编代码,运行时使用CPUID指令检测当前CPU支持的指令集进行跳转选择执行。

自动矢量编译优化技术是一个巨大的进步,并且具有更好的可移植性。这是由于编写可移植的C/C++代码更容易,而对于汇编底层的开发者而言,由于Intel汇编和AT&T的汇编格式大不相同,因而移植非常困难。

期待自动矢量优化的进一步发展,关注中。。。

参考文献:

(1)I've Fallen In Love With the Vectoriser

(2)Auto-vectorization in GCC

(3)Auto-Vectorization and C++

自动矢量化编译优化技术(Automatic Vectorization)相关推荐

  1. ArcGIS如何进行自动矢量化操作

    这里我们在网络上找一幅高中地理课本上看的等高线图给大家能进行操作演示. 等高线图 01 地理配准 1.定义投影 给数据框定义一个投影,右键Layers>Properties>Coordin ...

  2. ArcGIS实验教程——实验三十三:ArcScan自动矢量化完整案例教程

    ArcGIS实验视频教程合集:<ArcGIS实验教程从入门到精通>(附配套实验数据)> 文章目录 1 ArcScan 简介 2. ArcScan使用前提及注意事项 3. ArcGIS ...

  3. JVM编译优化技术:公共子表达式消除。

    语言无关的经典优化技术之一:公共子表达式消除. 公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,他的含义是:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化 ...

  4. 大前端CPU优化技术--NEON自动向量化

    前言 ARM NEON技术是一种高级的单指令多数据的架构扩展的实现.它是一种64位和128位混合的SIMD技术,主要应用场景是音视频处理,图像视觉计算,信号处理应用等需要密集计算的场景. NEON技术 ...

  5. 编译优化 | LLVM代码生成技术详解及在数据库中的应用

    简介:作者:长别 1. 前言 随着IT基础设施的发展,现代的数据处理系统需要处理更多的数据.支持更为复杂的算法.数据量的增长和算法的复杂化,为数据分析系统带来了严峻的性能挑战.近年来,我们可以在数据库 ...

  6. JIT 即时编译及优化技术

    JIT 即时编译及优化技术 前言 即时编译 热点代码探测 编译优化技术 语言无关的经典优化技术之一:公共子表达式消除 语言相关的经典优化技术之一:数组范围检查消除 最重要的优化技术之一:方法内联 最前 ...

  7. 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...

    1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码"(Hot Spot C ...

  8. 大前端CPU优化技术--NEON技术

    前言 在上一篇中我们讲了SIMD技术的基础和前世今生,可以结合上一篇文章一起看大前端CPU优化技术--SIMD技术.今天我们全局性地讲解下NEON技术​. 目前主流的移动设备以ARM v7和v8版本架 ...

  9. GPS数据矢量化JAVA_算法 – acosf()的精确矢量化实现

    问题中代码的无分支版本是可能的(几乎没有任何冗余工作,只有一些比较/混合来为FMA创建常量),但IDK如果编译器将自动矢量化它. 如果所有元素都有 – | a |,则主要的额外工作是无用的sqrt / ...

最新文章

  1. USACO 1.0_Greedy Gift Givers
  2. 2020-08-20 将数据上传到 S3 或从S3下载
  3. 删除trigger 禁用触发器 启用触发器 查看触发器
  4. ArrayList的sublist注意
  5. C#自定义控件,在项目工具箱中加入自定义控件,调用自定义控件
  6. jpa动态扩展sql_扩展您的JPA POJO
  7. lucene 多索引目录搜索实现方法
  8. 判断用户是否已经登录
  9. 2010年04月 小记(MVC2validation, svn)
  10. 去除面部黑色素小妙招_去除脸部黑色素7个小方法,值得收藏
  11. 信息和信息技术的概念,发展和应用
  12. 集成电路那些事儿:CMOS模拟集成电路版图基础
  13. 巧用QQ文件中转站在办公室与住所间作大文件传递
  14. 面料ERP_面料软件_面料管理软件
  15. web - 常见浏览器及内核
  16. vscode 的工作台配置文件
  17. 《星际争霸2》人工智能研究环境 SC2LE 初体验
  18. [MySQL 工具] pt-query-digest使用出错问题分析Can't locate Time/HiRes.pm in @INC
  19. Python3 - k8s之深入理解 Pod
  20. Android入门教程 Android开发环境搭建【详细教程】

热门文章

  1. win10桌面快捷方式图标变白
  2. 云游戏学习与实践(一)——云游戏概述
  3. 64位Slitaz Linux下Glibc 2.20编译式更新安装成功
  4. CRT (C run-time library)简介
  5. 利用js本地读取excel文件
  6. ESP32-C3入门教程 IoT篇⑦——微软云 Microsoft Azure 物联网 IoT Central EspAzureIoT 实战
  7. 一个Vue.js音乐项目
  8. 手机文档怎样通过计算机打印,手机里的文件怎么快速打印出来?
  9. CodeForces - 710F String Set Queries
  10. 基于ASP.NET通用后台管理系统模板