为什么 strchr 比我的 simd 代码快两倍

2023-12-04

我正在学习 SIMD,并且很好奇是否有可能在查找字符方面击败 strchr。看起来 strchr 使用相同的内在函数,但我假设它检查空值,而我知道该字符在数组中并计划避免空值检查。

我的代码是:

size_t N = 1e9;
bool found = false; //Not really used ...
size_t char_index1 = 0;
size_t char_index2 = 0;
char * str = malloc(N);
memset(str,'a',N);

__m256i char_match;
__m256i str_simd;
__m256i result;
__m256i* pSrc1;

int simd_mask;

str[(size_t)5e8] = 'b';


    char_match = _mm256_set1_epi8('b');
    result = _mm256_set1_epi32(0);

    simd_mask = 0;

    pSrc1 = (__m256i *)str;

    while (1){
        str_simd  = _mm256_lddqu_si256(pSrc1);
        result = _mm256_cmpeq_epi8(str_simd, char_match);
        simd_mask = _mm256_movemask_epi8(result);   
        if (simd_mask != 0){
            break;
        }
        pSrc1++;
    }

完整(尚未完成的代码)位于:https://gist.github.com/JimHokanson/433e185ba53b41e49ce3ac804568ac1e

strchr 的速度是此代码的两倍(使用 gcc 和 xcode)。我希望能明白为什么。

更新:使用以下方式编译:gcc -std=c11 -mavx2 -mlzcnt


我没有在编译器中设置优化标志。设置 -O3 导致 SIMD 代码仅占用 strchr 时间的 75%。

Update:我还应该澄清这不是代码的最终工作版本。仍然需要进行额外的检查以及优化调用的可能方法(我认为)。至少在这一点上,代码在 strchr 的范围内。正如问题评论中所指出的,此版本可能会读过一页并出现错误。最后,这主要是一个 SIMD 学习机会(对我自己来说),而 memchr 可能是你最好的选择(尽管我怀疑如果你有哨兵缓冲区,你可能能够稍微击败 memchr)。

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

为什么 strchr 比我的 simd 代码快两倍 的相关文章

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

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 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
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

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

