如何将AVX512寄存器zmm26的QuadWord写入rax寄存器?

jgr*_*015 8 x86 assembly intel avx512

我希望对zmm 0-31寄存器组的四字字元素执行整数运算操作,并保留这些操作产生的进位.看起来这只有在数据在通用寄存器集中处理时才有可能.

因此,我想将信息从一个zmm 0-31寄存器复制到一个通用寄存器.在处理通用寄存器中的64位数据之后,我想将数据返回到它来自的相同QuadWord位置的原始zmm 0-31寄存器.我知道我可以使用命令将数据从通用寄存器rax移动到AVX512寄存器zmm26 QuadWord位置5

    vpbroadcastq zmm26{k5}{z},rax 
Run Code Online (Sandbox Code Playgroud)

其中8位掩码k5 =十进制32,允许将数据广播到zmm26的第5个QuadWord,z = 1表示zmm26中没有其他QWord受影响,rax是数据源自的位置.

但是我找不到一个反向命令,它将寄存器zmm26,四字5中的数据写入rax寄存器.看来我只能使用vmovq rax,xmm1命令将最不重要的QuadWord从AVX寄存器复制到通用寄存器.并且没有使用掩码zmm 0-31源的广播命令.

我很高兴知道我的命令选项是从zmm 0-31寄存器到rax寄存器获得特定的QuadWord.此外,除了英特尔手册之外,AVX512指令集还有其他任何描述性信息来源吗?

Bee*_*ope 4

与一些早期的 SIMD 扩展不同,这些扩展具有“提取”指令,例如pextrq直接执行此操作的指令,我不知道在 AVX-512 中(也不在带有 ymm 寄存器的 AVX 中)执行此操作的任何方法,除了:

  1. 将您想要的元素排列/洗牌到低阶四字中,然后vmovq按照您的说明使用将其放入通用寄存器中。

  2. 将整个向量存储到临时内存位置loc(例如堆栈),然后使用mov register,[loc + offset]指令读取您感兴趣的 qword。

这两种方法看起来都很丑陋,哪种方法更好取决于您的具体情况。尽管使用内存作为中介,如果您计划从每个向量中提取多个值,则第二种方法可能会更快,因为您可以利用具有一个负载/周期吞吐量的最新 CPU 上的两个负载端口,而排列/洗牌方法可能会在排列/洗牌所需的端口上造成瓶颈。

请参阅下面彼得的回答,了解更全面的治疗方法,包括使用vcompress面膜的说明作​​为一种穷人的提取物。

  • 虽然很难猜测未来处理器的性能,但我无论如何都会尝试并建议使用“vextracti32x4”,然后使用“vpextrq”。这个不需要置换向量。 (2认同)