小编Sam*_*mar的帖子

根据支持的说明选择要使用的装配实现

我正在开发一个C库,它编译/链接到一个.a文件,用户可以静态链接到他们的代码.库的性能非常重要,因此我在x86-64汇编中编写性能关键的例程来优化性能.

对于某些例程,如果使用BMI2指令,我可以获得明显更好的性能,而不是坚持使用"标准"x86-64指令集.麻烦的是,BMI2最近刚推出,我的一些用户使用不支持这些指令的处理器.

所以,我写了两次优化例程,一次使用BMI2指令,一次不使用它们.在我目前的设置中,我将分发该.a文件的两个版本:一个需要支持BMI2指令的"快速" 版本,以及一个不需要支持BMI2指令的"慢"版本.

我问是否有办法通过分发单个.a文件来简化这一过程,该文件将根据最终应用程序运行的CPU是否支持BMI2指令动态选择正确的实现.

与StackOverflow上的类似问题不同,这里有两个特点:

  • 选择功能的技术需要在关键路径中具有特别低的开销.在汇编优化之后,所讨论的例程在~10 ns内运行,因此即使单个if语句也可能很重要.
  • 需要"动态"选择的功能在开始时选择一次,然后在程序的持续时间内保持固定.我希望这将提供比这个问题中建议的更快的解决方案: 在运行时选择方法实现

我到目前为止提出的最快解决方案是执行以下操作:

  1. 使用该cpuid指令检查CPU是否支持BMI2 指令.
  2. 设置全局变量truefalse取决于结果.
  3. 在每个函数调用上对此全局变量的值进行分支.

我对这种方法不满意,因为它有两个缺点:

  • 我不确定如何在程序开始时自动运行cpuid并设置一个全局变量,因为我正在分发一个.a文件并且无法控制main最终二进制文件中的函数.如果它提供了更好的解决方案,我很高兴在这里使用C++,只要最终的库仍然可以与C程序链接和调用.
  • 这会在每次函数调用时产生开销,理想情况下,唯一的开销是在程序启动时.

有没有比我上面详述的更有效的解决方案?

c c++ assembly static-libraries static-linking

7
推荐指数
1
解决办法
154
查看次数

标签 统计

assembly ×1

c ×1

c++ ×1

static-libraries ×1

static-linking ×1