【问题标题】:Can likely/unlikely macros be used in user-space code?可以在用户空间代码中使用可能/不太可能的宏吗?
【发布时间】:2010-12-12 16:27:54
【问题描述】:

我在 Linux 内核代码中遇到了这两个宏。我知道它们是编译器(gcc)的指令,用于在分支的情况下进行优化。我的问题是,我们可以在用户空间代码中使用这些宏吗?它会进行任何优化吗?任何示例都会非常有帮助。

【问题讨论】:

  • 我查看了这些帖子,但都再次谈到了与内核相关的内容。我想知道是否可以在用户代码中使用相同的内容。
  • 如果您正在为任何相当强大的处理器编程,您不太可能获得任何性能优势。现代动态分支预测器非常好。
  • @Jay 我认为程序员不应该承担处理器的能力。如果程序员明确提供信息,动态分支检测会更容易。

标签: c linux gcc optimization likely-unlikely


【解决方案1】:

是的,他们可以。 In the Linux kernel,它们被定义为

#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)

__builtin_expect 宏是使用分支预测的 GCC 特定宏;它们告诉处理器某个条件是否可能为真,以便处理器可以在分支的正确“一侧”预取指令。

您应该将定义包装在 ifdef 中以确保在其他编译器上编译:

#ifdef __GNUC__
#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)
#else
#define likely(x)       (x)
#define unlikely(x)     (x)
#endif

如果您将它用于正确的分支预测,它肯定会给您带来优化。

【讨论】:

  • 在#else 部分中,他们不应该评估为 (x) 而不是空吗?
  • 用户包含目录中哪个头文件包含这个定义?
  • @tonfa 我不想要内核的头文件。我想要 /usr/include 中的文件,以便我可以将它包含在我的用户空间代码中。
  • 它们仅在内核头文件中可用(或者可能在其他项目中)。我建议您创建自己的头文件并添加上面的定义。 __builtin_expect 是 gcc 内置的,不需要额外的头文件。
  • 您应该使用 !!(x) 而不是只使用 (x),以强制将参数转换为 0 或 1。
【解决方案2】:

查看“6.2.2 优化 1 级指令缓存访问”下的 What Every Programmer Should Know About Memory - 有一节正是关于此的。

【讨论】:

  • @Nikolai 谢谢你的链接。
  • 没问题。这是一篇非常有启发性的论文,即使是第三次阅读:)
【解决方案3】:

可能()和不可能()宏是在内核头文件中定义的漂亮名称,用于真正的gcc feature

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2022-11-23
    • 2010-09-29
    • 2014-05-12
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多