BOOST_LIKELY 和 __builtin_expect 仍然相关吗?

2024-04-14

我明白所解释的内容here https://stackoverflow.com/questions/7346929/why-do-we-use-builtin-expect-when-a-straightforward-way-is-to-use-if-else这些还包括对 CPU 进行静态分支预测的提示。

我想知道这些在英特尔 CPU 上的相关性如何,因为如上所述,英特尔 CPU 已经放弃了对静态预测提示的支持here http://en.wikipedia.org/wiki/Branch_predictor#Static_prediction。另外,如果我现在了解它是如何工作的,路径中的分支指令的数量将是编译器可以控制的唯一东西,并且预测、获取和解码哪个分支路径是在运行时决定的。

鉴于此,是否存在代码中的分支提示对于针对最新英特尔处理器的软件仍然有用的情况,可能使用条件返回或在嵌套 if/else 语句的情况下避免关键路径中的分支指令数量?

另外,如果这些仍然相关,那么有关 gcc 和其他流行编译器的任何细节都值得赞赏。

附:我不赞成过早优化或用这些宏填充代码,但我对此主题很感兴趣,因为我正在处理一些时间关键的代码,并且仍然希望尽可能减少代码混乱。

Thanks


正如在您的问题的评论部分中您正确地发现:

  1. Intel x86 CPU 上的操作码映射中不再有静态分支预测提示;
  2. “冷”条件跳转的动态分支预测往往会预测失败路径;
  3. 编译器可以使用__builtin_expect重新排序 if-then-else 构造的路径将作为生成的程序集中的失败案例放置。

现在,考虑正在编译的代码库multiple目标架构,而不仅仅是 Intel x86。其中很多确实具有静态分支提示、不同复杂度的动态分支预测器,或两者兼而有之。

例如,英特尔安腾架构确实为所有类型的指令提供了广泛的预测提示系统:控制流、加载/存储等。安腾的设计目的是让编译器对代码进行广泛优化,并在其中包含所有这些静态分配的指令槽。捆绑包和提示。

所以,__builtin_expect仍然与以下(罕见)情况相关:1)编译器很难自动推导出正确的分支预测信息,2)至少一种目标架构上的底层硬件也已知无法可靠地动态预测它们。鉴于某些低功耗处理器包含不跟踪分支历史但始终选择失败路径的原始分支预测器,它开始看起来很有用。对于现代 Intel x86 硬件来说,情况并非如此。

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

BOOST_LIKELY 和 __builtin_expect 仍然相关吗? 的相关文章

