作者:
关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。
一、Instructions函数对照表
在使用Instructions函数时,很多时候会发现MSDN说的不详细,这时只有去翻阅Intel、AMD文档了。但Intel、AMD文档都是按照汇编指令名排序的,查起来不太方便。
而且SIMD指令大多很复杂,文字描述难以详细的解释其功能,唯有伪代码才能精确的解释其功能。但Intel、AMD文档上的伪代码大多很长,不适合随时翻阅。
于是我希望能有一份这样的表格——
1.按照Intrinsics头文件中的顺序排序;
2.有 函数名、汇编指令、功能描述、伪代码 这四列,便于对照。
3.伪代码只有一行,并尽可能简短,便于表格化。
为了简化伪代码,我借用了C语言语法,可以写循环,可以使用大括号语句块,将mm/xmm/ymm寄存器看做联合体、转型等。
例如PADDSB(饱和加法.无8位)指令的伪代码为——
for(i=0;i<8;++i){ r.uB[i]=SU(m1.uB[i]+m1.uB[i]); }
解释——
r:返回值。r.uB[i]表示,将r这个64位寄存器 看做 “无符号8位整数”的数组。
m1、m2:输入参数1与输入参数2。同理“uB[i]”也是指将其看做 “无符号8位整数”的数组。
SU:无符号饱和处理。表示其中的运算是无符号饱和的,超过上界或下界时数值会饱和到边界,而不发生环绕。这对图像处理等领域非常有用。
uB等类型缩写见《SIMD变量命名规范心得 》()。
SU等函数的说明——
Code | 名称 | Demo |
SS | 带符号饱和处理 | |
SU | 无符号饱和处理 | |
SX | 带符号扩展 | |
ZX | 无符号扩展 | |
BM | 逻辑掩码 | 0为全0,非0为全1 |
EFLAGS | 根据比较结果设置EFLAGS寄存器,并返回[ZF,PF,CF] | |
TRUNC | 截尾法舍入(Truncate) | |
SBIT | 提取最高符号位 | 结果为0或1 |
SIGN | 符号传递 | 为-1,0,1 |
MIN | 最小值 | |
MAX | 最大值 | |
AVG | 平均值 | (A+B+1)>>1 |
ABS | 绝对值 | |
Round | 舍入。详见ROUNDPD的舍入控制。 |
文章——
01 mmintrin.h与MMX指令集
02 xmmintrin.h与SSE指令集
二、我的整理
根据书籍或其他途径获得的SIMD汇编代码,我将其改写为Intrinsics函数版。
变量命名规范——
函数命名规范——
1.函数名全部小写,用下划线分隔不同的单词。
2.函数名的格式为“md_<功能>_<类型>[_<版本>]”。
3.函数名以“md_”开头。即“Multiple Data”。
4.<类型>是“_xxx”或“_yyy4xxx”。xxx、yyy是3个字母的类型描述(即“变量命名规范”的前缀),“4”指“For”表示类型转换(xxx转为yyy)。
5.<版本>是可选的,用于评比算法时。
整理——
01 《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术
三、我的原创
[x86]SIMD指令集发展历程表(MMX、SSE、AVX等)
Intrinsics头文件与SIMD指令集、Visual Studio版本对应表
[VC6] 检查MMX和SSE系列指令集的支持级别(最高SSE4.2)
深入探讨用位掩码代替分支(7):MMX指令集速度测试
深入探讨用位掩码代替分支(8):SSE指令集速度测试
AVX指令集中的32种浮点比较关系详解(NaN、无序、有序等)
[TurboC++] 如何在DOS下的16位C++编译器中使用CPUID指令获取CPU信息
如何在各个版本的VC及64位下使用CPUID指令
[VC兼容32位和64位] 检查MMX和SSE系列指令集的支持级别
[VC] CPUIDFIELD:CPUID字段的统一编号、读取方案。范例:检查SSE4A、AES、PCLMULQDQ指令
[VC] 检测AVX系列指令集的支持级别(AVX、AVX2、F16C、FMA、FMA4、XOP)
[VC] ccpuid:CPUID信息模块。范例:显示所有的CPUID信息
四、网上资源
4.1 手册或指令参考
Intel手册:
AMD手册:
Compiler Intrinsics:
INTEL 体系结构 MMX? 技术开发者手册:
4.2 心得教程
Introduction to MMX Programming:
基于MMX指令集的程序设计简介:
Introduction to SSE Programming:
基于SSE指令集的程序设计简介:
Introduction to Intel? Advanced Vector Extensions:
在C/C++代码中使用SSE等指令集的指令(1)介绍:
Pentium III处理器的SSE入门:
4.3 案例分析
4.4 论坛讨论
带符号32位数的累加求和(SSSE3):