Page 341 - 《软件学报》2026年第7期
P. 341
3026 软件学报 2026 年第 37 卷第 7 期
针对 CTRU-Prime 算法中的各个操作, 本文在提取其并行性的基础上, 基于单一模式设计核函数, 使用多线程
执行单一操作, 从而有效提高执行速度. 此外, 为面向高吞吐量设计, 本文引入批处理大小, 基于批量模式使得单一
核函数在正确数据划分后同时完成多次操作, 从而有效利用多 SM 的多核特点, 进一步提高吞吐量.
4.5 结合多流技术与多线程技术
在 GPU 中, 不同任务的数值计算和数值拷贝、不同方向的数值拷贝能够同步进行. 异步操作在提高 CPU 和
GPU 的整体性能方面起着至关重要的作用, 它允许任务同时执行, 而无需等待前面任务的完成. 这种方法有效地
隐藏了数值拷贝和数值计算的延迟, 从而提高了吞吐量并减少了空闲时间. 在 CUDA 中, 有一个用于所有主机线
程的默认流, 这会带来隐式同步. 例如, 考虑存在多个形如 (数值拷贝, 数值计算, 数值拷贝) 等任务的情况, 基于默
认流的实现方式使得各个任务串行执行, 大大降低了资源的利用率. 而多流技术通过多个 CUDA 流, 使得不同操
作的数值计算和数值拷贝、不同方向的数值拷贝能够同步进行.
本文使用 CPU 作为多流技术的调度器, 这需要 CPU 与 GPU 之间的同步. 为此, 在 CPU 端采用多线程模式,
每一个线程被分配一个唯一的 CUDA 流, 该流执行批处理大小个任务. 该种方法不仅能够让 CPU 和 GPU 同时高
效工作, 还有效减少了数据传输的延迟, 提高了性能和资源利用率.
4.6 内存管理
GPU 的内存结构是分层的, 主要包括寄存器、本地内存、全局内存和共享内存这 4 种内存类型. 全局内存是
层次化结构中的最高级别, 于片外内存中实现, 其大小比任何其他 GPU 内存类型都要大, 但访问延迟时间比共享
内存和寄存器增加近 100 倍. 共享内存在 SM 的 L1 缓存 (片上内存) 中实现, 大小有限, 但是具有比全局内存更高
的带宽和更低的延迟. 本文减少在全局内存中的数据交换操作以进一步提高访存效率, 通过合理分配线程组织结
构和数据分块, 使得待交换数据仅局限在线程内或者线程块内, 从而可以分别使用寄存器和共享内存进行数据交换.
鉴于全局内存访问延迟较高, 本文在各个核函数的设计过程中, 控制线程束内线程访问连续内存地址从而形
成合并内存访问, 以进一步提高访存效率. 具体来说, 由于 L1 缓存的缓存行大小为 128 字节, 因此每个内存访问事
务都会导致读取 128 字节. 考虑线程束内的所有线程都以锁步方式执行, 如果其中一个线程出现延迟, 则所有剩余
线程都必须等待访问完成. 因此, 如果内存访问是跨步的, 则大量获取的数据未被使用, 并且需要多个内存访问事
务, 从而导致性能下降.
对 CUDA 架构而言, 主机端的内存被分为两种: 可分页内存和页锁定内存. 基于操作系统的分页存储机制, 分
页内存会在物理内存和磁盘上交换, 而操作系统不会对页锁定内存进行分页和交换操作, 确保该内存始终驻留在
物理内存中. 使用分页内存进行数据传输时, GPU 驱动会先将数据拷贝到主机中的临时页锁定内存中, 然后再由
临时页锁定内存拷贝到 GPU 内存中, 从而完成数据从主机到设备的拷贝. 使用页锁定内存时, GPU 知道其物理地
址, 通过直接内存访问 (direct memory access, DMA) 技术直接在主机和 GPU 之间复制数据, 和基于分页内存的数
据传输相比, 减少了调度分页内存的开销, 从而提升了速度. 但是页锁定内存的不可交换性使得其消耗更多的内存
空间. 因此, 本文通过使用适量的页锁定内存, 加速了数据传输, 从而提升方案的整体效率.
5 实验分析
5.1 实验设置
CPU 基线测试和 GPU 性能测试都在一台具有 6.5.0 kernel 的 Ubuntu 22.04.4 LTS 上完成, 其 CPU 型号为
Intel(R) Core(TM) i9-14900K. 本文使用 g++ 11.4.0 编译 C/C++代码, 使用 CUDA 11.5 完成 GPU 的实现, 代码实现
在 NVIDIA GeForce RTX 3060 Ti 上部署, 其 CUDA 核心个数为 4 864, 显存带宽为 448 GB/s, 使用 O3 级别的优化.
本节测试结果由 1 000 次执行取平均获得, 需要注意的是, 本文将 CPU 和 GPU 之间的数据传输延迟也计算在内.
5.2 两种多项式乘法 GPU 实现比较
本节使用 CUDA 默认流, 在延迟和吞吐量两方面评估并比较第 3 节提出的两种多项式乘法的 GPU 实现方法.

