Windows WDDM显卡驱动框架及GPUView工具的使用(1)

也许这个夏天会写一些东西,这里先说说我做过些什么,知道些什么。
过去的五年里,先后在Vista,Win7和Win8上写过显卡驱动,包括umd和kmd的驱动,积累了大量关于WDDM的经验。
我知道WMMD的框架是什么样子的,知道应用程序,d3d runtime,显卡驱动以及硬件之间这么样互相合作。
顺便提一下,虽然是写显卡驱动的,但我不怎么懂d3d和opengl,所以博客里面都只有一些很简单的例子。
具体怎么写没想好,也不准备搞出个成系统的系列,心血来潮想到什么就写什么吧。
 
GPUView是Windows Performance Tools Kits里面的一个工具,但是会使用它的人很少,大多数都集中在和微软关系密切的一些公司里面了。
这篇博客先来说一个GPUView里面相当鲜为人知的功能。这里只谈一下这个功能的作用什么,具体怎么实现这个功能,这次就不写了。
 
这个功能是这样的,比如说下面这段代码,除去那些Event开头的奇怪函数,其他的都是些简单的D3D9代码。
VOID Render()
{
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET , D3DCOLOR_XRGB ( 0, 0, 255 ), 1.0f, 0 );
   EventWriteEventBeginScene (L"Begin Scene" );
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );   
        EventWriteEventBeforeDrawPrimitive (L"(Before DrawPrimitive" );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST , 0, 1 );
        EventWriteEventAfterDrawPrimitive (L"After DrawPrimitive" );
        g_pd3dDevice->EndScene();
        EventWriteEventEndScene (L"End Scene" );
    }
    EventWriteEventBeforePresent (L"Before Present" );
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    EventWriteEventAfterPresent (L"After Present" );   
}
这些Event开头的奇怪函数,实际上会产生ETW的Event。简单来说,你可以认为它们在打印一些log。
同时Windows的d3d runtime和graphic kernel也会生成一些Event.
这些ETW的Event都带有精确到毫秒的时间信息,它们都可以被GPUView显示出来。
这样你通过GPUView你就可以知道,你写的应用程序的代码在什么时候执行的,对应的d3d runtime和graphic kernel的事件在什么时候发生的,以及GPU在什么时刻开始执行对应的命令,等等很多信息。这些信息非常有助于解决CPU-CPU,CPU-GPU和GPU-GPU直接的同步问题。
 
下面这张图就是GPUView的截图,红色箭头指向的地方就是那些产生的ETW Event,如果选中他们就会在对应的左边哪里画出一些竖着的红线,比如说1附近有很多根红线,那就是
Begin Scene
Before DrawPrimitive
After DrawPrimitive
End Scene
Before Present
这些Event发生的时刻,可以看出来这些红线很密集,说明从Begin Scene到Before Present都执行的很快,没有任何阻塞出现。而我们还可看到After Present并没有出现在Current View里面,这说明Present这个函数产生了阻塞,它并被调用后没有立即返回。
而且还可以发现有个Event叫做*Dxgkrnl Render(在数字2的那条红线处),这个函数的出现,意味着显卡的umd驱动已经准备好了GPU需要执行的命令,并且已经提交给GPU执行了。在蓝色箭头指向的那个绿色长方形方块,就代表着在这个时间段,GPU正在运行这条命令。
Windows WDDM显卡驱动框架及GPUView工具的使用(1)
最后强调一点,这篇博客只是展示GPUView能够同时告诉你CPU里面发生了什么,GPU里面发生了什么。
大家不要因为这个例子就简单的认为Present一定会阻塞CPU。WDDM这个框架相当复杂,里面有很多因素会影响到这些函数调用是否会阻塞CPU.
 
 
上一篇:SQL语句添加删除修改字段


下一篇:Sql语句varchar或nvarchar字段条件前加N的性能差异