本发明涉及gpu虚拟化,具体地,涉及一种支持opengl的gpu的仿真与集成方法及系统。
背景技术:
1、当前的gpu仿真领域主要包含三种仿真方案:
2、1、软件直接模拟。由于gpu中包含大量并行计算处理单元,而宿主机cpu的包含大量的逻辑控制单元。两者的用途分工不同,设计架构不同。因而使用通用宿主机cpu来仿真虚拟机gpu效率较低。但该方案可用于多gpu的计算机系统仿真。
3、2、显卡直通。利用不同显卡厂家提供的特殊接口实现虚拟机直接利用gpu硬件,这种方案虚拟gpu效率高,但gpu不能共享,不适用于仿真多gpu的计算机系统的场景。
4、3、api转发。这种方案是通过时间片将gpu硬件分配给虚拟机使用即实现了虚拟的多系统共享gpu,同时虚拟机也有较高的仿真运行效率。
5、公开号为cn111399976a的发明专利,公开了一种基于api重定向技术的gpu虚拟化实现系统及方法,其中:位于客户端的指令代理模块截获客户端的图像应用程序中与opengl相关的api调用指令,并对该指令进行处理后,发送至远程服务器端执行渲染任务;任务调度模块将客户端发来的指令数据进行相应处理得到指令流,并分配给各个微gpu模块;微gpu模块完成指令流的渲染任务,并回传至客户端。该专利中宿主机为远程的服务器,虚拟机为本地的客户端,且网络传输带了性能的损失,性能不如本地应用程序直接数据引用的方式。
6、公开号为cn111552554a的发明专利,公开了一种基于图形库api代理的gpu虚拟化方法、系统及介质,该方法不仅配置不具有gpu硬件资源的虚拟机,使其需要处理渲染任务时,调用其图形代理库的api并发出相应的调用通知;而且,还配置具有gpu硬件资源的虚拟机或主机,接收由其它虚拟机的调用通知,并根据接收到的调用通知,调用与图形代理库的api相对应的硬件加速图形库的api,从而通过gpu硬件资源处理其它虚拟机的渲染任务。该专利中虚拟机使用进程间通信的方式传递api信息到宿主机,也有一定的性能损失。并且查找api的方式也有性能损失。
技术实现思路
1、针对现有技术中的缺陷,本发明提供一种支持opengl的gpu的仿真与集成方法及系统。
2、根据本发明提供的一种支持opengl的gpu的仿真与集成方法及系统,所述方案如下:
3、第一方面,提供了一种支持opengl的gpu的仿真与集成方法,所述方法包括:
4、步骤s1:制作虚拟gpu驱动库;
5、步骤s2:根据所述虚拟gpu驱动库,重新编译在虚拟机上运行的应用程序;
6、步骤s3:制作虚拟gpu接口转发库;
7、步骤s4:虚拟机软件集成所述虚拟gpu接口转发库。
8、优选地,所述步骤s1包括:
9、步骤s1.1:虚拟gpu驱动库api接口与opengl接口一致,采用所述api接口使虚拟方案适用于多种gpu和多种操作系统;
10、步骤s1.2:编写实现所有的虚拟gpu驱动库api函数;
11、步骤s1.3:使用待虚拟化的目标机的开发工具链,将所有api接口函数编译成对应的opengl链接库。
12、优选地,所述步骤s1.2包括:
13、步骤s1.2.1:填充约定好的数据结构:其中包括api函数索引值、api函数传入参数的数目、api函数的各个参数以及返回值结构体指针;
14、步骤s1.2.2:填充完成触发虚拟机转发接口函数的运行;
15、步骤s1.2.3:读取转发接口函数的运行结果;
16、步骤s1.2.4:如果运行成功,继续运行,运行不成功则重新开始步骤s1.2.1;
17、步骤s1.2.5:如果有返回值,则将返回值返回给虚拟驱动api。
18、优选地,所述步骤s2包括:
19、步骤s2.1:利用所述虚拟gpu驱动库替换应用程序所引用的opengl驱动库;
20、步骤s2.2:使用待虚拟化的目标机的开发工具链重新链接应用程序。
21、优选地,所述步骤s3包括:
22、步骤s3.1:对应于虚拟gpu驱动库中的每个api函数都有对应的虚拟gpu接口转发库函数,实现每个虚拟gpu接口转发库函数的流程如下:
23、步骤s3.1.1:读取约定好的数据结构:其中包括api函数索引值、api函数传入参数的数目以及api函数的各个参数;
24、步骤s3.1.2:建立能够通过api函数索引值作为索引查找宿主机的gpu驱动库的hash表;
25、步骤s3.1.3:使用hash表查找gpu驱动库;
26、步骤s3.1.4:将传入数据结构中的参数填入运行宿主机gpu驱动api函数;
27、步骤s3.1.5:如果有返回值,将返回值放到数据结构中的指定位置;
28、步骤s3.2:使用开发虚拟机的开发工具链,将所有的api接口转发库编译成虚拟机软件可引用的链接库。
29、优选地,所述步骤s4包括:
30、步骤s4.1:虚拟机软件按照步骤s3集成后运行步骤s2得到虚拟机上的应用;
31、步骤s4.2:步骤s2的虚拟机上的应用程序运行时调用虚拟gpu驱动库;
32、步骤s4.3:虚拟gpu驱动库在虚拟机中通过步骤s3的api转发库调用真实物理机的gpu驱动库从而在宿主机的物理gpu上进行图形运算处理。
33、第二方面,提供了一种支持opengl的gpu的仿真与集成系统,所述系统包括:
34、模块m1:制作虚拟gpu驱动库;
35、模块m2:根据所述虚拟gpu驱动库,重新编译在虚拟机上运行的应用程序;
36、模块m3:制作虚拟gpu接口转发库;
37、模块m4:虚拟机软件集成所述虚拟gpu接口转发库。
38、优选地,所述模块m1包括:
39、模块m1.1:虚拟gpu驱动库api接口与opengl接口一致,采用所述api接口使虚拟方案适用于多种gpu和多种操作系统;
40、模块m1.2:编写所有用到的api接口的虚拟gpu驱动库函数即api函数;
41、模块m1.3:实现每个虚拟驱动api函数;
42、模块m1.4:使用待虚拟化的目标机的开发工具链,将所有api函数编译成对应的opengl链接库;
43、所述模块m1.3包括:
44、模块m1.3.1:填充约定好的数据结构:其中包括api函数索引值、api函数传入参数的数目、api函数的各个参数以及返回值结构体指针;
45、模块m1.3.2:填充完成触发api函数的运行;
46、模块m1.3.3:读取api函数的运行结果;
47、模块m1.3.4:如果运行成功,继续运行,运行不成功则重新开始模块m1.2.1;
48、模块m1.3.5:如果有返回值,则将返回值返回给虚拟驱动api。
49、优选地,所述模块m2包括:
50、模块m2.1:利用所述虚拟gpu驱动库替换应用程序所引用的opengl驱动库;
51、模块m2.2:使用待虚拟化的目标机的开发工具链重新链接应用程序;
52、所述模块m3包括:
53、模块m3.1:对应于虚拟gpu驱动库中api函数的虚拟gpu接口转发库,实现每个虚拟驱动gpu接口转发库函数,流程如下:
54、模块m3.1.1:读取约定好的数据结构:其中包括api函数索引值、api函数传入参数的数目以及api函数的各个参数;
55、模块m3.1.2:通过api函数索引值作为索引的hash表直接索引宿主机的gpu驱动库;
56、模块m3.1.3:使用hash表查找gpu驱动库;
57、模块m3.1.4:将传入数据结构中的参数填入运行宿主机gpu驱动api函数;
58、模块m3.1.5:如果有返回值,将返回值放到数据结构中的指定位置;
59、模块m3.2:使用开发虚拟机的开发工具链,将所有的api接口转发库编译成虚拟机软件可引用的链接库。
60、优选地,所述模块m4包括:
61、模块m4.1:虚拟机软件按照模块m3集成后运行模块m2得到虚拟机上的应用;
62、模块m4.2:模块m2的虚拟机上的应用程序运行时调用虚拟gpu驱动库;
63、模块m4.3:虚拟gpu驱动库在虚拟机中通过模块m3的api转发库调用真实物理机的gpu驱动库从而在宿主机的物理gpu上进行图形运算处理。
64、与现有技术相比,本发明具有如下的有益效果:
65、1、本发明通过采用与真实的gpu驱动库兼容的虚拟openggl驱动库从而实现无需改动计算机系统应用程序源码进行仿真,并且适用于仿真多种计算机系统下的gpu部分;
66、2、本发明通过采用api转发的方法从而实现可同时仿真多个gpu;
67、3、本发明通过api转发调用宿主机真实gpu硬件驱动的方法从而实现仿真的高效率。
68、本发明的其他有益效果,将在具体实施方式中通过具体技术特征和技术方案的介绍来阐述,本领域技术人员通过这些技术特征和技术方案的介绍,应能理解所述技术特征和技术方案带来的有益技术效果。