是否有 1 条指令移位 128/256 位?
Is there a shift 128/256 bits by 1 instruction?
我想我通过重写我的代码以在 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
vpmovmskb
只关心最高位,所以如果你能以相反的顺序处理这些位,你可以将 left.
例如vpaddb
,尽管元素大小并不重要,因为如果位跨越字节边界也没关系,只要它们不到达下一个字节的 MSB。所以你可以使用 vpslld ymm, ymm, 4
或其他东西来启动第二个依赖链而不是一个 7x vpaddb
链。此外,这为您提供了一个 uop,它可能能够 运行 在与 vpaddb/w/d
不同的端口上,在某些 CPU 上 vpadd*
不能在每个向量 ALU 上 运行像在 Skylake 上一样的端口。
更正您不能轻松地跨 64 位元素边界右移 1 位。
XMM/YMM 寄存器是 SIMD 向量,而不是 128 位整数。位级内容的最宽块大小是 64 位,在 SSE/AVX/AVX-512 中。除此之外,它是全向量随机播放的最小字节粒度。
我想我通过重写我的代码以在 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
vpmovmskb
只关心最高位,所以如果你能以相反的顺序处理这些位,你可以将 left.
例如vpaddb
,尽管元素大小并不重要,因为如果位跨越字节边界也没关系,只要它们不到达下一个字节的 MSB。所以你可以使用 vpslld ymm, ymm, 4
或其他东西来启动第二个依赖链而不是一个 7x vpaddb
链。此外,这为您提供了一个 uop,它可能能够 运行 在与 vpaddb/w/d
不同的端口上,在某些 CPU 上 vpadd*
不能在每个向量 ALU 上 运行像在 Skylake 上一样的端口。
更正您不能轻松地跨 64 位元素边界右移 1 位。
XMM/YMM 寄存器是 SIMD 向量,而不是 128 位整数。位级内容的最宽块大小是 64 位,在 SSE/AVX/AVX-512 中。除此之外,它是全向量随机播放的最小字节粒度。