您的位置:首页 > 其它

SIMD学习笔记整理(索引贴)

2016-03-08 16:40 190 查看
说明】:本系列笔记主要转载自网上的资源,版权归网上的各路牛人,本人只是在牛人的基础上结合自己的实践对一些笔记进行整理,添加自己的心得和一些代码。感谢网上未曾谋面的大牛们!

【转载】:SIMD函数整理:00
索引贴 (作者: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(MMX/SSE/AVX)变量命名规范心得

SU等函数的说明 ——



SIMD Instructions函数对照表1 : mmintrin.h与MMX指令集

SIMD Instructions函数对照表2 : xmmintrin.h与SSE指令集
SIMD Instructions函数对照表3 : pmmintrin.h和tmmintrin.h与SSE3和SSSE3指令集 或 SSE3和SSSE3
Intrinsics各函数介绍

二、SSE命令示例代码

为了更好的理解SSE的各种命令代码,编写了一些示例代码,参见:

1. SSE命令示例代码(算术、逻辑、比较)

2. SSE命令示例代码(转换、加载、置位、存储)

3. SSE命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: