_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(...) 采用非文字整数作为参数的内在函数 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 解构存在类型

    我使用存在类型作为包装器 在我的代码中 当我知道封闭类型时 我想用它做一些特定于封闭类型的事情 这是我能得到的最接近的 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