随机推荐

  • Rails 会话中存储的对象变成了字符串?

    通常我不会在 Rails 会话中存储对象 但我正在使用需要此功能的库 我遇到了一个非常奇怪的问题 其中存储的对象在重定向后显示为字符串 为了重现 我创建了一个示例 Rails 4 1 应用程序 rails new session test
  • 如何编写从配置文件中获取值的自定义正则表达式验证器?

    我必须在模型中对用户名属性使用正则表达式验证器 我从配置文件中获取这个正则表达式 RegularExpression UsernameValidationExpression UsernameValidationExpression val
  • 如何在打字中安装express?

    我正在尝试在我的应用程序中使用expressjs 安装后使用typings install express ambient save I run tsc 但我收到两个错误 types main ambient express index d
  • 使用 OpenCV 对非正面图像进行人脸检测

    我正在尝试使用 opencv 来检测人脸 脸部不是正面 相机从侧面拍摄脸部 因此只能看到一只眼睛和部分嘴巴 我尝试了具有多种配置的 HaarDetectObjects 但没有获得任何好处 我改变了级联并进行了测试 haarcascade f
  • 在折线图中的特定点添加标记

    我正在绘制一个绘图线图 并希望使用标记突出显示线图上的特定点 其中数据框中的另一列不是 NA 此外 当我将鼠标悬停在绘图上时 我只想查看位于标记点上的 y 值 而不是绘图的其余部分 这是一个可重现的示例 到目前为止我已经尝试做到这一点 li
  • 使用 Python 检测 OpenCV 中的线条和形状

    我一直在使用 OpenCV cv2 并检测线条和形状 假设我女儿画了一幅图画 如下所示 我正在尝试编写一个Python脚本来分析绘图并将其转换为硬线条 形状 例如 话虽这么说 我已经安装了 opencv 并尝试使用它 但除了能够在图像中绘制
  • 如何设置扭曲的日志记录级别?

    我正在使用带有twisted的autobahn包 它会在每次连接到websocket时显示调试消息 我尝试将日志记录级别切换为信息但没有成功 import logging logging basicConfig level logging
  • 如何通过 Java 运行我的 haskell 函数

    假设我有一个 haskell 函数add in math hs 我怎样才能运行add通过Java程序运行函数并将输出存储为变量 也许像下面这样 public int runHaskell String haskellFile int out
  • 如何在 MATLAB 中编写向量化函数

    我刚刚学习MATLAB 我发现很难理解循环与矢量化函数的性能因素 在我之前的问题中 MATLAB 中的嵌套 for 循环非常慢 预分配 https stackoverflow com q 7811239 518169我意识到使用向量化函数与
  • 从传递给 C# 的 F# 列表中检索项目

    我在 C 中有一个在 F 中调用的函数 将其参数传递到Microsoft FSharp Collections List 如何从 C 函数中的 F 列表中获取项目 EDIT 我找到了一种 函数式 风格的方式来循环它们 并且可以将它们传递给如
  • docker-compose 构建镜像或构建上下文[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想构建自定义 Dockerfile 但我收到以下消息 gt Starting build app ERROR The Compose f
  • iText 列表项或 JTextArea 中的行间距

    我需要在 GUI 中同步 PDF 列表项和 JTextArea 的行距 我可以通过调整其中之一来做到这一点 在列表项 或 JTextArea 超过一行 在 JTextArea 中将换行设置为 true 之前 这一切都运行良好 我可以调整两个
  • 根据属性检查 firebase 是否存在现有对象,防止重复

    我想检查我的 firebase 看看我是否已经存储了一个与两个属性匹配的对象 为了将这个问题放在上下文中 想象一个仅存储歌曲的应用程序 具有 艺术家 和 歌曲名 等属性 如下所示 var wishlist new Firebase http
  • 在 Windows 10 家庭版 docker-compose.yml 文件中设置卷

    尝试设置 docker 以便当我在 Windows 计算机上更改项目文件时 它们会在我的 docker 容器中更新 从这个问题 https stackoverflow com questions 41925212 changing my p
  • 如何按日期在 R 中对大型数据框 (ffdf) 进行子集化?

    我正在尝试按日期对 FFDF 进行子集化 下面 我使用普通数据框成功创建了这样的子集 但我需要一些帮助才能将其应用到 FFDF 我的尝试以及错误消息都列在代码注释中 提前谢谢了 Create a normal data frame in p
  • 如何保持片段视图状态?

    我对碎片系统有疑问 我有两个片段 例如A and B 如果我搬家A to B Navigation findNavController v navigate R id B Now A片段 onDestroyView 被称为我知道这是正常的
  • 使用 Imagick 将图像从 RGB 转换为 CMYK

    我正在尝试将 RGB 图像转换为 CMYK 因为它们需要打印 我正在使用这段代码
  • JavaScript 中 /// 是什么意思?

    双正斜杠 是 JavaScript 中的注释 但是三重正斜杠是什么意思 意思是 我问的原因是当我删除具有以下内容的行时代码会中断 这让我相信 不是评论 可能是一个参考指令 https stackoverflow com questions
  • 使用 Bluebird 进行 Mongoose 承诺的正确方法是什么?

    我一直在阅读文档和文章 每个人似乎都描述了一起使用 Mongoose 和 Bluebird 的不同方式 甚至 Mongoose 官方文档说了些什么 http mongoosejs com docs promises html蓝鸟文档说另一件
  • BOOST_LIKELY 和 __builtin_expect 仍然相关吗?

    我明白所解释的内容here https stackoverflow com questions 7346929 why do we use builtin expect when a straightforward way is to us