sse - 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
解决方案
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 位。除此之外,对于全向量洗牌,它的字节粒度最小。
推荐阅读
- c++ - C++ 快速排序错误
- c# - 抛出异常还是只返回一个字符串?
- java - Java Flight Recorder 应用方法开始和结束时间
- python - 在 python 中实现微型语言解析器时的问题
- c++ - (C++) 当数据类型介于“<”和“>”符号之间时是什么意思?
- java - 如何在android应用程序的后台检查哪个应用程序正在使用互联网、相机和麦克风?
- php - 两个表之间的 CASE 语句(高级)
- java - 打开应用程序时在 tabpane javafx 中更改选项视图
- c++ - windows.h Sleep(int) 函数是否浪费?
- android - 从微调器中获取条件,并根据该条件从数据库中检索并列出列表视图中的数据