一种基于自研显卡的GPU状态调试方法、装置及存储介质与流程

文档序号:32394349发布日期:2022-11-30 09:39阅读:173来源:国知局
一种基于自研显卡的GPU状态调试方法、装置及存储介质与流程
一种基于自研显卡的gpu状态调试方法、装置及存储介质
技术领域
1.本发明实施例涉及信号的软件处理技术领域,尤其涉及一种基于自研显卡的gpu状态调试方法、装置及存储介质。


背景技术:

2.当前市面上针对gpu内部渲染状态和着色器(shader)的调试工具相当少见,目前所知的针对着色器的调试工具有 nvidia的nsight、微软公司针对unity的graphics debug、开源的renderdoc等,但是未找到gpu内部渲染状态的调试工具,主要原因在于gpu是多核多线程,执行时是并行处理的,在运行时难以跟踪其内部状态。一种略为常用的方法是“颜色调试法”,具体做法是把要在着色器中待调试的变量转变为片段着色器中的颜色并显示在屏幕上,然后观察颜色显示是否正确,但是此调试方法能调试的变量较少且难以量化显示。


技术实现要素:

3.有鉴于此,本发明实施例期望提供一种基于自研显卡的gpu状态调试方法、装置及存储介质,能够实时抓取gpu内部当前执行单元的任意数据,支持参数设置、单步执行和变量查看反复操作,提升了gpu状态调试的实时性以及易操作性。
4.本发明实施例的技术方案是这样实现的:第一方面,本发明实施例提供一种基于自研显卡的gpu状态调试方法,包括:着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元记录处理所述调试索引参数的执行过程信息;着色器程序执行时调用所述着色器内置变量以生成渲染结果,并基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;其中,所述执行过程信息包括gpu执行单元信息和关联模块的内部状态信息;根据所述执行过程信息获取到gpu状态信息并根据所述gpu状态信息获取到处理所述调试索引参数的gpu执行单元,利用专用函数输入所述着色器内置变量,获取到所述gpu执行单元处理的输出着色器内置变量;当所述渲染结果异常时,根据所述gpu状态信息分析所述输出着色器内置变量与设置条件的差异,以确定处理所述着色器的gpu执行单元异常。
5.第二方面,本发明实施例提供一种基于自研显卡的gpu状态调试装置,所述装置包括:设置部分、记录部分、获取部分、分析部分;其中,所述设置部分,经配置为着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元记录处理所述调试索引参数的执行过程信息;所述记录部分,经配置为着色器程序执行时调用所述着色器内置变量以生成渲染结果,并基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;其中,所述执行过程信息包括gpu执行单元信息和关联模块的内部状态信息;
所述获取部分,经配置为根据所述执行过程信息获取到gpu状态信息并根据所述gpu状态信息获取到处理所述调试索引参数的gpu执行单元,利用专用函数输入所述着色器内置变量,获取到所述gpu执行单元处理的输出着色器内置变量;所述分析部分,经配置为当所述渲染结果异常时,根据所述gpu状态信息分析所述输出着色器内置变量与设置条件的差异,以确定处理所述着色器的gpu执行单元异常。
6.第三方面,本发明实施例提供了一种计算设备,所述计算设备包括:通信接口,存储器和处理器;各个组件通过总线系统耦合在一起;其中,所述通信接口,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;所述存储器,用于存储能够在所述处理器上运行的计算机程序;所述处理器,用于在运行所述计算机程序时,执行第一方面所述基于自研显卡的gpu状态调试方法的步骤。
7.第四方面,本发明实施例提供一种计算机存储介质,所述计算机存储介质存储有基于自研显卡的gpu状态调试的程序,所述基于自研显卡的gpu状态调试的程序被至少一个处理器执行时实现第一方面所述基于自研显卡的gpu状态调试方法的步骤。
8.本发明实施例提供了一种基于自研显卡的gpu状态调试方法、装置及存储介质,通过在着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元根据所述着色器内置变量,记录处理所述调试索引参数的gpu执行单元信息和关联模块的内部状态信息等执行过程信息;在着色器程序执行时将所述着色器内置变量传送给所述着色器进行调用以生成渲染结果;同时基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;根据所述执行过程信息获取到gpu状态信息并确定处理所述调试索引参数的gpu执行单元,利用专用函数获取到指定的gpu状态、状态数据内容以及输入或输出着色器内置变量;基于上述gpu渲染结果和获取到的指定的gpu状态,按照可编程管线的渲染流水线顺序,分析并确定处理所述着色器的gpu执行单元异常。若所述输入或输出内置变量不满足设定的条件时,可以重新设定和运行所述着色器内置变量,查看修改后的渲染结果、输入或输出着色器内置变量是否与预先设置条件一致。在整个调试过程中可以实时抓取到gpu内部当前执行单元的任意数据、支持参数设置、单步执行和变量查看并且可以反复操作,提升了gpu状态调试的实时性和易操作性。
附图说明
9.图1为本发明实施例提供的计算机系统组成示意图;图2为说明图1中的cpu、gpu和系统存储器的实例实施方案的框图;图3为本发明实施例提供的gpu中所包含的一个处理器的组成示意图;图4为本发明实施例提供的可编程管线的渲染流程线操作步骤流程图;图5为本发明实施例提供的一种基于自研显卡的gpu状态调试方法流程图;图6为本发明实施例提供的一种基于自研显卡的gpu状态调试操作流程图;图7为本发明实施例提供的基于自研显卡的gpu状态调试示例流程图;图8为本发明实施例提供的一种基于自研显卡的gpu状态调试装置示意图。
具体实施方式
10.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
11.参见图1,其示出了能够实现本发明实施例技术方案的计算机系统组成100,需注意,图示的系统是可能的系统的仅一个示例,并且可根据需要在各种系统中的任一系统中实现本发明的实施方案。该计算机系统组成100具体可以为任意类型的计算装置,包括且不限于台式计算机、服务器、工作站、膝上计算机、基于计算机的仿真器、无线装置、移动或蜂窝电话(包含所谓的智能电话)、个人数字助理(pda)、视频游戏控制台(包含视频显示器、移动视频游戏装置、移动视频会议单元)、膝上型计算机、桌上型计算机、电视机顶盒、平板计算装置、电子书阅读器、固定或移动媒体播放器等。如图1所示,计算机系统组成100可以包括中央处理器(central processing unit,cpu)10、图形处理器(graphic processing unit,gpu)20、存储器30,还包括显示处理器40、显示器41以及通信接口50。显示处理器40可为与gpu 20相同的集成电路(integrated circuit,ic)的部分,也可在包含gpu 20的一或多个ic的外部,或可形成于在包含gpu 20的ic外部的ic中。
12.具体来说,cpu 10可包括控制计算机系统组成100运算的通用或专用处理器,其经配置以处理供执行的计算机程序的指令。用户可经由通信接口50与耦合到计算机系统组成100的另一输入装置(未图示)例如:轨迹球、键盘、鼠标、麦克风、触摸垫、触摸屏以及其他类型的装置将输入提供给计算机系统组成100中的cpu 10,以使得cpu 10执行一或多个软件应用程序的指令。在cpu 10上执行的应用程序可包括图形用户接口(graphic user interface,gui)应用程序、操作系统、便携式制图应用程序、用于工程或艺术应用的计算机辅助设计程序、视频游戏应用程序、文字处理器应用程序、电子邮件应用程序、电子表格应用程序、媒体播放器应用程序或使用2d、3d图形的渲染应用程序等,本发明实施例以执行图形渲染应用程序为例。此外,cpu 10上执行的渲染应用程序可包含一或多个图形渲染指令(也可以理解为待渲染的画面帧中包含一或多个所述图形),所述图形渲染指令可符合图形应用程序编程接口(application programming interface,api),例如,开放式图形库api(opengl api)、开放式图形库嵌入系统(opengl es)api、direct3d api、x3d api、renderman api、webgl api、开放式计算语言(opencltm)、renderscript或任何其它异构计算api,或任何其它公用或专有标准图形或计算api,本发明下面的描述中将以开放式图形库api为例进行说明。
13.gpu 20可经配置以执行图形运算,从而将一或多个图形图元渲染到显示器41进行展示。可以理解为,cpu 10通过控制gpu驱动程序13,将渲染指令翻译为gpu 20可读的渲染命令,然后gpu 20根据收到的一或多个图形渲染命令,包括但不限于图形命令和图形数据,所述图形数据可包含绘制命令、状态信息、图元信息、纹理信息等,以使得gpu 20执行所述图形渲染命令中的一些或者全部,从而将一或多个图形图元进行渲染并在显示器41上展示出来。在一些情况下,gpu 20可内置有高度并行结构,其提供比cpu 10高效的对复杂图形相关运算的处理。举例来说,gpu 20可包含经配置来以并行方式对多个顶点或像素进行运算的多个处理元件,例如着色器单元。在一些情况下,gpu 20的高度并行性质允许gpu 20比使用cpu 10更快速地将图形图像(例如,gui和二维(2d)和/或三维(3d)图形场景)绘制到显示器41上。在一些情况下,可将gpu 20集成到目标设备的母板中。在其它情况下,gpu 20可存
在于图形卡上,所述图形卡安装在目标设备的母板中的端口中,或可以其它方式并入在经配置以与目标设备互操作的外围装置内。gpu 20可包含一或多个处理器,例如一或多个微处理器、专用集成电路(asic)、现场可编程门阵列(fpga)、数字信号处理器(dsp)或其它等效的集成或离散逻辑电路。gpu 20还可包含一或多个处理器核心,使得gpu 20可被称作多核处理器。
14.存储器30,经配置用于存储能够在cpu 10上运行的应用程序指令、gpu 20执行需要的图形数据以及其运行结果数据。例如,gpu 20可将完全形成的图像存储在存储器30中。存储器30可包含一或多个易失性或非易失性存储器或存储装置,例如,随机存取存储器(ram)、静态ram(sram)、动态ram(dram)、可擦除可编程rom(eprom)、电可擦除可编程rom(eeprom)、快闪存储器、磁性数据媒体或光学存储媒体。显示处理器40可从存储器30检索图像且输出使显示器41的像素照亮以显示所述图像的值。显示器41可为计算机系统100的显示器,其显示由gpu 20产生的图形图像内容。显示器41可为液晶显示器(lcd)、有机发光二极管显示器(oled)、阴极射线管(crt)显示器、等离子显示器或另一类型的显示装置。
15.结合图1所示,图2进一步阐述计算机系统组成100中的关键部件cpu 10、gpu 20和存储器30的实施方案的框图,如图2所示,本发明实施例的实施方案的框图主要包括但不限于cpu 10、gpu 20、存储器30及其对应内部构成。其中,cpu 10包含应用程序11、图形api 12、gpu驱动程序13,其中图形api 12和gpu驱动程序13两者中的每一个,可以为一或多个应用程序服务,在一些示例中,图形api 12和gpu驱动程序13可实施为cpu 10的硬件单元,而gpu驱动程序13可以将cpu 10的一或多个图形渲染指令编译成gpu 20可执行的应用程序命令。gpu 20内部结构包括但不限于图形存储器21、处理器集群22。在本发明实施例中,图形存储器21可为gpu 20的一部分。因此,gpu 20可在不使用总线的情况下从图形存储器21读取数据且将数据写入到图形存储器21。换句话说,gpu 20可使用本地存储装置而不是芯片外存储器在本地处理数据,此类图形存储器21可被称作芯片上存储器。这允许gpu 20通过消除gpu 20经由总线读取和写入数据的需要来以更高效的方式操作,其中经由总线操作可经历繁重的总线业务。在一些示例中,gpu 20可不包含单独的存储器,而是经由总线利用外置的存储器30。图形存储器21的类型参见前述存储器30的类型,此处不再赘述。处理器集群22,用于执行图形处理管线,以便对图形渲染命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。存储器30可包含系统存储器31和显存32。其中,显存32可为系统存储器31的部分或可与系统存储器31分离。显存32也被称为帧缓存,可存储渲染图像数据,例如像素数据,其具体存储的数据为每个像素的红色、绿色、蓝色、α(rgba)分量,其中“rgb”分量对应于色彩值,并且“a”分量对应于目的地α值(例如,用于图像合成的不透明度值)。在一些示例中,所述显存32还可被称为帧缓冲器(frame buffer)或输出缓冲器,用于预览所述画面帧的渲染效果,也可以理解为预览所述画面帧的渲染效果可以通过frame buffer机制实现,帧缓冲器是内核空间中的一种驱动程序接口,它本身不具备任何运算数据的能力,中间不会对数据做处理,但其需要真的显卡驱动的支持。
16.根据gpu的架构可知,在一些示例中,gpu被划分成多个纹理处理簇(texture/processor cluster,tpc),每个tpc又包含多个流多处理器(stream multiprocessor,sm),每个流多处理器又包含多组流处理器(streaming processor,sp),在执行图形应用程序时,各tpc、 sm以及sp都会在gpu统一调度下并发执行。结合图2中的处理器集群22,参见图
3,其示出了能够实现本发明实施例技术方案的gpu中所包含的一个处理器300的组成示意图,在一些示例中,该处理器300能够作为gpu实现高度并行计算的处理器集群阵列中的通用处理集群的一个,以实现并行地执行大量的线程,其中每个线程是程序的实例(instance)。在另一些示例中,该处理器300可以被实现为gpu中的流多处理器sm。在该处理器300中,可以包括被组织成线程束warp的多个线程处理器或被称之为核心,每个核心均可对应一个线程。在一些示例中,相应于处理器300被实现为sm,核心可以被实现为流处理器sp,所述核心也可以被称之为统一计算设备架构核心(compute unified device architecture core,cuda core)或执行单元。该处理器300可以包含j个warp 304-1到304-j,每个warp具有k个核心306-1到306-k。在一些示例中,warp 304-1到304-j可以进一步地被组织成一个或多个线程块(block)302。在一些示例中,每个warp可具有32个核心;在其他示例中,每个warp可具有4个核心、8个核心、16个核心或者多如数万个核心。如图3所示,本发明实施例以设定每个warp具有16个核心(即k=16)为例进行技术方案阐述,可以理解地,上述设定仅用于技术方案说明,并非对技术方案的保护范围进行限制,本领域技术人员可以很容易地将基于上述设定所阐述的技术方案适用于其他情况,在此不作赘述。在某些可替代的示例中,该处理器300可将核心仅组织成warp,省略线程块block的组织级别。进一步来说,处理器300还可以包括管线控制单元308、共享存储器310以及与warp 304-1到304-j相关联的本地存储器312-1到312-j的阵列。管线控制单元308通过数据总线314将任务分布到各个warp 304-1到304-j。管线控制单元308创建、管理、调度、执行并提供机制以将warp 304-1到304-j同步。继续参见图3所示的处理器300,warp内的核心相互并行地执行。warp 304-1到304-j通过存储器总线316与共享存储器310进行通信。warp 304-1到304-j通过本地总线318-1到318-j分别与本地存储器312-1到312-j进行通信。如图3中所示,warp 304-j以通过本地总线318-j进行通信来利用本地存储器312-j。处理器300的某些实施例将共享存储器310的共享部分分配到每个线程块302,并允许由线程块302内的所有warp访问共享存储器310的共享部分。某些实施例包括仅使用本地存储器的warp,许多其他实施例包括平衡本地存储器和共享存储器310的使用的warp。
17.基于现有技术中opengl的应用程序调用方式,cpu 10通过应用程序11经由图形api 12向gpu驱动程序13发出指令,gpu驱动程序13可调配指定供gpu 20执行的一或多个运算以便渲染图元的一或多个命令,以用于将一或多个图形图元渲染到可显示的图形图像中。当gpu 20接收到来自cpu 10的图形渲染命令时,gpu 20可使用处理器集群22执行图形处理管线,以便对命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。具体来说,gpu 20在实现或运行应用程序的过程中,需要借助于图形渲染管线以实现对图形的渲染操作,所述图形渲染管线属于一种通过级联形成的逻辑结构,各级也可称为各渲染阶段,包括固定管线和可编程管线。
18.参见图4,其示出了本发明实施例提供的可编程管线的渲染流水线操作步骤流程图400,所述渲染流水线的作用是基于一个虚拟相机、一些三维物体、光源等其他条件,生成或渲染出一张二维或三维图片。一般包括顶点着色器、图元装配、光栅化、片段着色器和测试与融合五个阶段。其中,s401:顶点着色器,即对传入参数进行操作,最终确定图元顶点坐标;s402:图元装配,根据顶点着色器阶段传入的顶点,确定最终渲染的图元类型和形
状;s403:光栅化,将图形顶点数据转变为屏幕像素点;s404:片段着色器,也称为像素着色器,为图形中的每个像素进行着色;s405:测试与融合,即比较片段深度值和深度缓存中的值,确定该片段是否需要被丢弃。颜色融合负责把片段颜色和颜色附件中的颜色进行混合处理以确定该片段最终色值。
19.需要说明的是,所述测试可以分为像素所有者测试、裁剪测试、模板测试和深度测试,执行的顺序也是按照上述顺序进行执行。其中,所述裁剪测试,主要是剔除窗口区域之外的像素,是由opengl内部实现的,无需开发者干预;所述深度测试主要是通过对像素的运算出来的深度,也就是像素离屏幕的距离进行对比,根据opengl设定好的深度测试程序,决定是否最终渲染到画布上。一般默认的深度测试程序是将离屏幕较近的像素保留,而将离屏幕较远的像素丢弃。如果像素最终被渲染到画布上,根据设定好的opengl深度覆写状态,可能会更新帧缓冲区上深度附着的值,方便进行下一次的比较;所述混合在测试阶段之后,如果像素依然没有被剔除,那么像素的颜色将会和帧缓冲区中颜色附着上的颜色进行混合,混合的算法可以通过opengl的函数进行指定,但是opengl提供的混合算法是有限的,如果需要更加复杂的混合算法,一般可以通过片段/像素着色器进行实现。
20.根据上述图4所示的可编程管线的渲染流水线,包括其未示出的几何着色器、细分控制器、细分评估器、计算着色器等阶段,所述渲染流水线中每个阶段在执行过程中是在gpu中的不同执行单元并发处理,而gpu中各个执行单元在某一时刻只负责流水线中某个阶段的处理工作,对所述渲染流水线中的每个阶段进行并发处理会出现难以调试和追踪gpu内部状态的问题。基于此,根据上述内容的阐述,本发明实施例期望提供一种基于自研显卡的gpu内部状态调试方法,该调试方法包括:s501:着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元记录处理所述调试索引参数的执行过程信息;s502:着色器程序执行时调用所述着色器内置变量以生成渲染结果,并基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;其中,所述执行过程信息包括gpu执行单元信息和关联模块的内部状态信息;s503:根据所述执行过程信息获取到gpu状态信息并根据所述gpu状态信息获取到处理所述调试索引参数的gpu执行单元,利用专用函数输入所述着色器内置变量,获取到所述gpu执行单元处理的输出着色器内置变量;s504:当所述渲染结果异常时,根据所述gpu状态信息分析所述输出着色器内置变量与设置条件的差异,以确定处理所述着色器的gpu执行单元异常。
21.根据上述方案的描述,本发明实施例通过在着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元根据所述着色器内置变量,记录处理所述调试索引参数的gpu执行单元信息和关联模块的内部状态信息等执行过程信息;在着色器程序执行时将所述着色器内置变量传送给所述着色器进行调用以生成渲染结果;同时基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;根据所述执行过程信息获取到gpu状态信息并确定处理所述调试索引参数的gpu执行单元,可以利用专用函数获取到指定的gpu状态、状态数据内容以及输入或输出着色器内置变量;基于所
述渲染结果和获取到的指定的gpu状态信息,按照可编程管线的渲染流水线顺序,分析并确定处理所述着色器的gpu执行单元异常。若所述输入或输出内置变量不满足设定的条件时,可以重新设定和运行所述着色器内置变量,查看修改后的渲染结果、输入或输出着色器内置变量是否与预先设置条件一致。在整个调试过程中可以实时抓取到gpu内部当前执行单元的任意数据、支持参数设置、单步执行和变量查看并且可以反复操作,提升了gpu状态调试的实时性和易操作性。
22.对于图5所示的技术方案,在一些可能的实现方式中,所述着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元记录处理所述调试索引参数的执行过程信息,具体来说,如果在着色器程序执行前预先设置要查看的着色器内置变量,例如顶点着色器的顶点索引、实例化索引等内置变量;在着色器程序执行时,需要把当前调用的顶点索引、实例化索引等内置变量传给所述顶点着色器,如果事先告知gpu中的执行单元,在处理例如顶点索引为0的顶点着色器或者满足其他设定条件时,记录当前gpu执行单元信息和关联模块的内部状态信息,就可以获取到实时并行运行时gpu状态信息。
23.由于可编程管线中增加了顶点着色器、片段着色器、细分控制器、细分评估器、几何着色器和计算着色器,使得图形应用程序渲染性能更好,并且可以渲染出固定管线渲染不出来的效果。所述着色器是在gpu上执行的自定义程序,是一个描述顶点或像素特性的简单程序,着色器代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性,例如视图转换、投影转换等。当前用于编写可编程着色器的语言以opengl着色语言(opengl shading language,glsl)为例,其可用于opengl和vulkan编程开发。glsl中定义了一系列针对不同渲染阶段的数字变量即内置变量,所述内置变量通常被用于一些固定的用途。参见表1,其示出了常用的着色器输入和输出内置变量,如下所示:
表1对于图5所示的技术方案,在一些可能的实现方式中,所述着色器程序执行时调用所述着色器内置变量以生成渲染结果,并基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;其中,所述执行过程信息包括gpu执行单元信息和关联模块的内部状态信息,包括:单步执行应用程序并通过gpu执行单元运行着色器程序,以调用所述着色器内置
变量生成渲染结果;通过gpu执行单元自身记录处理所述调试索引参数的gpu执行单元信息和关联模块的内部状态信息。
24.对于上述实现方式,在一些示例中,所述单步执行应用程序并通过gpu执行单元运行着色器程序,以调用所述着色器内置变量生成渲染结果,具体来说,所述单步执行应用程序是指执行opengl、vulkan或其他图形api中的单个函数,由于所述图形api中的函数是在cpu端进行提交的,因此可以单步执行。
25.所述着色器程序是指用来实现图像渲染的用来替代固定渲染管线的可编辑程序,是为图形渲染管线的某个特定部分而运行的程序,同时也是一种把输入转化为输出的程序,不同着色器之间内置变量的传递是通过输入和输出实现的,因此glsl定义了in和out两个关键字来实现所述内置变量的传递。每个着色器可以使用in和out两个关键字设定输入和输出,只要一个输出内置变量与下一个着色器阶段的输入匹配,所述内置变量就会传递下去。在一些示例中,如果从一个着色器向另一个着色器发送数据,必须在发送方着色器中声明一个输出内置变量,在接收方着色器中声明一个类似的输入内置变量。当所述输出内置变量和输入内置变量的类型和名字都一致时,opengl在链接程序对象时就会把这两个内置变量链接到一起,所述着色器之间就可以互相发送数据了。
26.所述着色器程序中的代码也跟传统的c++等语言类似,需要将面向人类的高级语言,例如glsl,通过编译器转成面向机器的二进制指令,二进制指令可转译成汇编代码,上述由高级语言编译成汇编指令的过程通常是在离线阶段执行,以减轻运行时的消耗。所述着色器程序的执行是在gpu的流多处理器sm中完成的,所述sm中的每一个包含多个为线程执行数学运算的核心core或称之为执行单元,例如,一个线程可以为顶点着色器或片段着色器调用。详细执行过程是cpu端将着色器的二进制指令经由gpu驱动程序推送到gpu,gpu在执行着色器程序中的代码时会用上下文将指令分成若干信道推送到各个核心core的存储空间。在着色器程序执行阶段,所述汇编代码会被gpu推送到执行上下文,然后所述核心core或被称之为执行单元会逐条获取、解码所述汇编指令,并按照所述汇编指令执行相应的操作。例如,所述操作可以是根据传入的顶点索引、实例化索引等内置变量将顶点索引为0的顶点做旋转操作或者设置其传出颜色为红色。
27.需要说明的是,对于opengl中存在的应用程序program和着色器shader的关系为,program相当于当前渲染管线所使用的程序,是shader的容器,可以挂载多个shader;而每个shader相当于一个程序部分,用来替代固定渲染管线的可编辑程序。对着色器shader的处理流程为,首先需要对shader脚本进行编译,然后将编译好的shader挂载到program上,在opengl的渲染中使用program来使shader生效。也就是说,shader是专门用来实现不同渲染工序的程序,通过shader可以自定义gpu的shader渲染算法,以使得gpu根据所述shader渲染算法处理所述图形数据中的每一个顶点以及每一个像素点,从而将该画面帧渲染到显示器。
28.对于上述实现方式,在一些示例中,所述通过gpu执行单元自身记录处理所述调试索引参数的gpu执行单元信息和关联模块的内部状态信息,具体来说,所述gpu执行单元信息是记录当前执行单元id编号;所述关联模块的内部状态信息包括寄存器信息(例如,地址寄存器、浮点寄存器、常数寄存器)、所在gpu执行单元的编号、gpu执行单元当前执行时的输
入信息(例如,上一阶段的传入变量、浮点类型、二维向量等)、涉及算术计算时的算术处理单元(arithmetic logic unit,alu)信息、gpu执行单元对应的着色器数据,例如,若当前是片段着色器时则需要对应的片段着色器二进制数据、多边形列表、着色器的输入是统一变量uniform、着色器存储缓冲区对象(shader storage buffer object,ssbo)或其他变量的绑定、类型以及纹理信息,对应片段的输出颜色和位置以及基于瓦片tile渲染时还需要记录对应的tile id等;若当前是顶点着色器时输出信息是当前gpu执行单元的id、当前顶点编号以及当前顶点位置信息。对于上述信息的记录可以采用专门的状态记录模块,也可以采用gpu执行单元自身记录的方式,一般情况下,通常采用gpu执行单元自身记录的方式,将所述信息记录并保存到显存中,以用于后续分析。
29.对于图5所示的技术方案,在一些可能的实现方式中,所述根据所述执行过程信息获取到gpu状态信息并根据所述gpu状态信息获取到处理所述调试索引参数的gpu执行单元,利用专用函数输入所述着色器内置变量,获取到所述gpu执行单元处理的输出着色器内置变量,包括:根据所述gpu执行单元信息和关联模块的内部状态信息,获取到实时并行运行时的gpu状态信息;根据所述gpu状态信息确定处理所述调试索引参数的gpu执行单元并获取所述gpu执行单元的标识信息;根据所述gpu执行单元的标识信息,利用专用函数输入所述着色器内置变量,以获取所述gpu执行单元处理的输出着色器内置变量。
30.对于上述实现方式,在一些示例中,所述根据所述gpu执行单元信息和关联模块的内部状态信息,获取到实时并行运行时的gpu状态信息,具体来说,所述gpu状态信息包括着色器内置变量和自研显卡gpu中的内部私有数据。详细来说,所述gpu状态信息包括显存内的数据,执行单元寄存器状态和值,整个vertexjob描述符结构,其包含当前未处理的任务id、顶点位置数组格式、采样器地址、渲染状态描述符地址,tilerjob描述符中的图元类型、工作维度、面剔除类型、是否开启主屏障、视口描述符号地址和内容,fragment描述符中的帧缓冲描述符地址和内容、渲染目标格式、渲染目标描述符信息。
31.对于上述实现方式,在一些示例中,所述根据所述gpu执行单元的标识信息,利用专用函数输入所述着色器内置变量,以获取所述gpu执行单元处理的输出着色器内置变量,具体来说,用户端调用的专用函数依赖于调试器的具体实现,例如可以设计以下的函数:int getgpustatuslength(int id,int type)int getgpustatusbuffer(int id,int type,int length,char** data)其中,getgpustatuslength函数是用于获取指定状态,id为内置变量,type为gpu涉及此变量的模板单元或属性,通过getgpustatuslength函数可以获取gpu指定内部状态的数据长度。getgpustatusbuffer函数是获取指定内部状态的数据内容,第三个参数length为getgpustatuslength函数的输出。在调用上述两个函数时需要传入前述的所述着色器内置变量,以确定要获取的输入和输出着色器内置变量。
32.对于图5所示的技术方案,在一些可能的实现方式中,所述当所述渲染结果异常时,根据所述gpu状态信息分析所述输出着色器内置变量与设置条件的差异,以确定处理所述着色器的gpu执行单元异常,包括:
对比gpu状态信息中的输入或输出着色器内置变量与设置的预期内置变量的差异,以获取到对比结果;根据所述对比结果,若不一致时,确定处理所述着色器的gpu执行单元异常;或者,根据所述对比结果,判断是否需要重新设置内置变量以重复执行操作。
33.对于上述实现方式,在一些示例中,所述根据所述对比结果,判断是否需要重新设置内置变量以重复执行操作,包括:若所述gpu状态信息中的输入或输出着色器内置变量与预先设置的着色器内置变量一致,则所述着色器调试过程结束;若不一致,重置所述着色器内置变量并单步执行应用程序重复查看所述着色器内置变量,直至与预先设置的着色器内置变量一致。
34.具体来说,若所述gpu状态信息中的输入或输入着色器内置变量信息与预先设置的着色器内置变量不一致时,可以重置所述着色器内置变量或手动修改gpu执行单元的着色器内置变量并反复执行上述操作,查看是否与预先设置的着色器内置变量一致,执行过程中不需要退出应用程序。
35.参见图6,其示出了本发明实施例提供的一种基于自研显卡的gpu状态调试操作流程图600,具体操作步骤如下:s601:开始gpu状态调试,设置调试索引参数;在开始gpu状态调试前,预先设置调试索引参数,例如设置顶点索引为0。
36.s602:设置要查看的gpu处理器内置变量;例如,可以设置要查看的顶点着色器的输入和输出内置变量,并预先告知gpu各执行单元,在处理调试索引参数,如顶点索引为0的着色器时记录所述gpu执行单元信息和关联模块的内部状态信息。
37.s603:单步执行应用程序;在cpu侧执行opengl中单个图形api函数,例如确定顶点的函数glvertex3f,由于该函数是在cpu侧提交的,可以单步执行所述顶点的函数。
38.s604:gpu执行渲染;cpu通过应用程序经由图形api向gpu驱动程序发出指令,gpu驱动程序将opengl定义的渲染指令翻译为gpu可读的渲染命令,gpu接收到来自cpu的图形渲染命令时,根据其可读的渲染命令执行着色器程序对所述图形数据进行渲染。
39.s605:gpu内部按阶段并发调用各执行单元;gpu执行过程中,按照可编程管线的渲染流顺序执行图形渲染命令中所指定的操作,同时gpu内部通过调度gpu各执行单元并发处理所述可编程管线中的各着色器程序。
40.s606:记录当前执行单元处理参数和所需匹配,保存相关内置变量到显存;根据上述执行着色器程序时,调用设置的着色器内置变量并在执行过程中记录处理所述调试索引参数,如顶点索引为0的着色器的gpu执行过程信息,以用于后续根据上述记录内容信息确定处理顶点索引为0的着色器的gpu执行单元。
41.s607:用户端调用专用函数获取所需内置变量;用户端使用专用函数输入所述着色器内置变量,以获取到渲染过程中的gpu状态及着色器对应的输出着色器内置变量。
42.s608:分析获取到的所述所需内置变量;根据获取到的输出着色器内置变量与预期设置结果相比较,以分析所述所需内置变量与预先设置内置变量的差异。
43.s609:判断是否需要重操作,若是,跳转到开始,重新执行上述操作;若否,则跳转到结束。
44.参见图7,其示出了本发明实施例提供的基于自研显卡的gpu状态调试示例流程图700,以绘制三角形为例,假定绘制程序无异常,正常显示应该是一个纯红色的三角形,但是自研显卡上运行显示黑屏,则可以使用以下图示步骤进行分析,具体流程步骤为:s701:开始gpu状态调试,设置顶点索引为0;s702:运行应用程序一帧;可以理解为,单步执行应用程序中的一个指定函数,以获取到一个渲染画面帧,所述一帧就是一副静止的图像,是最小单位的单幅图像,连续的帧就形成动画。在应用程序执行过程中通过gpu执行单元自身记录处理顶点索引为0的gpu执行单元信息和关联模块的内部状态信息。
45.s703:查看处理所述顶点索引为0的执行单元;根据上述记录的gpu执行单元信息和关联模块的内部状态信息获取到gpu状态信息并确定处理所述顶点索引为0的gpu执行单元。
46.s704:查看输入和输出的顶点参数信息;使用专用函数输入设置的顶点参数信息或称之为顶点内置变量,获取到输出的顶点参数信息或称之为顶点内置变量。
47.s705:判断传出顶点参数信息是否正常,若是,跳转到步骤s606;若否,则判定顶点着色器执行单元有异常;对比传出顶点参数信息与预期设置的是否一致,若是,跳转下一步,若否,则判定处理顶点着色器的gpu执行单元异常。
48.s706:设置片段索引为0;设置片段着色器的片段索引为0,继续片段着色器内置变量的设置、处理及分析。
49.s707:运行应用程序一帧;可以理解为,应用程序执行片段着色器程序以对图形进行着色。所述片段着色器是opengl中用于计算片段或称之为像素颜色的程序,是逐像素运算的程序,可以理解为每个像素都会并行执行一次片段着色器,以获得对所述片段或像素的着色。
50.s708:查看处理片段索引为0的执行单元信息;所述执行单元信息包括gpu执行单元的标识信息以及关联模块的内部状态信息,具体关联模块的内部状态信息包含内容如上述描述,此处不再赘述。
51.s709:查看片段输出颜色;可以理解为,查看片段着色器输出的颜色是否与预期结果一致,即三角形的颜色是否为纯红色。
52.s710:判断三角形颜色是否为黑,若是,跳转到结束并判定片段着色器处理单元有异常;若否,跳转到s711步骤;s711:查看处理该片段着色器的测试执行单元信息;
s712:所述片段深度测试是否通过,若是,跳转到s713步骤;若否,则跳转到结束并判定深度测试部分有异常;s713:查看片段颜色融合执行单元;s714:判断颜色融合结果是否为黑,若是,跳转到结束并判定颜色融合有异常;若否,则跳转到s715步骤;s715:查看裁剪执行单元;s716:判断片段是否被丢弃,若是,则判定顶点坐标计算异常;若否,跳转到s717步骤;s717:查看其他状态信息,跳转到结束。
53.根据上述示例的流程步骤可知,所述gpu状态调试总的处理原则是按照渲染流水线的顺序进行分析,先分析顶点位置是否存在异常,然后分析图元装配,再分析片段颜色,之后分析光栅化结果,最后是深度测试、颜色融合和裁剪部分。
54.基于前述技术方案相同的发明构思,参见图8,其示出了一种基于自研显卡的gpu状态调试装置800,所述装置800包括:设置部分801、记录部分802、获取部分803、分析部分804;其中,所述设置部分801,经配置为着色器程序执行前设置调试索引参数和要查看的着色器内置变量并预先告知gpu各执行单元记录处理所述调试索引参数的执行过程信息;所述记录部分802,经配置为着色器程序执行时调用所述着色器内置变量以生成渲染结果,并基于所述着色器内置变量的调用,记录处理所述调试索引参数的执行过程信息;其中,所述执行过程信息包括gpu执行单元信息和关联模块的内部状态信息;所述获取部分803,经配置为根据所述执行过程信息获取到gpu状态信息并根据所述gpu状态信息获取到处理所述调试索引参数的gpu执行单元,利用专用函数输入所述着色器内置变量,获取到所述gpu执行单元处理的输出着色器内置变量;所述分析部分804,经配置为当所述渲染结果异常时,根据所述gpu状态信息分析所述输出着色器内置变量与设置条件的差异,以确定处理所述着色器的gpu执行单元异常。
55.在一些示例中,所述记录部分802,经配置为:单步执行应用程序并通过gpu执行单元运行着色器程序,以调用所述着色器内置变量生成渲染结果;通过gpu执行单元自身记录处理所述调试索引参数的gpu执行单元信息和关联模块的内部状态信息。
56.在一些示例中,所述获取部分803,经配置为:根据所述gpu执行单元信息和关联模块的内部状态信息,获取到实时并行运行时的gpu状态信息;根据所述gpu状态信息确定处理所述调试索引参数的gpu执行单元并获取所述gpu执行单元的标识信息;根据所述gpu执行单元的标识信息,利用专用函数输入所述着色器内置变量,以获取所述gpu执行单元处理的输出着色器内置变量。
57.在一些示例中,所述分析部分804,经配置为:对比gpu状态信息中的输入或输出着色器内置变量与设置的预期内置变量的差
异,以获取到对比结果;根据所述对比结果,若不一致时,确定处理所述着色器的gpu执行单元异常;或者,根据所述对比结果,判断是否需要重新设置内置变量以重复执行操作。
58.在一些示例中,所述分析部分804,经配置为:若所述gpu状态信息中的输入或输出着色器内置变量与预先设置的着色器内置变量一致,则所述着色器调试过程结束;若不一致,重置所述着色器内置变量并单步执行应用程序重复查看所述着色器内置变量,直至与预先设置的着色器内置变量一致。
59.可以理解地,上述基于自研显卡的gpu状态调试装置800的示例性技术方案,与前述一种基于自研显卡的gpu内部状态调试方法的技术方案属于同一构思,因此,上述基于自研显卡的gpu状态调试装置800的技术方案未详细描述的细节内容,均可以参见前述一种基于自研显卡的gpu内部状态调试方法的技术方案的描述。本发明实施例对此不做赘述。
60.可以理解地,图5所示的技术方案及其示例既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现,本发明实施例是以软件功能模块的方式实现。如果以软件功能部分的形式实现并非作为独立的产品进行销售或使用时,可以存储在一个计算机可读取存储介质中,基于这样的理解,本实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器或者网络设备等)或processor(处理器)执行本实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。因此,本实施例提供了一种计算机存储介质,所述计算机存储介质存储有基于自研显卡的gpu状态调试的程序,所述基于自研显卡的gpu状态调试的程序被至少一个处理器执行时实现上述技术方案中所述一种基于自研显卡的gpu状态调试方法的步骤。
61.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1