我在理解 AVX shuffle 内在函数如何为 8 位工作时遇到一些问题

2024-03-21

我正在尝试使用 _mm256_shuffle_epi8 将 16 位数据打包为 8 位,但我得到的结果不是我所期望的。


auto srcData = _mm256_setr_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
                               17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32);

__m256i vperm = _mm256_setr_epi8( 0,  2,  4,  6,  8, 10, 12, 14,
                                 16, 18, 20, 22, 24, 26, 28, 30,
                                 -1, -1, -1, -1, -1, -1, -1, -1,
                                 -1, -1, -1, -1, -1, -1, -1, -1);

auto result = _mm256_shuffle_epi8(srcData, vperm);

我期望结果包含:

1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31,
0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0

但我有:

1, 3, 5, 7, 9, 11, 13, 15,  1,  3,  5,  7,  9, 11, 13, 15,
0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0

我肯定误解了 Shuffle 的工作原理。 如果有人能启发我,我将非常感激:)


是的,值得期待。查看 _mm_shuffle_epi8 的文档。 256 位 avx 版本只是简单地为 YMM 寄存器中的两个 16 位值复制该 128 位指令的行为。

所以你可以打乱前 16 个值,或者最后 16 个值;但是,您不能跨 16 字节边界对值进行洗牌。 (您会注意到所有超过 16 的数字都是相同的数字减去 16。例如 19->3、31->15 等)。

您需要执行额外的步骤。

__m256i vperm = _mm256_setr_epi8( 0,  2,  4,  6,  8, 10, 12, 14,
                                 -1, -1, -1, -1, -1, -1, -1, -1,
                                  0,  2,  4,  6,  8, 10, 12, 14,
                                 -1, -1, -1, -1, -1, -1, -1, -1);

然后使用_mm256_permute2f128_si256将第0和第2字节拉入前128位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我在理解 AVX shuffle 内在函数如何为 8 位工作时遇到一些问题 的相关文章

