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