首页 > 解决方案 > 128/256 位是否有 1 条指令移位?

问题描述

我想我通过在 movemask epi8 之前重写我的代码来移动找到了我的解决方案,但是看起来我不能将 128/256 值移动 1 位。真的吗?搜索 sr 并查看 128 位指令显示在它们上执行 *8 的移位https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=789,5534,5534&techs=SSE2&cats=Shift&text=sr

我最初打算使用它的目的是将数组向右移动 1 位并将它们与它们相加,但我想我需要在 movemask 之前这样做。我觉得很奇怪,我不能做 128/256 位移 1

标签: ssesimdavx

解决方案


vpmovmskb只关心最高位,所以如果你能以相反的顺序处理这些位,你可以左移

例如vpaddb,尽管元素大小无关紧要,因为位跨越字节边界是可以的,只要它们不到达下一个字节的 MSB。因此,您可以使用vpslld ymm, ymm, 4或其他东西来启动第二个依赖链,而不是一个 7x 链vpaddb。此外,这为您提供了一个 uop,它可能能够在与 Skylake 上无法在每个矢量 ALU 端口上运行的vpaddb/w/d某些 CPU上不同的端口上运行。vpadd*

更正您无法在 64 位元素边界上轻松右移 1 位。

XMM/YMM 寄存器是 SIMD 向量,而不是 128 位整数。在 SSE/AVX/AVX-512 中,位级内容的最宽块大小是 64 位。除此之外,对于全向量洗牌,它的字节粒度最小。


推荐阅读