assembly - Packed Shuffle Bytes,反向操作
问题描述
需要 AVX 专家:
给出洗牌指令
VPSHUFB ymm1、ymm2、ymm3/m256
根据文档,此“根据 ymm3/m256 的内容对 ymm2 中的字节进行洗牌”。
我的问题是:是否可以反转操作,换句话说,知道 ymm2 和洗牌的结果,是否有可能得到 ymm3?
例如
vpshufb ymm0, ymm0, ymmword ptr ds:[0x100]
我知道 ymm0 中已经加载了什么以及结果,但我想了解如何获取“控制掩码”ymmword ....
解决方案
是否可以反转操作,换句话说,知道 ymm2 和洗牌的结果,是否有可能得到 ymm3?
不,一般来说不是。 如果源数据有一些重复的元素(在通道内),则您无法唯一确定随机播放控制向量是什么,因为该输出字节可能来自多个地方。
当然,很容易想出一个随机控制来从该输入创建输出。
当然,如果 shuffle 输入数据在每个 16 字节通道中是唯一的,那么是的,您可以唯一地确定每个输出元素必须来自的索引。
即使这样,您也只能确定 shuffle 控制每个字节的低 4 位。(并且高位未设置,否则vpshufb
将输出的该字节归零。)位 6:4 对操作完全没有影响。(查看手册的操作部分:https ://www.felixcloutier.com/x86/pshufb 。随机控制向量元素的位 3:0 是源数据向量的索引。)
shuffle 控制元素的高位是另一个可能的歧义:如果输入数据包含任何零字节,则输出零可能来自对该源元素的索引或来自具有其高位设置的该控制元素。
顺便说一句,没有任何说明可以帮助您有效地做到这一点。IDK 如果您可以做得比一次搜索每个字节 1 的源位置更好。(使用字节广播和vpcmpeqb
-> vpmovmskb
->bsf
一次搜索所有 16 个位置。)
推荐阅读
- mysql - 使用 MySQL 而不是 H2
- c# - 我想用动态将项目添加到 tabcontrol
- azure-active-directory - Azure AD 域服务因连接测试失败而失败
- r - R Highcharter:从单点选择类别
- javascript - 如何修复 3D Serpinski Triangle 的透明面
- python - 将图像保存为 numpy 数组
- r - 将每 N 行转置到新列
- go - 在 golang 中实现通用链表,它不允许在同一个链表中使用不同的类型
- python - [Digest Auth]:邮递员或带有自定义标头的请求,都可以;python3-requests(2.14.2) 失败
- angular - 基于角色的 Firestore 安全规则