Page 340 - 《软件学报》2026年第7期
P. 340
胡晓雯 等: 基于 CUDA Core 和 Tensor Core 的 CTRU-Prime 高吞吐量实现 3025
Z q [x] 中的多项式. 此外, 在 CTRU-Prime 中, 多项式加法是紧跟多项式采样后的操作, 因此, 本文将多项式加法融
合到多项式采样核函数中. 具体来说, 设置两个控制变量分别控制是否进行二倍乘操作和加一操作, 某多项式系数
的采样完成后, 在判断其是否为多项式第 0 位的基础上, 控制是否完成额外的多项式加法操作.
4.3 融合内核
内核融合 (kernel fusion) [33] 是提升多线程 GPU 计算效率的一种高效方法. 该方法能够显著减少以特别耗时的
全局内存访问为首的数据读写请求, 将大多数内存指令集中在指令延迟相对较低的寄存器和共享内存的读写上.
文献 [34] 提出的内核融合方法通过融合两个或多个独立的内核, 实现更高的利用率和对硬件资源更加均衡的需
求, 为电源优化提供了更多潜力. 我们将内核融合技术应用到 CTRU-Prime 的 GPU 加速设计过程中.
将 CTRU-Prime 的每个操作转化为一个核函数是直接且自然的, 但这种方法忽略了操作之间可能存在的数据
依赖性, 从而引入了大量的内核启动和数据传输开销. 例如, 在 CTRU-Prime.PKE.Enc 中, 需要接连完成多项式系
数约减 (poly_subq)、多项式编码压缩 (poly_encode_compress) 和密文压缩 (pack_ct) 这 3 个操作. 由于这 3 个操作
之间存在数据依赖关系, 即多项式编码压缩以多项式系数约减的输出为输入、密文压缩以多项式编码压缩的输出
为输入, 将中间传递值从全局内存转移到共享内存或者寄存器能够有效减少访问延迟. 此外, 这 3 个核函数合并
为 1 个也有效减少了内核启动带来的开销.
同一般核函数设计相似, 内核融合的设计首先需要考虑各个独立核函数内部的数据依赖图 (data dependency
graph, DDG), 即结果值的生成对哪些值存在依赖关系, 这直接影响数据划分的方法. 减少对于全局内存的访问意
味着数据的可交换性最大集中在线程块上, 这要求在函数执行过程中, 具有依赖关系的数据必须被划分到一个数
据块上. 此外, 如上所述, 内核融合引入了两个独立函数之间的数据依赖关系, 这需要对齐多个函数的数据划分方
法. 进一步地, 由于 SM 上限制了最大共享内存数量和最大线程数, 需要合理地设计线程组织形式以及内存分配策
略以达到理想的占用率.
图 5 中展示了 3 个操作 (poly_subq、poly_encode_compress 和 pack_ct) 中的数据以及数据依赖关系. 其中,
poly_subq 以 sigma 为输入和输出; poly_encode_compress 以 msg 和 sigma 为输入、以 c 为输出; pack_ct 以 ct 为输
入和输出. 我们将 c 和 mh 转移到寄存器中, 从位于全局内存中的 msg 和 sigma 中读取对应输入分块, 完成运算后
向全局内存 ct 中写入输出分块, 将 6 次对于全局内存的读写转化为 2 次全局内存的读写和对于寄存器的操作. 鉴
于全局内存读取延迟比寄存器大 100 倍左右, 上述方法能够有效减少数据访问的延迟.
msg sigma 全局内存
mh
寄存器空间
c ……
情况 1 情况 2
ct ct 全局内存
数据单元 数据依赖关系 线程 T 1 需存取的数据 线程 T 2 需存取的数据 函数 poly_encode_compress 函数 poly_subq 函数 pack_ct
图 5 核函数融合
4.4 结合批量模式和单一模式
Gupta 等人 [15] 提出了 GPU 设计的两种模式: 批量模式 (batch mode) 和简单模式 (single mode). 本文的实现结
合上述两种模式. 有些算法具有显著的固有并行性, 需要执行大量独立操作, 例如大型矩阵乘法、图像处理等, 大
规模并行算法可以直接在 GPU 上实现, 并获得巨大的性能提升. 有些算法具有顺序性或半顺序性, 即算法的多个
甚至全部步骤之间形成链式关系, 加快顺序算法速度的一种方法是执行多个并行实例, 而不是单个实例, 此类实现
通常以批量方式处理数据, 在某些服务器应用程序中非常有用.

