c - 在不更改代码的情况下使用 gcc 的功能多版本控制是否可行?

标签 c linux gcc compiler-optimization avx

根据 most benchmarks ,英特尔的 Clear Linux 比其他发行版快得多,这主要归功于名为 Function Multi-Versioning 的 GCC 功能。 .现在 method他们使用的是编译代码,分析哪个函数包含向量化循环,然后使用 FMV 属性修补代码并再次编译。
GCC 自动执行此操作的可行性如何?例如,通过传递 -mmultiarch=sandybridge,skylake (或类似的 -m 选项列出 CPU 扩展,如 AVX 和 AVX2)。
现在我对两种使用场景感兴趣:

  • 将此选项用于我们的大型数学密集型程序,以便向我们的客户交付版本。我不想用非标准属性污染代码,也不想修改我们使用的第三方库。
  • 其他 Linux 发行版将能够轻松做到这一点,而无需像英特尔那样修补代码。这应该会给所有 Linux 用户带来巨大的性能提升。
  • 最佳答案

    不,但没关系。非常,非常实际上将从中受益的少量代码;大多数情况下,通过全局执行,您只会(无需特别努力将页面中的匹配版本排序在一起)使您的系统由于代码大小的巨大增加而受到更多内存限制和更慢。大多数实际负载甚至不受 CPU 限制;它们是 syscall-overhead-bound、GPU-bound、IO-bound 等等。 许多现代的 CPU-bound 不是运行预编译代码而是 JIT 代码(即在浏览器中运行的所有东西,无论是那是您真正的浏览器,或者是每个 Electron 应用程序中过时且未打补丁的 Chrome 分支)。

    关于c - 在不更改代码的情况下使用 gcc 的功能多版本控制是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48882796/

    相关文章:

    c++ - 使用 CMake 和 GCC 在 Mac 上构建静态库?

    c - 数据结构中的说明符限定符列表错误

    c - 在C中打印带有UTF8字符的字符串

    c - 无法从与共享库链接的 C 程序访问全局程序集标签数​​据

    linux - windows-在双引导中安装 Linux 和 "break"RAID 0

    c++ - 为什么这段代码不能编译?

    c++ - 使用 gcc 32 位编译,作为带有 -m64 的 64 位程序

    c - 你如何在 C 中创建一个 "waits"和 x 秒数的函数?

    c++ - 如何在 C/C++ 中将 long long 转换为 unsigned int

    php - 确定 PHP 在 OOM 终止期间正在做什么?