3

我有一个功能,我想为amd64架构提供一个程序集实现。为了便于讨论,我们假设它是一个 Add函数,但实际上它比这更复杂。我的程序集版本可以正常工作,但我的问题是让 godoc 正确显示。我有一种感觉,这是目前不可能的,但我想寻求建议。

更多细节:

  • 该函数的汇编实现只包含几条指令。特别是,调用函数的成本是整个成本的重要组成部分。
  • 它使用特殊指令 ( BMI2),因此只能在CPUID能力检查之后使用。

实现的结构类似于这个 gist。在高水平:

  • 在通用(非amd64情况)中,该函数是通过委托给 来定义的 addGeneric
  • amd64函数实际上是一个变量的情况下, 如果 检查通过,最初设置为但在函数中addGeneric替换为。addAsminitcpuid

这种方法有效。但是,godoc 输出很糟糕,因为在这种 amd64情况下,函数实际上是一个变量。注意 godoc 似乎正在使用与其运行的机器相同的构建标签。我不确定godoc.org会做什么。

考虑的替代方案:

  • Add函数委托给addImpl. 然后我们拉一些类似addImpl的技巧来替换amd64案例。这个问题是(在我的实验中)Go 似乎无法内联调用,并且程序集现在包含在两个函数调用中。由于组件已经很小,这对性能有显着影响。
  • 在这种amd64情况下,我们定义了一个简单的函数Add,其中包含检查,并根据结果useAsm 调用其中一个和。这将对性能产生更严重的影响。addGenericaddAsm

所以我想问题是:

  1. 有没有更好的方法来构建代码以实现我想要的性能,并让它在文档中正确显示。
  2. 如果没有其他选择,还有其他方法可以“欺骗”godoc吗?
4

1 回答 1

1

有关如何执行此操作的示例,请参见math.Sqrt 。

要处理 cpuid 检查,请在init()程序集实现中设置一个包变量并根据该变量有条件地跳转。

于 2018-05-20T13:17:18.110 回答