随机推荐

  • 操作错误:(2001,“无法创建 UNIX 套接字 (24)”)

    我正在使用 django 1 2 和 python 2 6 并且我正在使用 mysql 服务器 经过一段时间的工作 选择和更新记录后 我收到此错误 Exception in thread Thread 269 Traceback most
  • 0 到 n 范围内的随机数

    给定一个产生真正随机 32 位数字的函数 R 我想要一个返回 0 到 n 范围内的随机整数的函数 其中 n 是任意的 小于 2 32 该函数必须以相同的概率生成 0 到 n 的所有值 我想要一个在恒定时间内执行的函数 没有 if 语句或循环
  • 如何在QWebEngineView中保存动态生成的网页?

    我正在将网页加载到QWebEngineView 用户创建不同类型的表格 报告 然后需要将这些表格作为网页保存到本地计算机 这是我尝试过的 这里我使用一个QWebEnginePage save 方法 但没有任何反应 connect saveB
  • 在Python中的远程机器上执行命令

    我正在 Ubuntu 上用 python 编写一个程序来执行命令ls l在 RaspberryPi 上 连接网络 有人可以指导我该怎么做吗 当然 有多种方法可以做到 假设您有一个 Raspberry Piraspberry lan主机和您的
  • 如何将字符串传递给批量插入而不是文件?

    我曾经使用批量插入命令来转换 Csv 文件 int 表 最近 我将 CSV 文件保存为 SQL Server 中的 VarBinary 值 现在我可以通过使用 CAST 和 CONVERT 函数将其类型转换为 Varchar 来从 Varb
  • 发布 apk 后的真实 Android 设备上的 Google 地图仍然是空白

    我想生成并使用 google API 密钥 启用谷歌地图 v2 API 使用谷歌地图创建了包含一项活动的项目 工作室中的默认向导 在谷歌上创建了用于调试项目的密钥 并已分配SHA1 应用程序包谷歌上项目密钥的应用 API 密钥已插入 goo
  • 如何在mapbox ios sdk中向MGLFillStyleLayer添加线宽属性?

    我必须使用 MGLPolygonFeature 在 MGLFillStyleLayer 中添加多边形特征 但问题是我无法更改轮廓宽度 线宽为MGLFillStyleLayer目前无法更改 建议的解决方法是使用相同的源来创建MGLLineSt
  • 将 grails 从 2.1.1 升级到 2.4.3

    我正在将 grails 应用程序从 2 1 1 升级到 2 4 3 解决升级过程中的错误是一个永无止境的故事 现在我被困在这一点上 有什么想法如何解决这个问题吗 Thanks C workspace grails apps monitori
  • 如何在 Jooq 中比较日期

    In the mysqldb 我有一个字段名称date type date 该字段的值如下2019 11 05 如何在jooq中查询上面提到的日期 我尝试跟随 java util Date date SimpleDateFormat yyy
  • 如何按parentId JS对对象数组进行排序

    我怎样才能对这个数组进行排序 我正在尝试对来自 a 的对象数组进行分组parentId数组的每个元素带来的级别总是不确定的 我期望的结果就是输出中的结果 Input id 123 name ABC parentID id 645 name
  • 在 Pandas 中创建 DataFrame 时填充默认 0

    我有一个输入字典 其中列表的长度可能不同 d b 2 3 a 1 当我做 df pd DataFrame data d 我正在看ValueError 数组的长度必须相同 Question 创建 df 时如何用默认值 例如 0 填充缺失值 创
  • 如何使用 elisp 更改缓冲区中的单词?

    如何使用 elisp 更改 at point 的单词 很像 大写单词 但使用我自己的函数 背景 我编写了一个函数 可以检测当前点数字的基数 并将其转换为任何其他基数 我想做的是直接更改缓冲区中的数字 TIA 马库斯 试试这个代码 我已经包含
  • 如何在表格内打印表格的内容? [路亚]

    我想做的只是在表中打印表的内容 例如 local stats table1 tTable1 data 1 tTable2 data2 2 tTable3 data3 3 我并不真正关心表 1 或所有表 而是关心数据变量中的信息 我怎样才能打
  • 为自定义 WCF 绑定指定 HTTPS

    我有一个自定义绑定定义如下
  • 在列表中调用“del”

    class ToBeDeleted def init self value self value val Whatever def del self print self value l ToBeDeleted i for i in ran
  • 从另一个 Java 应用程序启动一个 Java 应用程序

    我正在做一个 Java 记录 重放工具 我需要从我的主 Java 应用程序启动 Java 应用程序 我需要访问 EventDispatchThread 以便拦截事件并记录它们 因此我通过反射启动应用程序 简化的代码片段 Class
  • .NET 编译器平台:不工作

    我安装了 Microsoft Visual Studio Enterprise 2017 版本 15 5 5 显然是日期的最新版本 但是 我无法使用 NET Compiler Platform SDK 我曾经将它作为扩展 但现在它无法与警告
  • 根据任意数字出现拆分字符串

    使用正则表达式如何根据数字出现拆分字符串 例如我有一个如下所示的字符串 var text 1 dozen 3 dozen 4 dozen kg 我需要把它分开 预期输出 1 dozen 3 dozen 4 dozen kg 我尝试了以下正则
  • 有没有办法使用 JS 确定何时加载 4 个图像?

    我一页上有 4 张图片 我想在所有 4 个图像加载完毕后触发 JS 事件 我当然无法确定图像将以哪个顺序加载 因此我无法在最后一个图像上触发事件 一个想法是有一个计数器 但我想不出检查该计数器何时等于 4 的最佳方法 因为我不喜欢 setT
  • 我在理解 AVX shuffle 内在函数如何为 8 位工作时遇到一些问题

    我正在尝试使用 mm256 shuffle epi8 将 16 位数据打包为 8 位 但我得到的结果不是我所期望的 auto srcData mm256 setr epi8 1 2 3 4 5 6 7 8 9 10 11 12 13 14