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  实现方法.
   336   337   338   339   340   341   342   343   344   345   346