整数运算(IOp)

  • zama-ai
  • 发布于 2025-05-10 20:12
  • 阅读 18

本文档介绍了同态处理单元(HPU)上的整数运算(IOp)的高级代码语法,HPU通过使用整数的基数表示来处理整数上的任何运算。IOp代码定义了整数操作签名,该签名用作链接到数字操作(DOp)代码的标识符。文章详细描述了IOp代码的结构、关键字、预定义IOp以及自定义IOp的示例。

整数运算 (IOp)

当前版本为 HIS v2.0 (HPU 指令语法)。

同态处理单元 (HPU) 使用整数的基数表示形式对整数执行任何运算。为此,用户只需向 HPU 提供一个程序即可。

HPU 编程有两个层级。

  • 高级处理整数
  • 第二个是低级。此代码相当于传统 CPU 的汇编代码,但是处理的是编码数字的基本密文。

本文档描述了高级代码语法。目标元素是整数。这些运算称为整数运算 (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 关键字给出。

第一个元素定义目标整数的对齐方式,第二个元素定义源的对齐方式。

在以下示例中:

  • 目标在 8 位整数密文上对齐
  • 源在 16 位整数密文上对齐。
    &lt;I8 I16>

[!NOTE] 对齐方式必须考虑此运算处理的最大的整数。即,对齐方式应等于或大于此类别源或目标的最大处理整数。

未来特性:dyn

HIS v2.0 语法定义了拥有 动态 运行时生成代码的可能性。如果 IOp 被限定为动态,则意味着 HPU 微处理器可以在收到指示后,使用当前执行环境信息来修改 DOp 代码。

示例:

&lt;dyn I8 I16>

[!NOTE] 该特性尚未完全支持。

目标 / 源

目标和源部分遵循相同的语法。

在目标部分中,定义了一个或多个目标整数。源部分也是如此。

一个整数的特征是:

  • 其大小(以位为单位)
  • 其在内存中的偏移量(以基本密文单元为单位)。此偏移量应按照特性部分中的描述对齐。

示例:

  • 如果基本密文编码 2 位
  • 如果目标对齐方式为 I8(因此每个目标 4 个块)
  • 2 个目标
    • 第一个具有 2 位,偏移量为 4
    • 第二个具有 8 位,偏移量为 16
      &lt;I2@0x4 I8@0x10>

[!NOTE] 通常,在部分内(源或目标),偏移量不重叠。如果它们重叠,则是故意的。这意味着整数的一部分与另一个整数具有相同的块。

[!NOTE] 偏移量可能在不同部分中的整数之间重叠。实际上,源和目标的生命周期不同。因此,目标可能会覆盖源的位置。这是“就地”运算的情况。

用户还可以利用 Vector 表示法来表达内存中的一组连续元素。 向量的特征是:

  • 其大小(以位为单位)
  • 其在内存中的偏移量(以基本密文单元为单位)。此偏移量应按照特性部分中的描述对齐。
  • 其元素数量

示例:

  • 如果对齐方式为 I16(因此每个操作数 8 个块)
  • 如果向量密文编码 8 位操作数
  • 如果向量由 4 个连续的操作数组成
    &lt;I8[4]@0x0>

    [!NOTE] 此向量描述了一个包含 4 个密文的列表,等效于 &lt;I8@0x0 I8@0x8 I8@0x10 I8@0x18>

[!NOTE] 向量对齐基于 Feature 部分中表达的全局对齐(即示例中的 I16),而不是基于操作数大小(即示例中的 I8)。

立即数

最后一部分包含立即数。此部分是可选的。 与源和目标一样,它们可以是任意数量和任意大小。

在以下示例中,2 个立即数:0 和 0xAACOFFEE。

&lt;0x0 0xAACOFFEE>

[!NOTE] 立即数大小是根据其非零数字计算的。

预定义的 IOp

一组预定义的 IOp 可用。 它们对应于基本运算。

为了方便使用,别名用于它们的命名。

  • Dn: 用于定义大小为 n 的目标整数。
  • Sn: 用于定义大小为 n 的源整数。

[!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
  • A 存储在 @0x8
  • B 存储在 @0x10
  • 结果存储在 0x00
## 使用 @0x00 存储中间结果:选择
CMP_GT &lt;I16 I16> &lt;I2@0x00> &lt;I16@0x8 I16@0x10>
## 需要 @0x18 和 @0x20 来存储中间结果
SUB &lt;I16 I16> &lt;I2@0x18> &lt;I16@0x8 I16@0x10>
SUB &lt;I16 I16> &lt;I2@0x20> &lt;I16@0x10 I16@0x8>
IF_THEN_ELSE &lt;I16 I16> &lt;I16@0x00> &lt;I2@0x00 I16@0x18 I16@0x20>

自定义

带溢出的 32 位加法。此运算需要:

  • 2 个源
  • 2 个目标:第一个包含加法结果,第二个是包含溢出信息的布尔值。
    IOP[0x00] &lt;I32 I32> &lt;I32@0x10 I2@0x0> &lt;I32@0x20 I32@0x30>

4 位整数和 32 位整数之间的乘法。结果对 2^34 取模,带有一个溢出布尔值。

  • 2 个源:4 位和 32 位
  • 2 个目标:第一个包含加法结果,第二个是包含溢出信息的布尔值。
  • 结果部分覆盖源 1 的位置。
    IOP[0x01] &lt;I34 I32> &lt;I34@0x11 I2@0x0> &lt;I32@0x20 I32@0x30>

从 4 个元素的列表中选择。

  • 1 + 4 个源:2 位源和 4 个 32 位源
  • 1 个目标:32 位目标。
    IOP[0x02] &lt;I32 I32> &lt;I32@0x0> &lt;I2@0x10 I32@0x20 I32@0x30 I32@0x40 I32@0x50>
  • 原文链接: github.com/zama-ai/hpu_f...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zama-ai
zama-ai
江湖只有他的大名,没有他的介绍。