Design: 带进位的算术

创建于 2017-03-28  ·  7评论  ·  资料来源: WebAssembly/design

(这是问题的扩展版本(https://github.com/WebAssembly/spec/issues/446))

多精度算术需要特殊处理。 这在所有 ISA 中都以某种形式提供,但目前在 webasm 中不可用。

基本上有三种方法可以做到这一点(在我看来),在当前设计的背景下,没有一种是特别可口的:

选项 1. 添加一个特殊的标志寄存器,以及使用该寄存器进行算术运算的指令。

这是主流硬件中的传统方法。

你会得到类似的指示

地址

这将添加两个数字和进位标志的值,并在结果上设置进位标志。

这并不令人愉快,因为它增加了一个特殊的寄存器。

选项 2。
支持一种 60 位算术形式,其中 4 位用于标志。

选项 3。
支持多字算术:加法需要 3 个参数并产生 2 个输出。

这种方法将对现有的 ISA 和寄存器架构造成最小的损害。 但是,这很难有效地映射到现有硬件(并非所有硬件 ISA 都支持直接加载标志寄存器。

不管怎样,多精度算术非常重要,如果没有一些简单的硬件支持,很难模拟。

最有用的评论

在这个问题上是否有任何进展? 有效地实施现代密码学(例如 SIDH)需要进位和借位。 没有 ADDC 的大数加法比使用 ADDC 慢多个因素。 这同样适用于减法和乘法。

所有7条评论

在我看来,对于选项 3,有一些合理的优化可以使它变得实用。 假设 {i32,i64}.addc 接受三个输入,顶部 op2,底部 op1,底部进位并产生两个输出,结果在顶部并在其下方进位。 为了论证起见,假设进位总是与其他操作数相同的类型。 定义 addc 仅使用进位的低位,并且操作后的左进位为零或一。 比如说,现在已经为多词添加合理地设置了东西。 在适当展开的循环中,JIT/Wasm 编译器确实应该能够看到正在传播的进位,并生成良好的代码。 (如果循环没有展开,那么循环开销无论如何都会稀释进位提取/插入。)我认为用于进位提取的最坏情况无分支代码应该是mov rd, 0; adc rd, 0 ; 对于插入,类似于and rc, 1; add rc, ~0其中 rc 是一个寄存器,其中包含一个被视为进位的值。

在 ARM 上,消费进位与产生进位是分开的:ADC 消费,ADC.S 消费和生产,ADD.S 只生产。 我们想要所有这些变体吗? 那么溢出呢?

(可能还有第四个选项,我们添加一个条件操作和分支操作,它既产生结果又分支到标签或不分支,例如, i32.addc op1 op2 carry L将在进位集上分支到 L并在进位清除时失败,并且无论哪种方式都会在堆栈上留下结果,但总的来说,它似乎比您建议的三个选项更难使用。)

有人愿意支持这个提议吗? 我们需要提议的语义、二进制编码,并且我至少想要一个用例和一个具有这些用例的性能数字的实现(比较当前的 MVP WebAssembly、这个提议的添加和本机代码)。

原则上,我愿意支持这一点。
然而,个人变化意味着我至少在接下来的几个月内资源有限。
———
弗兰克·麦凯布
高级软件架构师
电话:650-740 6673 | 电子邮件: [email protected] [email protected]
初始逻辑 | 加利福尼亚州帕洛阿尔托市兰伯特大街 450 号,邮编 94306 | instartlogic.com http://instartlogic.com/

2017 年 5 月 11 日上午 10:14,JF Bastien [email protected]写道:

有人愿意支持这个提议吗? 我们需要提议的语义、二进制编码,并且我至少想要一个用例和一个具有这些用例的性能数字的实现(比较当前的 MVP WebAssembly、这个提议的添加和本机代码)。


您收到此消息是因为您编写了该主题。
直接回复此邮件,在 GitHub 上查看https://github.com/WebAssembly/design/issues/1021#issuecomment-300856161 ,或将帖子静音https://github.com/notifications/unsubscribe-auth/ADfCzd9le4ufXm6DSsArpfXCYsGdV7UIks5r40H5gaJpZM4MrKma

我可能会有时间来做这件事,不过要到 6 月左右,然后到秋天。 IMO 这个功能相当重要,我认为溢出标志与进位标志一样重要,尽管有不同的用例(动态语言的 fixnum -> bignum 转换)。

今天与一些 Mozilla 人讨论了这个问题。 总之:

  • 我们可能确实需要专门的指令,因为模拟行为会很慢,而且我们通常不希望进行魔术模式匹配来识别模拟并将其转化为幕后的高效机器代码
  • 我们当然关心进位/借位和溢出; 其他标志待定
  • 我们肯定关心加减法; 乘法,除法,旋转(通过进位旋转很常见,但它对 Wasm 有用吗?)待定
  • 常见的情况是我们一次只关心一个标志,并且可能足以涵盖这种情况,而不是一般的“捕获标志 A、B 和 C”情况
  • 对于进位,一条总是消耗进位并始终产生进位的指令就足够了; 消耗但不产生或反之亦然的变体是不必要的,并且没有它们可能不会影响好的编译器的输出
  • 我们希望利用来自现有优秀 MP 库(例如 Gnu MP)的数据来激励这项工作; 这可能是事实(库 X 有/没有汇编器子例程或使用内部函数来使用标志;它使用指令 A 和 B)或性能数据(库 Y 可以使用汇编器子例程或在 C 中模拟;性能差异为 N% )或用例(一般的 bignum 算术,加密,任何其他想到的)
  • 我们可能希望等待提出具体的指令,直到我们开始讨论一般的多值生成指令,例如多值返回

在这个问题上是否有任何进展? 有效地实施现代密码学(例如 SIDH)需要进位和借位。 没有 ADDC 的大数加法比使用 ADDC 慢多个因素。 这同样适用于减法和乘法。

我认为我们至少在等待多值完成,以便我们可以轻松地表达具有多个结果的操作。 多值“几乎存在”。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

cretz picture cretz  ·  5评论

nikhedonia picture nikhedonia  ·  7评论

spidoche picture spidoche  ·  4评论

JimmyVV picture JimmyVV  ·  4评论

mfateev picture mfateev  ·  5评论