介绍
在当前的Go数学包中,当架构具有浮点单元(FPU)时,它使用针对该架构FPU优势定制的汇编代码加速浮点计算。虽然这种方法提供了出色的性能,但它与softfloat产生了兼容性问题。为了支持softfloat,我们可以使用-gcflags=all=-d=softfloat
,它可以在编译器内将浮点计算转换为softfloat,但这不会影响数学包中的任何汇编代码。(相关问题可以在这里找到:[ link to GitHub issue #62470 ]。)
为了解决这个问题,我们建议引入一个新的构建标签,使数学包无法利用与FPU相关的汇编代码进行性能优化,从而提供对softfloat的支持。
建议的解决方案
为了在Go数学包中支持softfloat,我们建议添加一个新的构建标签,我们称之为math_pure_go
,用户可以将其应用于禁用数学包中使用特定于FPU的汇编代码。我们可以使用math_pure_go
构建标签来禁用math
包中的汇编。通过构建标签-tags=math_pure_go
和-gcflags=all=-d=softfloat
,我们可以支持所有平台的softfloat。
go build -gcflags=all=-d=softfloat -tags=math_pure_go
好处
- 此增强将使Go数学包与softfloat兼容,允许在硬件FPU支持不可用或不希望的环境中或架构上使用Go。
- 需要softfloat支持的用户将能够使用数学包而不会遇到兼容性问题。
- 在许多场景中,软浮点支持是必要的,例如区块链和加密技术。
- 在区块链技术中,确定性和一致性至关重要,使用软浮点确保了各种平台上的一致结果。这对于实现去中心化网络中节点之间的共识至关重要。
- 零知识证明是一种依赖于精确和一致数学运算的加密技术。软浮点支持对于在实施零知识证明系统时实现一致且可预测的结果至关重要。
- 该提案符合Go在各种平台和用例中提供灵活性和兼容性的理念。
6条答案
按热度按时间stszievb1#
在math包中实现softfloat支持的实现可以在这个pull请求中找到:GitHub Pull Request #63271。
gwbalxhn2#
关于现有的purego标签?#23172 cc @dsnet
hc2pp10m3#
虽然这种方法提供了出色的性能,但它与softfloat产生了兼容性问题。
我们已经有了
GOMIPS=softfloat
、GO386=softfloat
等用于指定在特定平台上使用softfloat实现的方法——似乎再添加另一种(正交)方法来指定是错误的。如果WASM平台上确实需要softfloat支持,那么添加一个
GOWASM=softfloat
似乎会是一个更简洁的方法。8oomwypt4#
这应该可以通过仅添加
purego
支持 per #23172 来解决,而无需提出提案。它还有其他优点,例如支持其他编译器。TinyGo 目前不得不在 math 包中为符号创建别名:https://github.com/tinygo-org/tinygo/blob/731532cd2b6353b60b443343b51296ec0fafae09/compiler/alias.go#L27-L31
92vpleto5#
关于这个主题,是否还有正在进行的努力?PR #23172 似乎仍在使用较早提出的
math_pure_go
,这与pure_go
不同。这里的障碍是什么?我很高兴能提供帮助,因为我也在为 tinygo 工作,并从这个实现中受益。
ilmyapht6#
我不认为使用现有的
purego
构建标签来禁用math包中的汇编代码有问题。我认为没有阻碍因素,但有人需要编写和测试补丁。