SSE2 指令集 引用维基百科:SSE2,全名为Streaming SIMD Extensions 2,是一种IA-32架构的SIMD(单一指令多重数据)指令集。 SSE2是在 2001年随着Intel发表第一代Pentium 4处理器也一并推出的指令集。它延伸较早的SSE指令集,而且可以完全取代MMX指令集。 在2004年,Intel 再度扩展了SSE2指令为 SSE3 指令集。与 70 条指令的 SSE 相比,SSE2新增了144条指令。 在2003年,AMD也在发布AMD64的64位处理器时跟进SSE2指令集。 instruction set, use the SSE2 instruction set to quickly filter. */ /* Filtering 16 characters at
在 x86 上 名称 暗示 收集 SSE SSE2 SSE2 SSE SSE3 SSE SSE2 SSSE3 SSE SSE2 SSE3 SSE41 SSE SSE2 SSE3 SSSE3 POPCNT SSE SSE2 SSE3 SSSE3 SSE41 SSE42 SSE SSE2 SSE3 SSSE3 SSE41 POPCNT AVX SSE SSE2 SSE3 SSSE3 SSE41 POPCNT 在 x86 上 名称 意味着 收集 SSE SSE2 SSE2 SSE SSE3 SSE SSE2 SSSE3 SSE SSE2 SSE3 SSE41 SSE SSE2 SSE3 SSSE3 POPCNT SSE SSE2 SSE3 SSSE3 SSE41 SSE42 SSE SSE2 SSE3 SSSE3 SSE41 POPCNT AVX SSE SSE2 SSE3 SSSE3 SSE41 SSE2 SSE SSE3 SSE SSE2 SSSE3 SSE SSE2 SSE3 SSE41 SSE SSE2 SSE3 SSSE3 POPCNT SSE SSE2 SSE3 SSSE3
VS2019 16.4 10.2.89_441.22/7.6.5.32 AVX2 Python 3.7/Compute 3.0,3.5,5.0,5.2,6.1,7.0,7.5 2.0.0\py37\CPU\sse2 VS2019 16.3 10.1.243_426.00/7.6.4.38 AVX2 Python 3.7/Compute 3.0,3.5,5.0,5.2,6.1,7.0,7.5 1.14.0\py37\CPU\sse2 VS2019 16.1 10.1.168_425.25/7.6.0.64 AVX2 Python 3.7/Compute 3.0,3.5,5.0,5.2,6.1,7.0,7.5 1.13.1\py37\CPU\sse2 VS2017 15.9 10.1.105_418.96/7.5.0.56 AVX2 Python 3.7/Compute 3.0,3.5,5.0,5.2,6.1,7.0,7.5 1.12.0\py36\CPU\sse2 VS2017 15.8 10.0.130_411.31/7.3.1.20 AVX2 Python 3.6/Compute 3.0,3.5,5.0,5.2,6.1,7.0,7.5 1.12.0\py37\CPU\sse2
奔腾4又又引入了新的扩展:SSE2扩展,是在SSE基础上的扩展,支持更高精度的浮点数。SSE2扩展和SSE扩展使用相同的XMM寄存器。 带有SSE和SSE2扩展的CPU模型使用i387_fxsave_struct数据类型。 这个宏会检查旧进程的TS_USEDFPU标志:如果标志被设置,说明旧进程使用了FPU、MMX、SSE或SSE2指令。 如果CPU还使用了SSE/SSE2扩展,还需要保存XMM寄存器的内容,然后重新初始化SSE/SSE2单元。 5 在内核中使用FPU、MMX和SSE/SSE2单元 当然了,内核中也可以使用FPU、MMX或SSE/SSE2硬件单元(虽然,大部分时候没有意义)。
pentium2: MMX pentium3(m): MMX SSE pentium-m: MMX SSE SSE2 pentium4(m): MMX SSE SSE2 prescott: MMX SSE SSE2 SSE3 nocona: MMX SSE SSE2 SSE3 (64bit) c3: MMX 3dNOW! 3dNOW(enhanced) SSE SSE2 (64bit) 可以看出,i686囊括了现在正在使用的所有x86,所以把rpm打包是的arch改为i686是没有问题的,反而能在指令调度上优化,填满流水线
): pentium-mmx: MMX i686: pentiumpro: pentium2: MMX pentium3(m): MMX SSE pentium-m: MMX SSE SSE2 pentium4(m): MMX SSE SSE2 prescott: MMX SSE SSE2 SSE3 nocona: MMX SSE SSE2 SSE3 (64bit) c3: MMX 3dNOW(enhanced) SSE SSE2 (64bit) 可以看出,i686囊括了现在正在使用的所有x86,所以把rpm打包是的arch改为i686是没有问题的,反而能在指令调度上优化,填满流水线
External webrtc AEC3elseDIRS += webrtc_aec3WEBRTC_AEC3_OTHER_CFLAGS = -fexceptions ifneq ($(findstring sse2 neon -mfloat-abi=hard -DWEBRTC_LINUX=1 -DWEBRTC_APM_DEBUG_DUMP=0 -DWEBRTC_POSIX=1ifneq ($(findstring sse2 ,sse2),)# export WEBRTC_AEC3_SRC = \#common_audio/resampler/sinc_resampler_sse.o \#common_audio/third_party agc2/rnn_vad/rnn_vector_math_avx2.o# WEBRTC_AEC3_OTHER_CFLAGS += -mfmaelse ifneq ($(findstring neon,sse2
): pentium-mmx: MMX i686: pentiumpro: pentium2: MMX pentium3(m): MMX SSE pentium-m: MMX SSE SSE2 pentium4(m): MMX SSE SSE2 prescott: MMX SSE SSE2 SSE3 nocona: MMX SSE SSE2 SSE3 (64bit) c3: MMX 3dNOW(enhanced) SSE SSE2 (64bit) 可以看出,i686囊括了现在正在使用的所有x86,所以把rpm打包是的arch改为i686是没有问题的,反而能在指令调度上优化,填满流水线
先看看这个枚举: enum IntelMicroArchitecture { PENTIUM, SSE, SSE2, SSE3, SSSE3, SSE41 SSE2 SSE2是Intel在Pentium 4处理器的最初版本中引入的,但是AMD后来在Opteron 和Athlon 64处理器中也加入了SSE2的支持。 SSE2指令集添加了对64位双精度浮点数的支持。这个指令集还增加了对CPU快取的控制指令。AMD对它的扩展增加了8个XMM寄存器,但是需要切换到64位模式(AMD64)才可以使用这些寄存器。 BASE_EXPORT CPU { public: // Constructor CPU(); enum IntelMicroArchitecture { PENTIUM, SSE, SSE2 return SSE41; if (has_ssse3()) return SSSE3; if (has_sse3()) return SSE3; if (has_sse2()) return SSE2
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2
: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2
因为SSE/SSE2指令集要求数据必须对齐到16字节的边界, 所以vector的分配器必须替换成一个可以对齐的内存分配器(x86架构). 它只有5个头文件, 全是内联的SSE/SSE2指令, 并且有完善的文档和支持. 最棒的是它可以像在Direct3D中那样应用在OpenGL中. 缺点就是这是个预处理指令, 你必须书写和编译相同的SSE/SSE2和FPU指令的代码, 并且测试哪一个版本适用于目标平台. 当然, 除非你想支持非SSE处理器, 否则不会遇到这种状况. XMVECTOR只是一个编译器友好的__m128的类型定义, 用在SSE/SSE2指令集中. 示例 下面的简单示例中STL vector包含了2000万的顶点 (**). 换句话说, 如果正确地使用SSE/SSE2进行编码, 可以提升到原来3倍的速度 (取决于 FPU). 使用指针代替'[]'操作符访问容器内的数据大约有10%的速度提升.
2001年在Pentium 4上引入了SSE2技术,进一步扩展了指令集,使得XMM寄存器上可以执行8/16/32位宽的整数SIMD运算或双精度浮点数的SIMD运算。这使得 SIMD技术基本完善。 SSE2 SSE2是 Intel在Pentium 4处理器的最初版本中引入的,但是AMD后来在Opteron 和Athlon64处理器中也加入了SSE2的支持。 SSE2指令集添加了对64位双精度浮点数的支持,以及对整型数据的支持,也就是说这个指令集中所有的MMX指令都是多余的了,同时也避免了占用浮点数寄存器。这个指令集还增加了对CPU快取的控制指令。
: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2
, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC optimize(3) #pragma GCC target("sse,sse2 ,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #pragma GCC target("sse3","sse2","sse") #pragma GCC
mm_cvtsi128_si32(_mm_add_epi32(UsedV, _mm_unpackhi_epi64(UsedV, UsedV))); 注意到这里的函数除了_mm_shuffle_epi8,其他的都是SSE2 的早期CPU,用CPUID看他支持的指令集,他是支持SSE4.2的,也支持SSE3,但是执行_mm_shuffle_epi8确提示不识别的指令,也是很奇怪,或者说如果遇到一个机器不支持SSE3,只支持SSE2 ,那是否还能用指令集优化这个算法呢(SSE2是2001年发布的)。 0x0000ffff) + ((Value >> 16) & 0x0000ffff); Amount += Value; } 这里就是简单的一些位运算和移位,他们对应的指令集在SSE2 但是,在编译器没有这个向量化能力时,直接手工嵌入SSE2的指令,还是能有明显的加速作用的,不过也可以看到,SSE2的优化速度还是比SSE3的shuffle版本慢一倍的,而sse3的shuffle确可以比
true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2 true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2 true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2 true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2
, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC optimize(3) #pragma GCC target("sse,sse2 ,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #pragma GCC target("sse3","sse2","sse") #pragma GCC