处理avx向量(数组)的时候,最好以bit的单位去看每个数。
指令集查询连接
https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html
SSE
SSE指令集是英特尔提供的基于SIMD(单指令多数据,也就是说同一时间内,对多个不同的数据执行同一条命令)的硬件加速指令,通过使用寄存器来进行并行加速。经过几代的迭代,最新的SSE4已经极大地扩展了指令集的功能,并且随后已经从128位寄存器继续扩展到256位的指令。
字节对齐
Advanced Vector Extensions。较新的Intel CPU都支持AVX指令集, 它可以一次操作256bit数据, 是SSE的2倍,可以使用一条AVX指令一次计算8个float数。AVX指令要求内存地址对齐于32字节边界。
_mm_prefetchavx指令集
for(i=0;i a[i] = b[i]+1;
上面的循环中通过表达式a[j]访问数组,编译器会插入软件预取指令来把a[j+d]加载进缓存中,其中d由编译器分析后决avx指令集定。
还可以通过SSE Intrinsics来支持软件预取,当然,这必须是在支持SSE扩展的处理器上才发挥作用;
void _mm_prefetch(char const *a,int sel);
它对应着PREFETCH指令,告诉处理器把地址a对应的缓存加载到更高速的avx指令集缓存中,sel给出了预取操作的类型,如下所示:
PREFETCHINTA _MM_HINT_NTA 采用非临时预取,减少缓存行的污染
PREFETCH0 _MM_HINT_T0 预取数据到所有缓存
PREFETCH1 _MM_HINT_T1 预取到L2,L3缓存,但是不到L1缓存
PREFETCH2 _MM_HINT_T2 仅预取数据到L3缓存
AVX
_mm256_xor_si256 按位异或
_m256_load_
用_m256_load_*把数据从内存加载到__mm256变量里,要求内存里的数据必须按32位对齐,否则会报段错误;用 m256_loadu*来加载不一定对齐的数据;
_mm256_storeu_si256
Moves values from a integer vector to an unaligned memory location.