SIMD函数整理:00 索引贴(2012-07-31更新)

作者:zyl910

 

  关于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变量命名规范心得 》(http://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html)。

  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指令集

http://www.cnblogs.com/zyl910/archive/2012/07/19/intrin01_mmx.html

 

02 xmmintrin.h与SSE指令集
http://www.cnblogs.com/zyl910/archive/2012/07/31/intrin02_sse.html

 

 

二、我的整理

 

  根据书籍或其他途径获得的SIMD汇编代码,我将其改写为Intrinsics函数版。

 

 

  变量命名规范——

http://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html

http://blog.csdn.net/zyl910/article/details/7490598

 

 

  函数命名规范——

1.函数名全部小写,用下划线分隔不同的单词。

2.函数名的格式为“md_<功能>_<类型>[_<版本>]”。

3.函数名以“md_”开头。即“Multiple Data”。

4.<类型>是“_xxx”或“_yyy4xxx”。xxx、yyy是3个字母的类型描述(即“变量命名规范”的前缀),“4”指“For”表示类型转换(xxx转为yyy)。

5.<版本>是可选的,用于评比算法时。

 

 

  整理——

01 《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术

http://www.cnblogs.com/zyl910/archive/2012/04/26/md01_mmxguide_ch08.html

http://blog.csdn.net/zyl910/article/details/7516127

 

 

 

三、我的原创

 

 

[x86]SIMD指令集发展历程表(MMX、SSE、AVX等)

http://www.cnblogs.com/zyl910/archive/2012/02/26/x86_simd_table.html

http://blog.csdn.net/zyl910/article/details/7296125

 

 

Intrinsics头文件与SIMD指令集、Visual Studio版本对应表

http://www.cnblogs.com/zyl910/archive/2012/02/28/vs_intrin_table.html

http://blog.csdn.net/zyl910/article/details/7304063

 

 

[VC6] 检查MMX和SSE系列指令集的支持级别(最高SSE4.2)

http://www.cnblogs.com/zyl910/archive/2012/03/01/checksimd.html

http://blog.csdn.net/zyl910/article/details/7310932

 

 

深入探讨用位掩码代替分支(7):MMX指令集速度测试

http://www.cnblogs.com/zyl910/archive/2012/04/09/noifopex7.html

http://blog.csdn.net/zyl910/article/details/7443141

 

 

深入探讨用位掩码代替分支(8):SSE指令集速度测试

http://www.cnblogs.com/zyl910/archive/2012/04/12/noifopex8.html

http://blog.csdn.net/zyl910/article/details/7455830

 

 

AVX指令集中的32种浮点比较关系详解(NaN、无序、有序等)

http://www.cnblogs.com/zyl910/archive/2012/04/19/avx_cmp_imm8.html

http://blog.csdn.net/zyl910/article/details/7478094

http://software.intel.com/zh-cn/blogs/2012/05/09/avx32/

 

 

[TurboC++] 如何在DOS下的16位C++编译器中使用CPUID指令获取CPU信息

http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html

 

 

如何在各个版本的VC及64位下使用CPUID指令

http://www.cnblogs.com/zyl910/archive/2012/05/21/vcgetcpuid.html

http://blog.csdn.net/zyl910/article/details/7588204

 

 

[VC兼容32位和64位] 检查MMX和SSE系列指令集的支持级别

http://www.cnblogs.com/zyl910/archive/2012/05/25/checksimd64.html

 

 

[VC] CPUIDFIELD:CPUID字段的统一编号、读取方案。范例:检查SSE4A、AES、PCLMULQDQ指令

http://www.cnblogs.com/zyl910/archive/2012/06/29/getcpuidfield.html

http://blog.csdn.net/zyl910/article/details/7702466

 

 

[VC] 检测AVX系列指令集的支持级别(AVX、AVX2、F16C、FMA、FMA4、XOP)

http://www.cnblogs.com/zyl910/archive/2012/07/04/checkavx.html

http://blog.csdn.net/zyl910/article/details/7715558

 

 

[VC] ccpuid:CPUID信息模块。范例:显示所有的CPUID信息

http://www.cnblogs.com/zyl910/archive/2012/07/11/ccpuid.html

http://blog.csdn.net/zyl910/article/details/7737145

 

 

 

四、网上资源

 

 

4.1 手册或指令参考

 

Intel手册:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

AMD手册:http://developer.amd.com/documentation/guides/Pages/default.aspx#manuals

Compiler Intrinsics:http://msdn.microsoft.com/en-us/library/26td21ds(v=vs.110).aspx

INTEL 体系结构 MMX? 技术开发者手册:http://dev.gameres.com/Program/Other/Fmmx/index.htm

 

 

4.2 心得教程

 

 

Introduction to MMX Programming:http://www.codeproject.com/Articles/4505/Introduction-to-MMX-Programming

基于MMX指令集的程序设计简介:http://dev.gameres.com/Program/Other/mmxintro.htm

Introduction to SSE Programming:http://www.codeproject.com/Articles/4522/Introduction-to-SSE-Programming

基于SSE指令集的程序设计简介:http://dev.gameres.com/Program/Other/sseintro.htm

Introduction to Intel? Advanced Vector Extensions:http://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions/

在C/C++代码中使用SSE等指令集的指令(1)介绍:http://blog.csdn.net/gengshenghong/article/details/7007100

Pentium III处理器的SSE入门:http://www.vckbase.com/document/viewdoc/?id=322

 

 

4.3 案例分析

 

 

4.4 论坛讨论

 

 

带符号32位数的累加求和(SSSE3):http://topic.csdn.net/u/20120102/01/fc8d7aa4-bffc-4d9a-a34a-5056c6d27b54.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值