X86 移位AVX2寄存器中的值,从另一个寄存器中获取最后一个值

X86 移位AVX2寄存器中的值,从另一个寄存器中获取最后一个值,x86,sse,simd,avx2,X86,Sse,Simd,Avx2,我有两个AVX2寄存器,例如,具有以下值: m0 = {0,1,2,3,4,5,6,7} m1 = {8,9,a,b,c,d,e,f} 我需要将m0从m1移到最后一个值: 然后使用m0执行一些算术运算,然后再次移位: m0 = {2,3,4,5,6,7,8,9} 以此类推7次,直到 m0 = {7,8,9,a,b,c,d,e} 使用AVX指令的最佳方式是什么 假设m0和m1是从连续内存加载的:0,1,…,7,8,9,。。。, 从内存地址1继续加载m0,然后从内存地址2继续加载,会更快吗。。

我有两个AVX2寄存器,例如,具有以下值:

m0 = {0,1,2,3,4,5,6,7}
m1 = {8,9,a,b,c,d,e,f}
我需要将m0从m1移到最后一个值:

然后使用m0执行一些算术运算,然后再次移位:

m0 = {2,3,4,5,6,7,8,9}
以此类推7次,直到

m0 = {7,8,9,a,b,c,d,e}
使用AVX指令的最佳方式是什么

假设m0和m1是从连续内存加载的:0,1,…,7,8,9,。。。,
从内存地址1继续加载m0,然后从内存地址2继续加载,会更快吗。。。考虑到它被缓存在L1?

中,我通常会这样做,对于高达16字节的双向量移位:

m = _mm256_alignr_epi8(_mm256_permute2x128_si256(m0, m1, 0x03), m1, 4);

在某些情况下,使用未对齐的负载可能更有效-它往往取决于特定的CPU和指令组合,因此值得在这两种方式上进行基准测试。

对于高达16字节的双向量移位,我通常会这样做:

m = _mm256_alignr_epi8(_mm256_permute2x128_si256(m0, m1, 0x03), m1, 4);
在某些情况下,使用未对齐的负载可能更有效-它往往取决于特定的CPU和指令组合,因此值得在这两种方式上进行基准测试。

未对齐的负载通常非常好,特别是如果与负载量相比,有很多向量ALU指令。未对齐的负载通常非常好,特别是如果你有很多向量ALU指令,与负载量相比。