最佳 SSE 无符号 8 位比较

2024-06-22

我试图找到使用 SSE(最高 SSE 4.2)执行 8 位无符号比较的最佳方法。

我正在处理的最常见情况是比较 > 0U,例如

_mm_cmpgt_epu8(v, _mm_setzero_si128())                // #1

(当然,这也可以被认为是对非零的简单测试。)

但我也对更一般的情况感兴趣,例如

_mm_cmpgt_epu8(v1, v2)                                // #2

第一种情况可以使用 2 条指令,使用各种不同的方法来实现,例如与 0 比较,然后将结果取反。第二种情况通常需要 3 条指令,例如从两个操作数中减去 128 并执行有符号比较。 (看这个问题 https://stackoverflow.com/questions/32945410/sse2-intrinsics-comparing-unsigned-integers适用于各种 3 种指令解决方案。)

我正在寻找的理想情况是#1 的单指令解决方案和#2 的双指令解决方案。如果这两者都不可能,那么我也对各种可能的 2 或 3 指令实现中哪一种在现代 Intel CPU(Sandy Bridge、Ivy Bridge、Haswell)上最有效的想法感兴趣。


到目前为止案例 #2 的最佳实现:

    1. 与无符号最大值比较等于并反转结果:

#define _mm_cmpgt_epu8(v0, v1) \ _mm_andnot_si128(_mm_cmpeq_epi8(_mm_max_epu8(v0, v1), v1), \ _mm_set1_epi8(-1))

两条算术指令 + 一条按位指令 = 1.33 吞吐量。

    1. 反转两个参数的符号位(== 减去 128)并使用有符号比较:

#define _mm_cmpgt_epu8(v0, v1) \ _mm_cmpgt_epi8(_mm_xor_si128(v0, _mm_set1_epi8(-128)), \ _mm_xor_si128(v1, _mm_set1_epi8(-128)))

一条算术指令 + 两条按位 = 1.16 吞吐量。


案例 #1 的最佳实现,源自上面的案例 #2 实现:

  • 1.

#define _mm_cmpgtz_epu8(v0) \ _mm_andnot_si128(_mm_cmpeq_epi8(v0, _mm_set1_epi8(0)), \ _mm_set1_epi8(-1))

一条算术指令 + 一位按位 = 0.83 吞吐量。

  • 2.

#define _mm_cmpgtz_epu8(v0) \ _mm_cmpgt_epi8(_mm_xor_si128(v0, _mm_set1_epi8(-128)), \ _mm_set1_epi8(-128)))

一条算术指令 + 一位按位 = 0.83 吞吐量。


有一个例子来自Simd 库 http://simd.sourceforge.net/:

    const __m128i K_INV_ZERO = SIMD_MM_SET1_EPI8(0xFF);//_mm_set1_epi8(-1);

    SIMD_INLINE __m128i NotEqual8u(__m128i a, __m128i b)
    {
        return _mm_andnot_si128(_mm_cmpeq_epi8(a, b), K_INV_ZERO);
    }

    SIMD_INLINE __m128i Greater8u(__m128i a, __m128i b)
    {
        return _mm_andnot_si128(_mm_cmpeq_epi8(_mm_min_epu8(a, b), a), K_INV_ZERO);
    }

    SIMD_INLINE __m128i GreaterOrEqual8u(__m128i a, __m128i b)
    {
        return _mm_cmpeq_epi8(_mm_max_epu8(a, b), a);
    }

    SIMD_INLINE __m128i Lesser8u(__m128i a, __m128i b)
    {
        return _mm_andnot_si128(_mm_cmpeq_epi8(_mm_max_epu8(a, b), a), K_INV_ZERO);
    }

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

最佳 SSE 无符号 8 位比较 的相关文章

  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 我们可以在 C# 中定义枚举的隐式转换吗?

    是否可以在 C 中定义枚举的隐式转换 可以实现这一目标的东西吗 public enum MyEnum one 1 two 2 MyEnum number MyEnum one long i number 如果没有 为什么不呢 有一个解决方案
  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i
  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 内存不足异常

    我正在使用 C 和 asp net 开发一个网络应用程序 我一直收到内存不足的异常 该应用程序的作用是从数据源读取一堆记录 产品 可能是数百 数千 通过向导中的设置处理这些记录 然后使用处理的产品信息更新不同的数据源 虽然有多个 DB 类
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • 更新 Angularjs 和 Momentjs 中的“时间之前”值

    原文 我有一个用 ng repeat 生成的表 其中包含数百个条目 其中包含几个不同的 unix 时间戳 我使用 moment js 让它们显示为 19 分钟前 或无论多久之前 例如 我如何每五分钟更新一次 而不必刷新整个表 这需要几秒钟并
  • Cassandra 无法创建 Java 虚拟机

    我在 Mac 操作系统上运行cassandra f并立即发生这种情况 0 002s warning gc Xloggc is deprecated Will use Xlog gc usr local apache cassandra 3
  • 是否可以访问函数的闭包?

    JavaScript 中的函数通过保留指向其封闭范围的 隐藏 链接来形成闭包 当我们拥有该函数 作为变量值 时 是否可以以编程方式访问它 真正的目标是理论上的 但演示可能是列出闭包的属性 var x function var y 5 ret
  • PHPUnit 模拟对象的属性

    我正在寻找一种模拟对象并填充其属性的方法 下面是使用另一个对象的属性的方法的示例 class MyClass private object public function methodUnderTest object this gt obj
  • 无法在 ruby​​ on Rails 上加载此类文件 - sqlite3/sqlite3_native (LoadError)

    当我尝试在 Ruby 2 0 0 上使用 Rails 4 0 0 设置基本安装和启动服务器时 我遇到以下错误消息 usr local lib ruby gems 2 0 0 gems sqlite3 1 3 7 lib sqlite3 rb
  • 如何使用全文索引进行精确匹配?

    我有一个带有全文索引的 MySql MyISAM 表 如下所示 CREATE TABLE tblsearch id int 11 NOT NULL AUTO INCREMENT title varchar 100 NOT NULL bran
  • 提升业力:对transform_attribute的隐式调用如何工作? (或者没有?)

    我有以下代码似乎工作正常 我基于语义操作通过提升业力重用已解析的变量 https stackoverflow com questions 22812707 reuse parsed variable with boost karma inc
  • jQuery:突出显示鼠标光标下的元素? [复制]

    这个问题在这里已经有答案了 可能的重复 如何让这个 JavaScript 更快 https stackoverflow com questions 4711023 how to make this javascript much faste
  • java.lang.IllegalArgumentException:除非 ServiceClient 使用帐户密钥凭据,否则无法创建共享访问签名

    我正在尝试使用 MSI 访问 Azure Blob 存储容器以生成共享访问签名 但每次我尝试访问时 都会收到以下错误 java lang IllegalArgumentException Cannot create Shared Acces
  • 自动登录用户到 Apostrope

    我扩展了 apostrope express 模块实现逻辑来检查请求标头中的 cookie 此检查的情况之一是自动登录用户 如果 cookie key val 与预设标志值匹配 那么我想在 aposUsersSafe 集合中查找用户 基于电
  • 如果使用 DOCTYPE,CSS 样式应用不正确

    1 CSS 样式未正确应用于我的 HTML 页面 如果我在 html 上添加特定版本 如 HTML5 HTML4 1 strict 等 如果我删除所有 DOCTYPE 语句 它可以正常工作 我的HTML代码 没有DOCTYPE也能正常显示
  • 如何从浏览器启动应用程序?

    是否可以从浏览器启动应用程序 我不是在谈论从浏览器打开文件 例如使用 Adob e Reader 打开 PDF 而是打开安装在用户计算机上的应用程序的新 空白 实例 假设情况 用户浏览一个网站 其中列出了可以通过 RDP 管理的计算机 他单
  • php mysql_connect 资源始终相同

    我的 php 脚本有问题 你可以在这里看到 http codepad org F0qhElRC http codepad org F0qhElRC 不为子级的每个连接打开新资源 我已经尝试使用 127 0 0 1 或我的本地网络 IP 但没
  • 在 MATLAB 2014b 及更高版本中使用画家渲染器进行三角形分割面片

    MATLAB 的新图形引擎 HG2 无法使用画家渲染器正确打印补丁 hist randn 1 1000 colorbar Location SouthOutside print test pdf dpdf 生成的补丁 无论是由hist or
  • 如何在codeigniter中设置时区?

    我正在使用 codeigniter 从事 php 项目 请告诉我为 php 和 mysql 设置时区的全局方法是什么 我可以在哪个文件中设置它 我想在没有 php ini 和 htaccess 文件的情况下设置它 目前我在每次输入之前都使用
  • 将 1970 年以来的秒数转换为日期的数学,反之亦然

    我自 1970 年 1 月 1 日 00 00 以来的秒数为 int64 以纳秒为单位 我正在尝试将其转换为月 日 年 星期几 迭代地执行此操作很容易 我可以做到这一点 但我想以公式化的方式执行此操作 我正在寻找实际的数学 老问题的新答案
  • LINQ To SQL 是否比使用 ado.net 和 oledb 提供更快的响应时间?

    毫无疑问 LINQ 简化了数据库编程 但它有缺点吗 内联 SQL 要求以某种方式与数据库进行通信 从而打开数据库以进行注入 内联 SQL 还必须进行语法检查 构建计划 然后执行 这需要宝贵的周期 存储过程也是优秀数据库应用程序编程中坚如磐石
  • 根据同一表中的其他行更新行

    我有下表 项目 id type color texture 1 card red rough 2 red smooth 3 red rough 4 green rough 我想更新表中的行 以便如果至少有一行的类型不为 NULL 并且其他行
  • Dojo require() 和 AMD (1.7)

    我在过渡到 Dojo 和新的 AMD 结构方面经历了一段漫长的时间 我真的希望有人能够阐明整个概念 过去几周我一直在谷歌上寻找信息 而不是使用它 而是使用它的结构和设计模式趋势 我觉得奇怪的是 对于一个相对复杂的 javascript 应用
  • 最佳 SSE 无符号 8 位比较

    我试图找到使用 SSE 最高 SSE 4 2 执行 8 位无符号比较的最佳方法 我正在处理的最常见情况是比较 gt 0U 例如 mm cmpgt epu8 v mm setzero si128 1 当然 这也可以被认为是对非零的简单测试 但