【转载】:SIMD(MMX/SSE/AVX)变量命名规范心得

当使用Intrinsics函数来操作SIMD指令集(MMX/SSE/AVX等)时,会面对不同长度的SIMD数据类型,其中又分为多种紧缩格式。为此,我设计了一套SIMD变量命名规范,可以有效的提高代码的可读性。

1、SIMD数据类型简介

  SIMD数据类型有:
__m64   :64位紧缩整数(MMX)。
__m128  :128位紧缩单精度(SSE)。
__m128d :128位紧缩双精度(SSE2)。
__m128i  :128位紧缩整数(SSE2)。
__m256  :256位紧缩单精度(AVX)。
__m256d :256位紧缩双精度(AVX)。
__m256i  :256位紧缩整数(AVX)。

 注:紧缩整数包括了8位、16位、32位、64位的带符号和无符号整数。

   这些数据类型与寄存器的对应关系为:
64  位MM寄存器 (MM0~MM7)     : __m64。
128位SSE寄存器(XMM0~XMM15):__m128、__m128d、__m128i。
256位AVX寄存器(YMM0~YMM15):__m256、__m256d、__m256i。

SIMD 数据类型关键字:

p  : 紧密,指令对寄存器中的每个元素进行运算

ep : 扩充紧密

s :标量,只将寄存器中的第一个元素参与运算

2、SIMD变量命名规范

  参考匈牙利命名法(Hungarian notation),在变量名前面增加类型前缀。
  类型前缀为3个小写字母,首字母代表寄存器宽度,最后两个字母代表紧缩数据类型。

  寄存器宽度(首字母)——
      m: 64位MM寄存器。 对应 __m64
      x:128位SSE寄存器。对应 __m128、__m128d、__m128i。
      y:256位AVX寄存器。对应 __m256、__m256d、__m256i。

   紧缩数据类型(两个字母)——
     mb:8位数据。用于只知道长度、不知道具体紧缩格式时。(b:Byte)
     mw:16位数据。(w:Word)
     md:32位数据。(d:DoubleWord)
     mq:64位数据。(q:QuadWord)
     mo:128位数据。(o:OctaWord)
     mh:256位数据。(h:HexWord)
     ub / uw / ud / uq:8位 / 16位 / 32位 / 64位 无符号整数。
     ib / iw / id / iq   :8位 / 16位 / 32位 / 64位 带符号整数。
     fh:16位浮点数,即半精度浮点数。(h:Half)
     fs:32位浮点数,即单精度浮点数。(s:Single)
     fd:64位浮点数,即双精度浮点数。(d:double)

例如 ——
    mub:64位紧缩字节(64位MMX寄存器,其中存放了8个8位无符号整数)。
    xfs:128位紧缩单精度(128位SSE寄存器,其中存放了4个单精度浮点数)。
    xid:128位紧缩带符号字(128位SSE寄存器,其中存放了4个32位带符号整数)。
    yfd:256位紧缩双精度(256位AVX寄存器,其中存放了4个双精度浮点数)。
    yfh:256位紧缩半精度(256位AVX寄存器,其中存放了16个半精度浮点数)。

 3、示例代码
    SSE累加求和程序 :
   

此处再给出了第二种写法:


    测试上面的函数:
   
    上述测试代码中的 __declspec(align(16)) 主要是为了让数据 a 的地址是16字节对齐。否则的话 _mm_load_si128 会报错。也可以将函数_mm_load_si128 改为 _mm_loadu_si128,这样就不需要将数组进行16字节对齐,也可以获得正确结果,但是效率可能会低一些。

SIMD(MMX/SSE/AVX)变量命名规范心得相关推荐

  1. matlab之用m脚本自动完成检查变量命名规范

    matlab之用m脚本自动完成检查变量命名规范 文章目录 matlab之用m脚本自动完成检查变量命名规范 0.前言 1.需求分析 1.1完成变量的拆分 1.2对每大块拆成的小块判断 1.3第二大块的要 ...

  2. web前端学习526-534(变量概述,变量的使用,变量语法扩展,变量命名规范,推荐Diagram Designer)

    文章目录 1 变量概述 1.1 什么是变量 2 变量的使用 1 声明变量 2 赋值 3 变量的初始化 案例:变量的使用 3 变量语法扩展 1 更新变量 2 同时声明多个变量 3 声明变量特殊情况 4 ...

  3. java变量定义规则说法正确_下列变量命名规范说法正确的是( )。

    [判断题]9.强制类型转换运算符的功能是将一个表达式的类型转换为所指定的类型. [单选题]7.已知int a[]=new int[100],在下列给出的数组元素中,非法的是 [判断题]资产,是指企业过 ...

  4. javascript变量命名规范

    javascript变量命名规范 <title> javascript变量命名规范</title> </head> <body><script&g ...

  5. 单指令多数据SIMD的SSE/AVX指令集和API

    https://software.intel.com/sites/landingpage/IntrinsicsGuide/# Technologies MMX SSE SSE2 SSE3 SSSE3 ...

  6. 【Python-3.5】变量命名规范

    为了避免编写代码时产生错误,也为了使写出的代码具有更好的可读性,Python中的变量应遵守以下命名规范: 1. 变量名只能包含字母.数字和下划线.变量名不能以数字开头,但可以使用字母或者下划线开头. ...

  7. JavaScript 变量命名规范总结

    计算机科学中只有两个难题:缓存失效和命名. -- Phil Karlton 任何人都能写出计算机能够理解的代码,只有好程序员才能写出人能够理解的代码.-- Martin Flower 点击上方 程序员 ...

  8. java中定义变量名时大写_,【Java】变量命名规范

    Java是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包.类.变量等的命名规范. (一)Package(包)的命名 P ...

  9. python 变量命名规范

    http://blog.sina.com.cn/s/blog_62f28d560100xv85.html python源码和其他一些书籍,命名各种个性,没有一个比较统一的命名规范.于是总结了一些,供参 ...

最新文章

  1. deform_conv_cuda windows编译
  2. Redis 与 MQ 的区别
  3. 万万没想到,一个可执行文件原来包含了这么多信息!
  4. 设置mysql的字符编码解决中文乱码问题
  5. supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)
  6. 分布式数据库 HBase
  7. 美团点评DBProxy读写分离使用说明
  8. 0x00000000指令引用的内存不能为written_变量和内存访问
  9. Cron表达式 详解
  10. matlab两个图共用一个x轴_Matlab Figures (3) —— 叠加作图与多坐标轴
  11. UI设计师如何正确打开暗黑模式|实用素材拿走
  12. 基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别
  13. 6.SpringMVC 配置式开发-处理器
  14. 网易公司首席执行官 丁磊
  15. Java核心技术卷1 如何阅读?
  16. 做短视频自媒体,常用工具和素材网站分享,新手小白收藏抓紧行动
  17. Nitrux 图标主题与 Faenza 一样的设计 – 漂亮
  18. 从 Sentence-BERT 谈句子表征
  19. gcc 编译隐藏符号
  20. 如何做客户分析?客户分析的内容有哪些?

热门文章

  1. Apache设置多网站
  2. c语言如何打印矩形图形的程序 五行七列,C语言习题与实验
  3. KVM中Virtio网络的演化之路
  4. centos nginx不是命令_Nginx 在CentOS 6/7 上的安装与使用
  5. Socket连接与HTTP连接
  6. bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
  7. Apache Rewrite规则详解[转]
  8. adminLTE 教程 -4 轮播控件
  9. Node.js 官方Path模块简介
  10. js/jQuery判断浏览器名称、内核版本、浏览器壳