本文档介绍了同态处理单元(HPU)上的整数运算(IOp)的高级代码语法,HPU通过使用整数的基数表示来处理整数上的任何运算。IOp代码定义了整数操作签名,该签名用作链接到数字操作(DOp)代码的标识符。文章详细描述了IOp代码的结构、关键字、预定义IOp以及自定义IOp的示例。
当前版本为 HIS v2.0 (HPU 指令语法)。
同态处理单元 (HPU) 使用整数的基数表示形式对整数执行任何运算。为此,用户只需向 HPU 提供一个程序即可。
HPU 编程有两个层级。
本文档描述了高级代码语法。目标元素是整数。这些运算称为整数运算 (IOp)。
整数是可以由位表示的任何类型。假设 n 为位数。
整数被分解为基数 B,它是 2 的幂:B = 2^b。这被称为基数表示。此分解的每个元素都称为数字。
因此,一个 n 位的整数由 (n+1)//b 个数字组成。每个数字实际上是一个基本密文(在 TFHE-rs 文档中也称为 blocks),每个密文编码 b 位。
[!NOTE] 如果 n 不是 b 的倍数,则 HPU 实际上对一个更大的整数进行计算,该整数的位数是 b 的倍数。
目前,基数为 B = 4,因此一个数字是一个 2 位的值 (b=2)。
只要整数的表示形式和中间结果可以存储在 HPU 的本地内存中,HPU 就能处理任何大小的整数。
IOp 代码定义了整数运算签名。这使其成为用作链接到数字运算 (DOp) 代码的标识符。实际上,有效的计算是在数字密文级别上完成的。
一个 IOp 代码由位置部分定义:
通用 IOp 语法:
NAME <Features> <DST list> <SRC list> [<Imm list>]
符号 | 定义 |
---|---|
< > | 尖括号用于分隔每个部分,除了名称。 |
In | 定义一个 n 位的整数。<br>b 的倍数的任何 n 值都支持。 |
@ | 位于内存中的偏移量之前,以密文单元定义。<br>支持十六进制值。 |
dyn | 指示 DOp 是在运行时生成/修改的。 |
一个 8 位的值用作 IOp 标识符。
使用以下编码:
范围 | 类别 | 注释 |
---|---|---|
0x00 .. 0x7f | 用户自定义运算 | 用户可以使用这些标识符创建新的 IOp。<br>用户还将提供相关的 DOp 代码。 |
0x80 .. 0xff | 生成的运算 | 相关的 DOp 代码由 TFHE-rs hpu 后端模块 fw 生成。<br>某些值已用于预定义的基该运算。<br>其他值可用于定义新的 IOp。在这种情况下,相关的 DOp 代码必须在后端代码中定义。 |
预定义的 IOp 具有保留值和别名。
用户自定义 IOp 名称具有以下语法:
IOP[val]
其中 val 是一个空闲的 8 位值,符合上述编码。
HPU 能够处理任何大小的整数。它甚至能够混合源和目标的不同大小。 但是,从内存存储的角度来看,HPU 需要知道用于对齐整数密文的单位。这在特性部分中使用 In 关键字给出。
第一个元素定义目标整数的对齐方式,第二个元素定义源的对齐方式。
在以下示例中:
<I8 I16>
[!NOTE] 对齐方式必须考虑此运算处理的最大的整数。即,对齐方式应等于或大于此类别源或目标的最大处理整数。
HIS v2.0 语法定义了拥有 动态 运行时生成代码的可能性。如果 IOp 被限定为动态,则意味着 HPU 微处理器可以在收到指示后,使用当前执行环境信息来修改 DOp 代码。
示例:
<dyn I8 I16>
[!NOTE] 该特性尚未完全支持。
目标和源部分遵循相同的语法。
在目标部分中,定义了一个或多个目标整数。源部分也是如此。
一个整数的特征是:
示例:
<I2@0x4 I8@0x10>
[!NOTE] 通常,在部分内(源或目标),偏移量不重叠。如果它们重叠,则是故意的。这意味着整数的一部分与另一个整数具有相同的块。
[!NOTE] 偏移量可能在不同部分中的整数之间重叠。实际上,源和目标的生命周期不同。因此,目标可能会覆盖源的位置。这是“就地”运算的情况。
用户还可以利用 Vector 表示法来表达内存中的一组连续元素。 向量的特征是:
示例:
<I8[4]@0x0>
[!NOTE] 此向量描述了一个包含 4 个密文的列表,等效于
<I8@0x0 I8@0x8 I8@0x10 I8@0x18>
[!NOTE] 向量对齐基于 Feature 部分中表达的全局对齐(即示例中的 I16),而不是基于操作数大小(即示例中的 I8)。
最后一部分包含立即数。此部分是可选的。 与源和目标一样,它们可以是任意数量和任意大小。
在以下示例中,2 个立即数:0 和 0xAACOFFEE。
<0x0 0xAACOFFEE>
[!NOTE] 立即数大小是根据其非零数字计算的。
一组预定义的 IOp 可用。 它们对应于基本运算。
为了方便使用,别名用于它们的命名。
[!NOTE] 在特性部分中,此处设置的整数大小应该是使用的最小值。
别名 | IOp | 语法 | 描述 |
---|---|---|---|
ADDS | 0xA0 | ADDS <Dn Sn> <Dn> <Sn> <Imm> | 将一个常量加到 n 位源。<br>结果对 2^n 取模。<br>仅考虑立即数的 n 位。 |
SUBS | 0xA1 | SUBS <Dn Sn> <Dn> <Sn> <Imm> | 从 n 位源中减去一个常量。<br>结果对 2^n 取模。<br>仅考虑立即数的 n 位。 |
SSUB | 0xA2 | SSUB <Dn Sn> <Dn> <Sn> <Imm> | 从一个常量中减去 n 位源。<br>结果对 2^n 取模。<br>仅考虑立即数的 n 位。 |
MULS | 0xA3 | MULS <Dn Sn> <Dn> <Sn> <Imm> | 将 n 位源与一个常量相乘。结果对 2^n 取模。 |
ADD | 0xE0 | ADD <Dn Sn> <Dn> <Sn Sn> | 将 2 个 n 位源相加。<br>结果对 2^n 取模。 |
SUB | 0xE2 | SUB <Dn Sn> <Dn> <Sn Sn> | 将 2 个 n 位源相减。<br>结果对 2^n 取模。 |
MUL | 0xE4 | MUL <Dn Sn> <Dn> <Sn> | 将 2 个 n 位源相乘。<br>结果对 2^n 取模。 |
BW_AND | 0xD0 | BW_AND <Dn Sn> <Dn> <Sn Sn> | 对 2 个 n 位源进行按位与运算。 |
BW_OR | 0xD1 | BW_OR <Dn Sn> <Dn> <Sn Sn> | 对 2 个 n 位源进行按位或运算。 |
BW_XOR | 0xD2 | BW_XOR <Dn Sn> <Dn> <Sn Sn> | 对 2 个 n 位源进行按位异或运算。 |
CMP_GT | 0xC0 | CMP_GT <Db Sn> <Db> <Sn Sn> | 比较 2 个 n 位源。<br>输出一个以 b 位编码的布尔值,如果 source1 大于 source2,则值为 (1),否则为 (0) |
CMP_GTE | 0xC1 | CMP_GTE <Db Sn> <Db> <Sn Sn> | 比较 2 个 n 位源。<br>输出一个以 b 位编码的布尔值,如果 source1 大于等于 source2,则值为 (1),否则为 (0) |
CMP_LT | 0xC2 | CMP_LT <Db Sn> <Db> <Sn Sn> | 比较 2 个 n 位源。<br>输出一个以 b 位编码的布尔值,如果 source1 小于 source2,则值为 (1),否则为 (0) |
CMP_LTE | 0xC3 | CMP_LTE <Db Sn> <Db> <Sn Sn> | 比较 2 个 n 位源。<br>输出一个以 b 位编码的布尔值,如果 source1 小于等于 source2,则值为 (1),否则为 (0) |
CMP_EQ | 0xC4 | CMP_EQ <Db Sn> <Db> <Sn Sn> | 比较 2 个 n 位源。<br>输出一个以 b 位编码的布尔值,如果 source1 等于 source2,则值为 (1),否则为 (0) |
CMP_NEQ | 0xC5 | CMP_NEQ <Db Sn> <Db> <Sn Sn> | 比较 2 个 n 位源。<br>输出一个以 b 位编码的布尔值,如果 source1 不等于 source2,则值为 (1),否则为 (0) |
IF_THEN_ZERO | 0xCA | IF_THEN_ZERO <Dn Sn> <Dn> <Sb Sn> | 根据布尔源 1 的值,如果 (1) 选择源 2,否则选择值 0。 |
IF_THEN_ELSE | 0xCB | IF_THEN_ELSE <Dn Sn> <Dn> <Sb Sn Sn> | 根据布尔源 1 的值,如果 (1) 选择源 2,否则选择源 3。 |
ERC_20 | 0x80 | ERC_20 <Dn Sn> <Dn> <Sn Sn> <Imm> | ERC20 交易。 |
Reserved | 0xFE | 保留 | |
MEMCPY | 0xFF | MEMCPY <Dn Sn> <Dn> <Sn> | 将密文从 HPU 内存的一个槽复制到另一个槽 |
这是一个使用预定义的 IOp 的 IOp 代码示例。计算如下:
A 和 B 两个 16 位整数
if (A > B) D = A-B
else D = B-A
return D
## 使用 @0x00 存储中间结果:选择
CMP_GT <I16 I16> <I2@0x00> <I16@0x8 I16@0x10>
## 需要 @0x18 和 @0x20 来存储中间结果
SUB <I16 I16> <I2@0x18> <I16@0x8 I16@0x10>
SUB <I16 I16> <I2@0x20> <I16@0x10 I16@0x8>
IF_THEN_ELSE <I16 I16> <I16@0x00> <I2@0x00 I16@0x18 I16@0x20>
带溢出的 32 位加法。此运算需要:
IOP[0x00] <I32 I32> <I32@0x10 I2@0x0> <I32@0x20 I32@0x30>
4 位整数和 32 位整数之间的乘法。结果对 2^34 取模,带有一个溢出布尔值。
IOP[0x01] <I34 I32> <I34@0x11 I2@0x0> <I32@0x20 I32@0x30>
从 4 个元素的列表中选择。
IOP[0x02] <I32 I32> <I32@0x0> <I2@0x10 I32@0x20 I32@0x30 I32@0x40 I32@0x50>
- 原文链接: github.com/zama-ai/hpu_f...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!