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

问题描述

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

m0 = {0,1,2,3,4,5,6,7}
m1 = {8,9,a,b,c,d,e,f}

我需要将 m0m1 中抓取最后一个值:

m0 = {1,7,8}

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

m0 = {2,8,9}

依此类推(7次)直到

m0 = {7,e}

使用 AVX 指令的最佳方法是什么?

鉴于 m0m1 是从连续内存加载的:0,...,..., 考虑到它缓存在 L1 中,只是继续从内存中加载 m01 的地址,然后是 2 的地址,...)会更快吗?

解决方法

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

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

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