在没有代码更改的情况下使用gcc的函数多版本是否可行?

Ale*_*der 9 c c++ linux gcc

根据大多数基准测试,英特尔的Clear Linux比其他发行版更快,主要得益于名为Function Multi-Versioning的gcc功能.现在他们使用的方法是编译代码,分析哪个函数包含向量化循环,然后使用FMV属性修补代码并再次编译.

gcc自动完成它有多可行?例如,通过传递-mmultiarch=sandybridge,skylake(或类似-m选项列出CPU扩展,如AVX和AVX2).

现在我对两种使用场景感兴趣:

  1. 将此选项用于我们的大型数学计算程序,以便向我们的客户提供发布.我不想污染具有非标准属性的代码,我不想修改我们使用的第三方库.
  2. 其他Linux发行版将能够轻松地完成此任务,而无需像英特尔那样修补代码.这应该为所有Linux用户带来巨大的性能提升.

R..*_*R.. 1

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