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



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

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

我需要移动m0m1抓取最后一个值:

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指令最好的方法是什么?

假设m0m1是从连续内存中加载的:考虑到m0缓存在L1中,仅仅从内存中加载CC_7 (1的地址,然后2的地址,…)会更快吗?

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

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

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

相关内容

  • 没有找到相关文章

最新更新