包含的头文件:
所有的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倍提升