在边缘和云环境中,使用图形处理单元(GPU)作为高速并行计算设备可以提高计算密集型应用程序的性能。随着要处理的数据量和复杂性的增加,多个相互依赖的组件序列在GPU上共存并共享GPU资源。由于缺乏用于动态GPU资源分配的低开销和在线技术会导致GPU使用不平衡并影响整体性能,提出了高效的GPU内存和资源管理器。管理器通过使用共享内存和动态分配部分共享GPU资源来提高整体系统性能。评估结果表明,与默认GPU并发多任务处理相比,动态资源分配方法能够将具有各种并发组件数的应用程序的平均性能提高29.81%。同时,使用共享内存可使性能提高2倍。
具有通用计算支持的图形处理单元(GPU)正在成为边缘和云部署的重要组成部分。GPU 的大规模并行计算能力允许加速数据密集型应用程序。例如,与传统CPU [1]相比,在自动驾驶应用中的路径规划等应用中使用GPU 可以加速实时计算。
随着GPU 更积极地用于基于组件的应用程序, 这类应用程序的整体性能取决于数据传输开销和序列中每个组件的性能。管理组件对共享GPU 资源的竞争性使用面临着各种挑战。为了提升GPU 的整体性能,本文提出并评估了一个解决方案:在基于组件的应用程序中,组件之间使用共享的GPU 内存,从而消除了频繁和不必要的数据拷贝的需要。因此,它甚至可以适用于实时系统,不需要任何离线基准测试或测试案例。同时,将组件限制在其各自的最佳资源下,并将高比例的资源分配给其他资源密集型的组件,可以使整个基于组件的应用程序的性能得到改善,并可以防止内部排队和输入损失。
2. 基于组件的应用程序 如今的云应用程序通常被分解为组件或微服务, 以获得更好的可扩展性和维护性。
对于优化的部署, 通常会使用位置感知来安排组件。
最先进的GPU 支持多任务处理[2], 使多个组件能够使用相同的GPU, 并且与为组件使用单独的GPU 相比,有可能显著提高性能和成本。
尽管基于组件的应用程序中的组件与功能无关,但它们可能会遇到不同类型的依赖关系[3]。本文使用具有线性序列依赖关系的基于组件的程序,其中每个组件必须等待前一个组件的执行,然后才能开始自己的处理。同时,不同的输入可以并且应该由组件并行处理。例如,如图1 所示,基于实时组件的对象检测应用程序由具有线性依赖性的组件链组成。首先解码组件从实时摄像机流接收帧,并且增强组件必须等待结果才能开始处理。类似地,对象识别必须等待给定帧的增强。然而,不同的帧可以由组件并行处理。
GPU 通常被用作后备加速器,以加速应用程序的某些部分,同时也由CPU 进行管理。GPU 上运行的组件被称为内核。在典型的设置中,应用程序输入在CPU 上接收,并通过PCIe 总线传输到GPU。执行后,结果被带回CPU,并传输到下一个处理步骤。在基于组件的应用程序中,使用单个GPU 在CPU和GPU 之间多次复制数据会给处理增加大量开销, 也会不必要地加载PCIe 总线。最先进的GPU 框架支持进程间内存共享的构建块,从而能够避免不必要的数据拷贝。