_mm_extract_epi8(...) 采用非文字整数作为参数的内在函数

2023-12-11

我最近一直在使用 SSE 内在函数int _mm_extract_epi8 (__m128i src, const int ndx)根据参考文献“从按索引选择的打包整数数组元素中提取整数字节”。这正是我想要的。

但是,我通过以下方式确定索引_mm_cmpestri on a _m128i对具有显式长度的字符串数据执行打包比较并生成索引。该索引的范围是 0..16,其中 0..15 表示有效索引,16 表示未找到索引。现在要提取索引位置处的整数,我想到执行以下操作:

const int index = _mm_cmpestri(...);
if (index >= 0 && index < 16) {
  int intAtIndex = _mm_extract_epi8(..., index);
}

这给我们留下了 gcc (-O0) 编译器错误:

错误:选择器必须是 0..15 范围内的整数常量

解决这个问题的一个糟糕的方法是switch上的索引和_mm_extract_epi8调用 0..15 范围内的每个索引。我的问题是是否有我没有看到的更好/更好的方法。

更新:使用-O3优化,没有编译错误;但仍然使用-O0。


只是为了总结并结束问题。

我们讨论了从 [0..15] 中提取索引 i 处的 3 个选项_m128i sse其中 i 无法在编译时简化为文字:

1) 开关&_mm_extract_epi8: 有一个switch在 i 和 [0..15] 中每个 i 的情况下,执行_mm_extract_epi8(sse,i);就像我现在一样工作是一个编译时文字。

2) Union hack:有一个union SSE128i { __m128i sse; char[16] array; },将其初始化为SSE128i sse = { _mm_loadu_si128(...) }并访问索引 i 处的字节sse.array[i].

3)将第i个元素洗牌到位置0并且_mm_extract_epi8: use _mm_shuffle_epi8(sse,_mm_set1_epi8(i))将第 i 个元素打乱到位置 0;提取它与_mm_extract_epi8(sse,0).

评估:我在 Intel Sandy Bridge 和 AMD Bulldozer 架构上对这三个选项进行了基准测试。转换选项以微弱优势获胜。如果有人感兴趣,我可以发布更详细的数字和基准设置。

更新:评估基准设置:解析 1GB 文件的每个字节。对于某些特殊字节,增加一个计数器。使用_mm_cmpistri找到特殊字节的索引;然后使用提到的三种方法之一“提取”字节,并进行区分大小写,其中计数器递增。代码是使用 GCC 4.6 编译的-std=c++0x -O3 -march=native.

对于每种方法,基准测试在 Sandy Bridge 机器上运行 25 次。结果(运行时间的平均值和标准差,以秒为单位):

切换并提取: 平均值:1071.45 标准差:2.72006

联盟黑客: 平均值:1078.61 标准差:2.87131

从位置 0 开始进行混音和提取: 平均值:1079.32 标准差:2.69808

差异是微乎其微的。我还没有机会查看生成的汇编。不过,看到差异可能会很有趣。目前我无法发布基准测试的完整代码,因为它包含非公开来源。如果我有时间,我会提取这些并发​​布来源。

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

_mm_extract_epi8(...) 采用非文字整数作为参数的内在函数 的相关文章

