通用的RISC指令集,11个64位寄存器,一个程序计数器和512字节的栈空间构成。
在 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 SSE SSE2 SSSE3 SSE SSE2 SSE3 SSE41 SSE SSE2 SSE3 SSSE3 POPCNT SSE SSE2 SSE3 SSSE3 SSE41 SSE42 SSE
先看看这个枚举: enum IntelMicroArchitecture { PENTIUM, SSE, SSE2, SSE3, SSSE3, SSE41 SSE3 SSE3是Intel在Pentium 4处理器的 Prescott 核心中引入的第三代SIMD指令集,AMD在Athlon 64的第五个版本,Venice核心中也加入了SSE3的支持。 SSSE3 SSSE3是Intel针对SSE3指令集的一次额外扩充,最早内建于Core 2 Duo处理器中。 public: // Constructor CPU(); enum IntelMicroArchitecture { PENTIUM, SSE, SSE2, SSE3 return SSE42; if (has_sse41()) return SSE41; if (has_ssse3()) return SSSE3; if (has_sse3()) return SSE3
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 target
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 target
因为SSE4最早是2008年发布的,如果CPU不支持SSE4,但是支持SSE3(2004年发布的),那是否有合适的指令集能加速这个过程呢,实际上也是有的。 _mm_shuffle_epi8是在SSE3就开始支持的,因此,这一改动可以将硬件的适应性提前4年。 实际上,我还遇到一种情况,一个AMD的早期CPU,用CPUID看他支持的指令集,他是支持SSE4.2的,也支持SSE3,但是执行_mm_shuffle_epi8确提示不识别的指令,也是很奇怪,或者说如果遇到一个机器不支持 SSE3,只支持SSE2,那是否还能用指令集优化这个算法呢(SSE2是2001年发布的)。 但是,在编译器没有这个向量化能力时,直接手工嵌入SSE2的指令,还是能有明显的加速作用的,不过也可以看到,SSE2的优化速度还是比SSE3的shuffle版本慢一倍的,而sse3的shuffle确可以比
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 target
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 target
stack:200000000") 2 #pragma GCC optimize("Ofast,no-stack-protector") 3 #pragma GCC target("sse,sse2,sse3
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 target
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 target
Intel主要有x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX等指令集。
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 target
A 思维 #pragma GCC target("avx,sse2,sse3,sse4,popcnt") #pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops 10 26"<<endl; else cout<<"YES\n"<<"6 10 14 "<<n-30<<endl; } } B 观察 #pragma GCC target("avx,sse2,sse3
haptic power filesystem threads timers file loadso cpuinfo assembly Assembly Math : mmx 3dnow sse sse2 sse3 haptic power filesystem threads timers file loadso cpuinfo assembly Assembly Math : mmx 3dnow sse sse2 sse3
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 target
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 target
SSE2 pentium4(m): MMX SSE SSE2 prescott: MMX SSE SSE2 SSE3 nocona: MMX SSE SSE2 SSE3 (64bit) c3: MMX 3dNOW!
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 target
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!