我有两个AVX2寄存器,例如以下值:
m0 = {0,1,2,3,4,5,6,7}
m1 = {8,9,a,b,c,d,e,f}
我需要移动m0
从m1
抓取最后一个值:
m0 = {1,2,3,4,5,6,7,8}
然后用m0
做运算,再移位:
m0 = {2,3,4,5,6,7,8,9}
以此类推(7次),直到
m0 = {7,8,9,a,b,c,d,e}
使用AVX指令最好的方法是什么?
假设m0
和m1
是从连续内存中加载的:考虑到m0
缓存在L1中,仅仅从内存中加载CC_7 (1
的地址,然后2
的地址,…)会更快吗?
对于最多16字节的双向量移位,我通常这样做:
m = _mm256_alignr_epi8(_mm256_permute2x128_si256(m0, m1, 0x03), m1, 4);
在某些情况下,使用未对齐的加载可能更有效——它往往取决于特定的CPU和指令组合,因此值得对两种方式进行基准测试。