理解 Lasso (四):更多的可分解表格
- 作者: Yu Guo@Secbit(郭宇): Founder of Secbit, https://github.com/sec-bit
Jolt 论文给出了更多的可分解表格,用于表达 RISC-V 指令的计算过程。
更多的表格拆分案例
我们首先看一个简单的可分解表格 ,这个表格用来判断 ,如果 A 和 B 相等,那么这个计算返回 ,否则返回 。下面是一个 2-bit 表格示例:
\small \begin{array}{c|c|c} A & B & A\overset{?}{=} B \ \hline 00 & 00 & 1\ 00 & 01 & 0\ 00 & 10 & 0\ 00 & 11 & 0\ 01 & 00 & 0\ 01 & 01 & 1\ 01 & 10 & 0\ 01 & 11 & 0\ 10 & 00 & 0\ 10 & 01 & 0\ 10 & 10 & 1\ 10 & 11 & 0\ 11 & 00 & 0\ 11 & 01 & 0\ 11 & 10 & 0\ 11 & 11 & 1\ \end{array}
然后我们分析一个 W-bit 长的表格如何分解。对于判等表格来说,我们可以把 位的表格拆分成 个 -bit 子表格,这些子表格完全相等,因为高位低位运算互不干扰。我们先看子表格的定义:
这个定义是说,如果 和 相等,那么 ,否则为 。那么 表格的定义就是把 位的表格拆分成 个 位的子表格,然后把这些子表格的结果相乘:
这里,
LTU 表格
接下来我们看一个稍微复杂点的表格,用来计算 X \overset{?}{<} Y,表格的索引值为 ,如果关系成立,那么表格项为 ,否则表格项为 。
比较两个整数的一般算法是并行扫描两个整数 , 的每一个二进制位。从最高位开始,当遇到第一个不同的位时,停下来比较,并输出结果。
我们引入一个辅助的表格 ,它表示 与 第一个不同的 bit 位于第 个位置(按照从低位到高位的顺序)
例如,,因为 ,并且 。而 ,因为 ,所以 。下面是所有 的计算过程:
\begin{array}{c|cccc} i= & 3 & 2 & 1 & 0\ \hline x_i & 1 & 1 & {\color{red}0} & 1\ y_i & 1 & 1 & {\color{red}1} & 0\ \hline EQ(x_{>i},x_{>i}) & 1 & 1 & 1 & 0\ (1-x_i)y_i & 0 & 0 & {\color{red}1} & 0 \ \hline \mathsf{LTU}_i & 0 & 0 & {\color{blue}1} & 0 \ \end{array}
利用多个辅助表格的求和,我们可以定义出 表格:
对上面的例子,我们可以计算 LTU 表格中位于 这个位置的项,
假如 ,那么 的尺寸将是 ,理论上我们无法存储这么大的表格。我们需要把大表格拆分成若干小表格关于一个多项式 的运算。
接下来,我们分析如何拆分这个表格。假设我们把 宽的 bits 拆分为 段,每一段为 。操作数 和 按 段拆分后,表示如下:
一个初步的想法是将这 组操作数分别输入到 个 表格中,然后把这些表格的结果相加。但是这样的计算结果并不是我们想要的,因为这样的计算结果会有多个 ,而我们只需要其中一组出现 ,其余为零,这样我们最后求和的结果才是 。因此,我们可以考虑从高位开始,当某一段的 计算输出 时,我们要求从高位开始的比较过的 段都应该相等,否则就输出 。
如果要采用 Lasso 框架来证明关于 表格的 Lookup,我们需要定义下给出参数化的多项式 :
\mathcal{G}\Big( \mathsf{LTU}^{(W/c)}[X_0\parallel Y_0], \mathsf{EQ}^{(W/c)}[X_0\parallel Y_0], \mathsf{LTU}^{(W/c)}[X_1\parallel Y_1], \mathsf{EQ}^{(W/c)}[X_1\parallel Y_1], \ldots, \mathsf{LTU}^{(W/c)}[X_{c-1}\parallel Y_{c-1}], \mathsf{EQ}^{(W/c)}[X_{c-1}\parallel Y_{c-1}] \Big)
总共有 段,每一段需要两个表格, 和
SLL 表格
下面是一个不容易切分 bits 的表格,那就是移位运算,比如向左移位(Shift Left Logical, SLL),0011 << 02 = 1100
。移位运算会给表格的切分带来些麻烦,因为移位运算会将低位分段的部分 bits 移动到高位分段。
我们先考虑单个表格的 SLL 运算。下面的 表示把长度为 的位向量 向左移 位的运算:
这个定义比较容易理解,对于 个 bits,我们只需要把低 位中的每一个 X_i, i\in[0,k),乘上 ,然后对这个 个数进行求和。然后高位的 位会溢出,因此被直接抛弃。这个表格比较容易定义是,因为我们将移位的位数作为一个常数。
接下来,我们考虑左移的位数是一个变量 。这时候,我们可以利用一个选择子,来根据 值来选择不同的 。
其中 ,因为 的取值范围是 [0, W-1](在 RISC-V 的规范中,移位操作的位移为 )。
例如我们要计算 ,
\begin{array}{|c|c|c|} & \mathsf{EQ}^{(4)}(k, \vec{Y}) & \mathsf{SLL}_k(\vec{X})\ \hline k=0 & \mathsf{EQ}^{(4)}(00, 10) = 0 & \mathsf{SLL}_0(1101) = 1101 \ k=1 & \mathsf{EQ}^{(4)}(01, 10) = 0 & \mathsf{SLL}_1(1101) = 1010 \ k=2 & \mathsf{EQ}^{(4)}(10, 10) = {\color{red}1} & \mathsf{SLL}_2(1101) = {\color{red}0100} \ k=3 & \mathsf{EQ}^{(4)}(11, 10) = 0 & \mathsf{SLL}_3(1101) = 1010 \ \end{array}
等式可以展开为:
\begin{split} \mathsf{SLL}^{(4)}(1101, 10) & = \mathsf{EQ}^{(4)}(00, 10)\cdot \mathsf{SLL}_0(1101) \ & + \mathsf{EQ}^{(4)}(01, 10)\cdot \mathsf{SLL}_1(1101) \ & + \mathsf{EQ}^{(4)}(10, 10)\cdot \mathsf{SLL}_2(1101) \ & + \mathsf{EQ}^{(4)}(11, 10)\cdot \mathsf{SLL}_3(1101) \ & = \mathsf{EQ}^{(4)}(10, 10)\cdot \mathsf{SLL}_2(1101) \ & = 1\cdot 0100 \ & = 0100 \end{split}
如果 ,我们需要把表格拆分为 个 -bit 子表格。我们用一个例子()来说明,0101 1100 1001 1010 << 0110
,这个移位操作是向左移 6 位,假如我们需要将这个表格拆分为 个子表格,每个子表格计算的位数为 。 这样,每个子表格 长度为 ,每个表格项的位长为 。那么这个移位操作相当于是 个移位运算结果的求和:例如我们给出这个子表格的表项示例:
\begin{array}{|c|c|c|} \vec{x} & \vec{y} & \mathsf{SLL}^{(4)}(\vec{x}, \vec{y}) \ \hline 0000 & 0000 & 0000\ 0000\ 0000\ 0000\ \vdots & \vdots & \vdots\ 0001 & 0001 & 0000\ 0000\ 0000\ 0010\ \vdots & \vdots & \vdots\ 0001 & 0101 & 0000\ 0000\ 0010\ 0000\ \vdots & \vdots & \vdots\ 1001 & 0011 & 0000\ 0000\ 0100\ 1000\ \end{array}
的计算过程看下表:
\begin{array}{llrr|rr} 0101 << 6 &= & {\color{red}01} & {\color{red}0100} & 0000 & &\ 1100 << 6 &= & & {\color{red}11} &0000 &0000 \ 1001 << 6 &= && & 10 &0100 &0000 & & \ 1010 << 6 &= &&&&10 & 1000 &0000\ \mathsf{SLL}^{(16)}(\vec{x}, 0110) & = & {\color{red}01} & {\color{red}0111} & 0010 & 0110 & 1000 & 0000 \ \end{array}
这里红色标记的部分为溢出 部分。根据 SLL 的语义,我们要抛弃这部分的 bits。剩下的部分,我们把它们错位(乘上 2 的次幂 )相加。由于不同的分段溢出的 bits 数量不等,我们需要先给出一个定义, 来标记每一个分段中溢出的 bits 数量:
m_{i, k} = \mathsf{min}\Big(W/c, \mathsf{max}\big(0, k+(W/c)\cdot (i+1) - W\big)\Big), \qquad \forall i\in[0, c), k\in[0, \log{W})
这里 为移位的位数, 为分段的索引。然后 子表格的定义如下:
最后我们给出 的分解定义:
应用 Lasso 框架来实现移位运算,参数化的多项式 可以依据上面的等式来定义。