理解 Lasso (四):更多的可分解表格

Jolt 论文给出了更多的可分解表格,用于表达 RISC-V 指令的计算过程。

更多的表格拆分案例

我们首先看一个简单的可分解表格 ,这个表格用来判断 ,如果 A 和 B 相等,那么这个计算返回 ,否则返回 。下面是一个 2-bit 表格示例:

然后我们分析一个 W-bit 长的表格如何分解。对于判等表格来说,我们可以把 位的表格拆分成 -bit 子表格,这些子表格完全相等,因为高位低位运算互不干扰。我们先看子表格的定义:

这个定义是说,如果 相等,那么 ,否则为 。那么 表格的定义就是把 位的表格拆分成 位的子表格,然后把这些子表格的结果相乘:

这里,

LTU 表格

接下来我们看一个稍微复杂点的表格,用来计算 ,表格的索引值为 ,如果关系成立,那么表格项为 ,否则表格项为

比较两个整数的一般算法是并行扫描两个整数 , 的每一个二进制位。从最高位开始,当遇到第一个不同的位时,停下来比较,并输出结果。

我们引入一个辅助的表格 ,它表示 第一个不同的 bit 位于第 个位置(按照从低位到高位的顺序)

例如,,因为 ,并且 。而 ,因为 ,所以 。下面是所有 的计算过程:

利用多个辅助表格的求和,我们可以定义出 表格:

对上面的例子,我们可以计算 LTU 表格中位于 这个位置的项,

假如 ,那么 的尺寸将是 ,理论上我们无法存储这么大的表格。我们需要把大表格拆分成若干小表格关于一个多项式 的运算。

接下来,我们分析如何拆分这个表格。假设我们把 宽的 bits 拆分为 段,每一段为 。操作数 段拆分后,表示如下:

一个初步的想法是将这 组操作数分别输入到 表格中,然后把这些表格的结果相加。但是这样的计算结果并不是我们想要的,因为这样的计算结果会有多个 ,而我们只需要其中一组出现 ,其余为零,这样我们最后求和的结果才是 。因此,我们可以考虑从高位开始,当某一段的 计算输出 时,我们要求从高位开始的比较过的 段都应该相等,否则就输出

如果要采用 Lasso 框架来证明关于 表格的 Lookup,我们需要定义下给出参数化的多项式

总共有 段,每一段需要两个表格,

SLL 表格

下面是一个不容易切分 bits 的表格,那就是移位运算,比如向左移位(Shift Left Logical, SLL),0011 << 02 = 1100。移位运算会给表格的切分带来些麻烦,因为移位运算会将低位分段的部分 bits 移动到高位分段。

我们先考虑单个表格的 SLL 运算。下面的 表示把长度为 的位向量 向左移 位的运算:

这个定义比较容易理解,对于 个 bits,我们只需要把低 位中的每一个 ,乘上 ,然后对这个 个数进行求和。然后高位的 位会溢出,因此被直接抛弃。这个表格比较容易定义是,因为我们将移位的位数作为一个常数。

接下来,我们考虑左移的位数是一个变量 。这时候,我们可以利用一个选择子,来根据 值来选择不同的

其中 ,因为 的取值范围是 (在 RISC-V 的规范中,移位操作的位移为 )。

例如我们要计算

等式可以展开为:

如果 ,我们需要把表格拆分为 -bit 子表格。我们用一个例子()来说明,0101 1100 1001 1010 << 0110,这个移位操作是向左移 6 位,假如我们需要将这个表格拆分为 个子表格,每个子表格计算的位数为 。 这样,每个子表格 长度为 ,每个表格项的位长为 。那么这个移位操作相当于是 个移位运算结果的求和:例如我们给出这个子表格的表项示例:

的计算过程看下表:

这里红色标记的部分为溢出 部分。根据 SLL 的语义,我们要抛弃这部分的 bits。剩下的部分,我们把它们错位(乘上 2 的次幂 )相加。由于不同的分段溢出的 bits 数量不等,我们需要先给出一个定义, 来标记每一个分段中溢出的 bits 数量:

这里 为移位的位数, 为分段的索引。然后 子表格的定义如下:

最后我们给出 的分解定义:

应用 Lasso 框架来实现移位运算,参数化的多项式 可以依据上面的等式来定义。