论文部分内容阅读
作为云计算的关键性基础设施,系统级虚拟机技术是当前计算机体系结构领域的研究热点之一。系统级虚拟机技术成功的将许多物理设备抽象成内存或硬盘中的数据结构,如网卡、硬盘、内存等,但GPU(Graphic Processing Unit,图形处理单元)从来不曾被完善的虚拟化。这其中一个主要原因在于GPU缺乏统一的硬件接口和开放的体系规范。在实践中,学术界和工业界选择在协议栈的更高层——用户API(Application Programming Interface,应用程序编程接口)层进行虚拟化,一些针对传统图形API的虚拟化工作已取得阶段性成果。CUDA (ComputeUnified Device Architecture)是一套崭新的GPU应用编程API,专注于通用计算(General-Purpose computation)而不是图形应用,是目前事实上的通用计算工业标准。它向程序员提供了直接控制GPU执行并行计算的能力,而不再依赖于传统图形API如OPENGL。CUDA框架的出现为系统级虚拟化技术带来了新的问题:已有的针对图形API的虚拟化工具对虚拟化CUDA没有任何帮助,运行在虚拟机中的应用程序无法调用CUDA API,从而不能利用GPU先进的并行加速功能。为了解决这个问题,本文提出并实现了首个针对通用计算的虚拟化解决方案——vCUDA(virtual CUDA)。vCUDA允许虚拟机中的应用程序访问位于虚拟机外部的通用计算资源,向它们提供GPU通用计算能力,对加速虚拟机环境下的高性能计算具有重要意义。vCUDA的设计和实现有四个主要的方面:API重定向(API remoting)、懒惰RPC(lazy RPC)、虚拟机专用RPC系统VMRPC(VirtualMachine Remote Procedure Call)和虚拟机高级特性支持。API重定向是指在用户层拦截API接口,将其参数转发到远程服务器,在远程服务器端完成实际计算工作,最后将计算结果返回用户。由于采用了在动态库中拦截和重定向API的技术,vCUDA在CUDA程序运行过程中实时进行虚拟化,不要求修改程序源码、不重新编译、不改变操作系统,实现了完全的二进制兼容,对程序员完全透明。针对NVIDIA官方样例程序和第三方CUDA应用的测试表明:vCUDA在虚拟机内实现了CUDA的全部功能,在远程服务器中完整而准确地模拟了CUDA的内部语义,所有实验均得到了与非虚拟化条件下相同的执行结果。由于CUDA应用可能涉及成千上万个API,针对每个API发送RPC将导致极大的性能开销。vCUDA借鉴了图形项目中延迟更新(lazy update)的优化思路,采用了懒惰RPC的方法。尽可能地推迟RPC的发生时刻,通过累积、过滤、合并上层调用,合理确定发送RPC的时机,将连续的API打包一次性发送,有效的提高了系统性能。相关实验显示,懒惰RPC可将RPC次数减少至30%,开启懒惰RPC后vCUDA虚拟化性能最高可提升148%。VMRPC是首个直接针对虚拟机体系的远程过程调用系统,与传统RPC系统不同的是,它利用了虚拟机之间的共享内存机制来实现堆和栈的共享,避免了不必要的数据复制和序列化操作,达到了传统RPC在虚拟机平台下所无法企及的性能。相关实验结果显示,VMRPC的吞吐率最大可达到传统RPC的100倍以上。利用API重定向和VMRPC,vCUDA同时实现了虚拟化的透明性和高效性,针对官方样例和第三方程序的测试表明,vCUDA所引入的虚拟化开销不超过21%,具有较大的实用价值。在CUDA虚拟化的相关基础上,vCUDA实现了对多路复用、挂起/恢复等传统虚拟机高级特性的支持,使得依赖于这些特性的虚拟机应用可以无缝部署于vCUDA框架之上。vCUDA采用了“一对多”模式来实现多路复用,由单一的工作线程来满足不同客户的应用请求。在挂起/恢复功能方面,vCUDA利用Kernel运行的间隙来保存和恢复当前CUDA状态。相关实验结果显示,vCUDA在实施多路复用、挂起/恢复的过程中仅引入了有限的开销,满足实际应用的需要。进一步,本文利用vCUDA所采用的CUDA状态追踪和管理方法,在传统GPU核外检查点方案的基础上实现了核内检查点方案——IKC,增强了GPU的容错能力。