随机推荐

  • 解构存在类型

    我使用存在类型作为包装器 在我的代码中 当我知道封闭类型时 我想用它做一些特定于封闭类型的事情 这是我能得到的最接近的 LANGUAGE ExistentialQuantification class Agent a where agent
  • 用特殊字符填充文本区域

    我正在使用用户之前的输入填充文本区域 这是从数据库中提取并设置为文本区域服务器端的内容 我们似乎遇到了拼写错误和特殊字符组合的问题 如果用户输入 6最初 当我尝试用它填充我的文本区域时 它只是呈现一个小正方形 就像它解释字符编码值一样 使用
  • 针对非类型参数的特定值的模板代码优化。

    template
  • 查找近似重复记录的技术

    我正在尝试清理一个数据库 多年来该数据库已获取许多重复记录 且名称略有不同 例如 在公司表中 有 Some Company Limited 和 SOME COMPANY LTD 之类的名称 我的计划是将有问题的表导出到 R 中 将名称转换为
  • 如何在命令行中使用 Robocopy 复制带时间戳的文件

    以下是我将计算机中的文件复制以及从计算机复制到网络的命令 ROBOCOPY K Builds F Builds E COPY DAT ROBOCOPY E K Shan Khan E COPY DAT 我怎么能在目标文件夹中创建时间戳仅在复
  • 如何使用txt文件作为命令行参数?

    我有一个像这样的 txt 文件 6 4 1 2 2 3 3 4 4 5 1 2 4 5 如何在 C 中使用它作为命令行参数 如果您打算提供您的程序数据program exe lt data txt 这就是所谓的从标准输入读取 您可以通过 N
  • 如何接收 OS X 中文件系统更改的通知?

    在 Windows 中 我可以使用 FindNextChangeNotification API 来监视文件或文件夹的更改 例如 我可以监视文件夹并在添加或删除文件时收到通知 OS X 上有类似的 API 吗 Mac OS X v10 5
  • BZIP2块标头:1AY&SY

    这是关于BZIP2的问题存档格式 任何BZIP2存档都由文件标头 一个或多个块和尾巴结构组成 所有块应从 1AY SY 开始 pi号的BCD编码数字为6个字节 0x314159265359 根据BZIP2的来源 A 6 byte block
  • VBA中MSSQL“走”的正确使用

    我即将运行一个使用 MSSQL 编写的批处理 如下所示 create function xy end go create function2 xy end go 然后 我将它保存在一个文件中 我的宏将其读入一个字符串并使用 ADO 尝试运行
  • Angular 2 Reactive Forms 仅从更改的控件中获取值

    我有一个包含所有输入的动态创建的表单 我正在订阅更改 但是当某个控件发生更改时 我会从所有控件中获取值 因此我真的不知道哪个控件发生了更改 是否可以使用 valueChanges 函数仅从更改的控件中获取更改的值 该表单非常大 因此将每个控
  • java中的复选框数组

    我想要 6 个复选框 并在按下按钮后执行一些操作 您有例子吗 还可以使用复选框数组吗 我想避免 Checkbox cb1 new Checkbox A Checkbox cb2 new Checkbox B 我正在做类似的事情 JPanel
  • 从另一个视图调用一个视图

    我有一个登录 phtml视图想要放置一个公共路径并让任何模块通过应用程序访问它 对于由以下方式渲染的侧边栏 this gt render common sidebar phtnl 它可以工作 因为我的布局对于所有模块都是单一的 但说到内容
  • 基于XmlChoiceIdentifier创建对象

    我正在使用 Activator C 动态创建对象 其中一个类如下所示 class Driver Driver XmlChoiceIdentifier ItemElementName XmlElement Bit16 typeof Drive
  • 为什么 PHP 会话在页面重新加载时被删除?

    所以我遇到了这个问题 当我在页面上一段时间没有执行任何操作时 在重新加载页面后 SESSION已清除 我检查了代码 它没有任何unset 功能或任何其他可以清除 SESSION多变的 任何想法为什么会发生 Edit 如果我想让会话一直持续到
  • 通过样式更改操作栏溢出菜单项的高度

    我们正在开发一款用于工业用途的 Android 应用程序 我们增加了操作栏 文本等的大小 以帮助提高可见性和触摸目标大小 一切正常 但是我无法增加操作栏溢出菜单列表项的高度 挖掘周围我已经能够使用更改弹出菜单的背景颜色
  • 在方法中返回 Meteor.http 结果

    我有一个围绕 http get 的 Meteor 方法 我试图将 http get 的结果返回到方法的返回中 以便在调用该方法时可以使用结果 但我无法让它发挥作用 这是我的代码 在共享文件夹中 Meteor methods getWeath
  • 如何使用 JQuery 在输入类型文件中验证文件扩展名?

    HTML
  • 对子集使用表可获取整个 DF 而不是子集的频率

    我正在使用子集从列值集中提取 我有一个包含几列的 DF 其中一列是状态 我需要获取状态的频率 但只是针对某些状态集 所以我有这个 tmp lt subset DF DF STATE in SOMESTATES a lt as data fr
  • C# 从网络服务下载文件

    我有一个网络服务 比如这个例子用于从服务器下载 zip 文件 当我通过网络浏览器打开 URL 时 我可以正确下载 zip 文件 问题是当我尝试通过桌面应用程序下载 zip 文件时 我使用以下代码进行下载 WebClient webClien
  • _mm_extract_epi8(...) 采用非文字整数作为参数的内在函数

    我最近一直在使用 SSE 内在函数int mm extract epi8 m128i src const int ndx 根据参考文献 从按索引选择的打包整数数组元素中提取整数字节 这正是我想要的 但是 我通过以下方式确定索引 mm cmp