随机推荐

  • 如何使用 VBA 创建 CurrentDb 的副本

    我需要使用 VBA 创建 CurrentDB 的副本 大约 12 个副本 这些副本需要是主数据库的克隆 其中包含所有相同的表单 查询等 但仅包含有限的数据集 DoCmd CopyDatabaseFile似乎是为此而设计的 但只有在使用它将数
  • 我们是否需要将所有具有不同 dpi 的图像添加到 Android 应用程序中

    如您所知 Android 应用程序具有不同的 DPI 并且在 Android 应用程序中我们可以添加drawable不同 DPI 的情况ldpi mdpi hdpi and xhdpi文件夹 问题是 当我们想要支持所有 DPI 时 我们应该
  • 查找 jasper server-ireport plugin.jar 对 maven 的依赖

    我正在尝试连接到JasperReports服务器从我的 Java 项目获取所有报告的列表 浏览完用户指南后 我发现有一个jasperserver ireport plugin jar其中有很多有用的帮助类 我需要为此获取 Maven 依赖项
  • 当特定幻灯片加载时或在计时器上调用子例程

    我正在使用用于信息亭显示的 PowerPoint 2003 演示文稿 并且它几乎 24 7 都在运行 其中一张幻灯片显示了天气 当前日期和 7 天的天气预报 我已经编写了从 Excel 工作簿更新天气并更新显示日期的子程序 但现在我必须在进
  • Facebook iOS SDK 3.0 无法在 iOS 3.x 上运行吗?

    The Facebook iOS SDK 3 0 Beta 说 这些新功能适用于 iOS 4 0 及更高版本 这是否意味着它不能在 iOS 3 x 上运行 这是否意味着如果我有一个支持 iOS 3 x 的应用程序 我就无法使用 Facebo
  • 同时根据两个参数进行集合排序

    我有一堂有两个日期字段的课程 class TestData Date activation Date timeStamp 我想根据以下内容对上述类别的列表进行排序activation日期 如果它们相等 则基于timestamp即 max a
  • Java 程序告诉您对于从 1 美分到 99 美分的任何金额的找零,要送出哪些硬币

    我必须编写一个 Java 程序 告诉您对于 1 美分到 99 美分之间的任意金额的找零 要发放哪些硬币 例如 如果金额为 86 美分 则输出将类似于以下内容 86 美分可以分为 3 个 25 美分 1 个角硬币和 1 个便士 使用 25 1
  • 实体框架(.NET 完整框架)订购包括[重复]

    这个问题在这里已经有答案了 我正在尝试让以下内容发挥作用 dbmsParentSections FactoryTools Factory PdfSections Include x gt x Children OrderBy y gt y
  • Elastic Search - Spark 中的多个字段作为映射 ID

    我对弹性搜索还很陌生 我在用elasticsearch hadoop 6 2 4版本 我正在读取文件HDFS 转换为bean对象并写入elasticsearch 我正在使用 Spark 结构化流 StreamingQuery query d
  • Ruby on Rails 不使用脚手架和生成器?

    我是 ruby on Rails 的新用户 我有一些问题请尽快给出答案 1 是否可以在不使用的情况下创建Web应用程序 rails新应用程序名称 命令 意味着手动创建所需的文件夹和文件 2 我想在不使用脚手架和生成器的情况下创建应用程序 因
  • 使用java创建XLSX文件后出现错误消息

    我正在使用 apache poi 使 用 java 创建一个简单的 xlsx 文件 如下所示 String date 2014 12 29 XSSFWorkbook w ADPFidessa createExcelWorkbook date
  • 使用 C# Windows 窗体应用程序 (.NET Framework) 进行 Windows Hello 验证?

    我可以编写一个代码块 在单击按钮时打开 Windows Hello 窗口并根据密码的正确性采取操作吗 如果我会写 我会怎样写 我正在研究 Windows Forms NET Framework C 对于 NET Framework WinF
  • 为什么内联 JavaScript 不好?

    始终建议通过将所有代码放在一个文件中来避免内联 Javascript 代码JS文件 该文件包含在所有页面中 我想知道 这是否不会导致大页面的性能问题 例如 假设我们有数十个这样的函数 function function1 element v
  • 旋转画布不应旋转其子画布

    有没有什么方法可以只旋转画布而不旋转它的子元素 如图像 几何图形等 任何人可以提供的任何帮助将不胜感激 非常感谢 拉希什 Kent Boogarts 的建议也是我最初想到的 实施起来并不难 因为可以直接绑定到Inverse画布的变换
  • ARCore – 渲染距相机200m远的物体

    我正在使用 ARCore 和 Sceneform 开发 Android AR 项目 我需要放置物体距离30米到200米来自用户的相机并面对视锥体剔除ArCore 中的问题 已描述HERE 我正在尝试设置投影矩阵增加far使用该方法的参数 p
  • 如何填充现有列表/数组

    我是 Reason ocaml 函数式编程的新手 我知道关于List append and 但这些函数将创建新列表 但如何填充现有列表 数组 填充列表的最佳方法是什么 填充数组的最佳方法是什么 表示坐标类型是否为let coords arr
  • 接近大小限制 - 手表应用程序的大小(50MB 限制令人头疼。)

    我们的应用程序达到了大约 49MB 而且我们还没有完成一半 所以肯定会超过50MB的限制 我有以下几个问题 1 watchOS 中可以使用按需资源吗 2 我的资源 图像 自定义字体 制作2份副本 每一份是手表应用程序 另一份是手表扩展 怎么
  • 如何获取 Scala 中当前的脚本或类名?

    我希望我的 Scala 程序能够以编程方式确定其脚本文件名或其类名 将字符串存储在变量中program并打印出名字 Java有several为此的方法 我认为这是最简单的 val program new Exception getStack
  • 为什么模板函数调用不明确?

    include
  • 为什么 strchr 比我的 simd 代码快两倍

    我正在学习 SIMD 并且很好奇是否有可能在查找字符方面击败 strchr 看起来 strchr 使用相同的内在函数 但我假设它检查空值 而我知道该字符在数组中并计划避免空值检查 我的代码是 size t N 1e9 bool found