SSE设计简介

来源:互联网 发布:淘宝跟天猫哪个质量好 编辑:程序博客网 时间:2024/05/23 19:55
SSE程序设计详细介绍
包含的头文件:
所有的SSE指令函数和__m128数据类型都在xmmintrin.h文件中定义:
#include <intrin.h>
因为程序中用到的SSE处理器指令是由编译器决定,所以它并没有相关的.lib库文件。

数据分组(Data Alignment)
由SSE指令处理的每一个浮点数数组必须把其中需要处理的数每16个字节(128位二进制)分为一组。

一个静态数组(static array)可由__declspec(align(16))关键字声明:

__declspec(align(16)) float m_fArray[ARRAY_SIZE];

动态数组(dynamic array)可由_aligned_malloc函数为其分配空间:
m_fArray = (float*) _aligned_malloc(ARRAY_SIZE * sizeof(float), 16);
由_aligned_malloc函数分配空间的动态数组可以由_aligned_free函数释放其占用的空间:
_aligned_free(m_fArray);

数据类型

该数据类型的变量可用做SSE指令的操作数,它们不能被用户指令直接存取。

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。


#pragma intrinsic和#pragma function
#pragma intrinsic(function[,function][,function]...):
表示后面的函数将进行intrinsic,替换为内部函数,去掉了函数调用的开销,

注意:有些地方解释为内联,但是和内联并不完全相同,对于内联,可以指定任意函数为内联,

但是此pragma intrinsic只能适用于编译器规定的一部分函数,不是所有函数都能使用

而且,inline关键字一般用于指定自定义的函数,intrinsic则是系统库函数的一部分

比如:

#pragma intrinsic(cos)#pragma intrinsic(memcpy)

之后调用cos和memcpy函数,会自动调用使用SIMD加速版本的cos和memcpy

具体支持的函数以及相关内容可以参考微软官网链接 : https://technet.microsoft.com/zh-cn/library/tzkfha43.aspx


由于编译器有时也会自动并行,所以可能使用SSE之后的加速效果会低于理论上纯C版本的4/8/16倍提升





原创粉丝点击