Page 436 - 《软件学报》2025年第10期
P. 436

龚子睿 等: FBS-uBlock: 灵活的  uBlock  算法比特切片优化方法                                      4833


                    uBlock  算法的线性变换    B  中主要的运算是     32  比特循环移位, X 0 和  X 1 在进行循环移位时会被分成数段         32  比
                 特数据, 每段独立执行循环移位. 因此, 在线性变换             B  中可以从两个角度减少占用的寄存器数量, 一个角度是针对
                 32  比特循环移位模块的内部, 在表示         32  比特的数据时减少寄存器的占用; 另一个角度是针对并行的多个                   32  比特
                 循环移位模块之间, 通过按行并置多个模块来减少寄存器占用. 因为“针对模块内”增加了循环移位指令的代价, 而
                 “针对模块间”没有额外代价, 故在减少寄存器占用数量时首先采用“针对模块间”的方式.
                    针对循环移位模块内, 如果将          32  比特数据写成列向量的形式, 异或运算变成模             2  加法, 循环移位转变成矩阵
                 乘法  M ROL ×x 的形式, 那么  x′ = x  ⊕(y<<<4) 可以表示成公式  (1) 的形式. 通过观察公式    (1) 中矩阵  M RO 的值可以
                                                                                                L
                 发现, 矩阵  M RO 恰好是每一行循环右移        4  位的单位矩阵.
                             L

                                                     ′                       
                                                    x      x 0   00010000...   y 0 
                                                     0                      
                                                                             
                                                                             
                                                                             
                                                    x ′                      
                                                   
                                                                
                                                            x 1   00001000...   y 1 
                                                                              
                                                     1                      
                                                                             
                                                                             
                                                                             
                                                    x ′                      
                                                   
                                                                
                                                     2    x 2   00000100...   y 2 
                                                           
                                                                              
                                                                             
                                                                             
                                                                  .          
                                                    .     .      .       .  
                                                   
                                                           
                                                                
                                                                              
                                      ′
                                     x = x⊕ M ROL ×y ⇔  .     .  +   .    .                  (1)
                                                   
                                                    .  =  .  
                                                                              ×  . 
                                                                              
                                                                
                                                                             
                                                                             
                                                                             
                                                                             
                                                    x ′                      
                                                   
                                                                
                                                           
                                                                              
                                                          x 29   01000000...   y 29 
                                                     29                      
                                                                             
                                                                             
                                                                             
                                                    x ′                      
                                                   
                                                                
                                                                              
                                                          x 30   00100000...   y 30 
                                                           
                                                     30                      
                                                                             
                                                                             
                                                                             
                                                     x ′    x 31   00010000...   y 31
                                                      31
                    进一步观察可以发现, 矩阵         M RO 是一个循环矩阵, 如果把       M RO 写成  2×2、4×4、8×8  或  16×16  的分块矩阵
                                             L
                                                                      L
                 后, 分块矩阵也是循环矩阵. 因此, 如果将数据写成一个二维的矩阵, 将循环移位运算对应的矩阵                            M RO 写成分块
                                                                                                L
                 矩阵的形式, 那么公式       (1) 将转变成公式    (2)–(4) 的形式. 为了简化表达式, 在公式       (2)–(4) 中使用符号  x i– 代表由
                                                                                                  j
                 x i , x i+1 , ..., x j 组成的列向量.

                                 [     ]  [     ] [      ] [     ]
                                  x ′ 0−15  x 0−15  A  B     y 0−15  [  ′   ′   ]
                                  x ′   =  x 16−31  +  B  A  ×  y 16−31  ⇔  x 0−15  x 16−31
                                   16−31
                                         [           ]     [          ]      [          ]
                                        =  x 0−15  x 16−31  +[A]× y 0−15  y 16−31  +[B]× y 16−31  y 0−15  (2)

                              ′                              
                             x       x 0−7   A  B  C  D   y 0−7 
                              0−7                           
                                                             
                             x ′      x 8−15   D  A  B         [                  ]
                                     
                                            
                            
                                            
                              8−15                    C   y 8−15   ′    ′    ′    ′
                                                            
                                                               ⇔  x  x   x     x
                                  =      +             × 
                             x ′      x 16−23   C  D  A        0−7  8−15  16−23  24−31
                            
                                     
                                            
                                            
                                                      B   y 16−23 
                                                            
                              16−23                          
                                                             
                              x ′      x 24−31  B  C  D  A     y 24−31
                              24−31
                                     [                    ]      [                    ]
                                   =  x 0−7  x 8−15  x 16−23  x 24−31  +[A]× y 0−7  y 8−15  y 16−23  y 24−31
                                           [                    ]     [                    ]
                                     +[B]× y 8−15  y 16−23  y 24−31  y 0−7  +[C]× y 16−23  y 24−31  y 0−7  y 8−15
                                           [                    ]
                                                                                                      (3)
                                     +[D]× y 24−31  y 0−7  y 8−15  y 16−23

                               ′                              
                              x      x 0−3   A  B  ...  H   y 0−3 
                               0−3                           
                                                              
                              x ′      x 4−7   H  A  ...      
                             
                                             
                                     
                                             
                                                             
                               4−7                     G   y 4−7   [                 ]
                                                              
                                                                  ′    ′       ′
                                                            
                                             + 
                               .   =   .    .  .     . ×   .   ⇔  x   x   ...  x
                                                   .                 0−3  4−7     28−31
                                             
                               .      .    .  .   .        .  
                                           .      .  .        
                               .      .         .      .     .  
                                                              
                                                              
                                                              
                              x ′ 28−31  x 28−31  B  C  ...  A  y 28−31
                                     [                  ]      [                 ]
                                    =  x 0−3  x 4−7  ...  x 28−31  +[A]× y 0−3  y 4−7  ...  y 28−31
                                            [                 ]         [                   ]
                                                 ...                                ...
                                                                                                      (4)
                                      +[B]× y 4−7    y 28−31  y 0−3  +...+[H]× y 28−31  y 0−3  y 24−27
                    观察公式    (2)–(4) 等号右侧数据   y 的表示, 可以发现公式对数据进行了循环的变换, 按照列的单位进行了循环
                 左移. 可以验证, 对于    32  比特数的循环    4、8、20  移位运算, 都可以有类似的表示方式. 上述理论分析表明, 可以通
                 过引入一些循环移位运算来降低列向量的行数. 在比特切片的表示中, 数据每一行代表一个寄存器, 行数的降低意
                 味着寄存器占用数量的减少, 从而能够达到减少访存开销的目的.
                    对于线性变换      B  的运算  x′ = x  ⊕(y<<<s), s∈{0, 4, 8, 20}, 将数据  x 和  y 都表示成  k×(32/k) 的矩阵  M x 和  M y , 用
                 符号  Reg (x)  表示  x 的比特切片表示下的第    i 个寄存器, 所有表示形式的计算方式可通过公式               (5) 概括. 数据  x 第  i
                        i
   431   432   433   434   435   436   437   438   439   440   441