Page 336 - 《软件学报》2026年第7期
P. 336

胡晓雯 等: 基于   CUDA Core 和  Tensor Core 的  CTRU-Prime 高吞吐量实现                       3021


                                               ∑
                                                 n−1
                                                      i
                                            h =    h i x , 则:
                    设二者在素阶数域上的乘积为
                                                 i=0
                                                  
                                                   s 0 + s n ,  i = 0
                                                  
                                                  
                                                  
                                               h i =  s i + s i+n + s i+n−1 , 1 ⩽ i ⩽ n−2            (2)
                                                  
                                                  
                                                    s n−1 + s 2n−2 ,  i = n−1
                    展开后得到一般公式为:

                                            ∑  n−1
                                        f 0 g 0 +
                                                 f n−k g k ,               i = 0
                                       
                                       
                                               k=1
                                       
                                       
                                       
                                        ∑         ∑           ∑
                                          i         n−1         n−1
                                       
                                    h i =   f i−k g k +  f n+i−k g k +  f n+i−1−k g k ,  1 ⩽ i ⩽ n−2  (3)
                                       
                                          k=0       k=i+1       k=i
                                       
                                       
                                       
                                        ∑
                                          n−1
                                       
                                       
                                            f n−1−k g k + f n−1 g n−1 ,    i = n−1
                                           k=0
                    进一步地, 用矩阵乘法来表示         h 的系数为:

                                                                                
                                  f 0  f n−1  f n−2  ...  f 1   0  0  0  ...
                                                                      0  g 0    h 0 
                                                                                
                                                                                
                                            ...  f 2   0        ...             
                                                     
                                                                           
                                    f 0  f n−1         f n−1  f n−2  f 1  g 1     h 1  
                                f 1                                               
                                                                                
                                                                                
                                                                                
                                            ...  f 3   0  0     ...           h 2  
                                                     
                                f 2  f 1  f 0                 f n−1   f 2  g 2                 (4)
                                                   +                        =   
                                                                                
                                 .   .   .       .   .  .   .       .    .      .  
                                                     
                                            .                     .               
                                                     
                                 .   .   .   .   .   .  .   .   .   .    .      .  
                                              .                    .              
                                 .   .   .       .   .  .   .       .    .      .  
                                                                                
                                                                                
                                                                                
                                 f n−1  f n−2  f n−3  ...  f 0  0  0  0  ...  f n−1  g n−1  h n−1

                                 f 2  f 1  f 0
                                 g 2  g 1  g 0
                                f 2  g 0  f 1  g 0 f 0  g 0  f 2  g 0  f 1  g 0  f 0  g 0
                                            =                                       0  0  0
                            f 2  g 1 f 1  g 1  f 0  g 1  f 1  g 1  f 0  g 1 +f 2  g 1  f 2  g 1  f 0  f 2  f 1  g 0
                        f 2  g 2  f 1  g 2 f 0  g 2
                                              f 0  g 2 +f 2  g 2  f 2  g 2 +f 1  g 2  f 1  g 2  0  ×
                                                                        f 1  f 0  f 2  f 2  f 1  g 1
                                                                                    0  0
                                                                        f 2  f 1  f 0     f 2   g 2
                                                h 2     h 1    h 0
                         s 4  s 3  s 2  s 1  s 0
                                                                                                v
                                                       M 1                M 2         M 3
                                             图 2 素阶数域上多项式乘法的矩阵转化

                  3.2.2    基于  Tensor Core 的实现方法与细节
                    在  GPU  的  C++编程中, 和传统的    CUDA Core 相比, Tensor Core 能进一步加速   MMA  运算, 即  D = A×B+C,
                 其中   A 为  m×n 的矩阵, B  为  n×k 的矩阵,  C  和  D 为  m×k 的矩阵. Tensor Core 使用  wmma::fragment 类来定义不同的
                 矩阵类型, 其中    A 为矩阵乘法的左矩阵,       B 为矩阵乘法的右矩阵,       C  和  D 为  MMA  操作中的累加器. Tensor Core 支
                 持多种混合精度的元素类型和矩阵大小, 即以低精度为输入, 高精度为输出, 表                       3  给出了部分能够同时支持       3  种矩
                 阵大小   (16×16×16、32×8×16、8×32×16) 的左矩阵、右矩阵、累加器的组合精度示例.

                                            表 3 Tensor Core 支持的部分组合精度      [29]

                                   左矩阵                      右矩阵                   累加器
                                    _half                   _half                  float
                                    _half                   _half                  _half
                                 unsigned char            unsigned char             int
                                  signed char             signed char               int

                    Tensor Core 所支持的混合精度操作在        CUDA  中提供了相应的编程接口         wmma. 概括来说, 包括     1  个数据类
                 型  (wmma::fragment) 和  3  个操作  (wmma::load_matrix_sync、wmma::store_matrix_sync 和  wmma::mma_sync), 它
                 们都需要一个线程束协同完成. 例如, 当           m=16、n=16、k=16  时, 定义在核函数中的      wmma::fragment 对象, 运行时
                 会以  8  个  8  位整型的寄存器出现在每一个线程的运行空间中. wmma::load_matrix_sync 操作实现从连续内存区中
                 加载值到矩阵. wmma::store_matrix_sync 操作实现方向相反的操作, 即将矩阵中的值存储到连续的内存区域中. 上
   331   332   333   334   335   336   337   338   339   340   341