也许这个夏天会写一些东西,这里先说说我做过些什么,知道些什么。
过去的五年里,先后在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正在运行这条命令。
最后强调一点,这篇博客只是展示GPUView能够同时告诉你CPU里面发生了什么,GPU里面发生了什么。
大家不要因为这个例子就简单的认为Present一定会阻塞CPU。WDDM这个框架相当复杂,里面有很多因素会影响到这些函数调用是否会阻塞CPU.
 
 

Windows WDDM显卡驱动框架及GPUView工具的使用(1)的更多相关文章

  1. Windows重启显卡驱动热键说明

    Windows 有一个秘密的快捷键,可以重启显卡驱动程序.如果你的电脑经常“冻屏”,可以在重启电脑之前试试这个快捷键,它可以修复冻屏,否则就只能强制重启电脑了. 这个组合快捷键将重启 Win10 和 ...

  2. WDF(Windows Driver Frameworks)驱动框架源码!!

    微软官方提供源码:https://github.com/Microsoft/Windows-Driver-Frameworks

  3. Debian 安装Nvidia显卡驱动

    1.到nvidia官方网站下载自己显卡对应型号得驱动,如果不知道显卡型号,可以使用如下命令来查看 lspci | grep VGA 2.安装显卡驱动所必需得工具 apt-get install bui ...

  4. Linux: 安装NVIDIA显卡驱动

    Linux(Fedora25, 64bit)台式机配备了NVIDIA显卡GTX950,但是仅仅使用开源驱动nouveau,无法发挥NVIDIA显卡的性能,所以可以考虑使用官方提供的显卡驱动. # 先安 ...

  5. Windows下打开某些软件时显示显卡驱动不是最新的问题

    在Windows下打开某些对显卡要求比较高的软件时,会出现某些显卡驱动不是最新,要求更新到最新的提示,但是当你真的去更新显卡驱动的时候,却发现现在的显卡驱动已经是最新了,那么为什么还会有这样的提示呢, ...

  6. 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发

    [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...

  7. Debian 8.0(Jessie) 无线网卡,ATI显卡驱动和输入法等安装记录。

    转载请注明作者与出处!谢谢! 最近准备彻底转换到Linux平台,之前一直用的是Red Hat,对Debian不是很熟悉,花了不少时间摸索.下面记录一下安装的过程以便备忘,顺便给他人能做个参考. 我的是 ...

  8. 如何正确入门Windows系统下驱动开发领域?

    [作者]猪头三个人网站 :http://www.x86asm.com/ [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文 ...

  9. 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?

    在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...

随机推荐

  1. Swing 组件焦点设置

    在Swing中,焦点默认是在第一个组件上,所以在项目中想将焦点设置在其他的组件上,如JTextField!但通过requestFocus()方法不起作用,有人提供以下解决方法: 全部初始化之后,jTe ...

  2. Nginx搭建反向代理服务器过程详解(转)

    一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...

  3. WPF学习(2)XAML

    XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是一种声明式的编程语言,遵循XML的语法.WPF使用XAML来设计UI具有易用性.高效性 ...

  4. Python网络02 Python服务器进化

    原文:Python网络02 Python服务器进化 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! **注意,在Python 3. ...

  5. Code digest

    private void travelDir(String filepath) { String threadName = Thread.currentThread().toString(); log ...

  6. Cts框架解析(7)-任务运行的调度室

    TestInvocation /** * {@inheritDoc} */ @Override public void invoke(ITestDevice device, IConfiguratio ...

  7. eclipse 在win7 64两个图标出现位操作系统无法锁定到任务栏或任务栏

    eclipse 在win7 64位操作系统无法锁定到任务栏或者任务栏上出现两个图标 解决的方法 eclipse在win7 64bit下无法锁定到任务栏问题(或是锁定后任务栏出现两个eclipse图标) ...

  8. [SignalR]初步认识以及安装

    原文:[SignalR]初步认识以及安装 1.什么是ASP.NET SignalR? ASP .NET SignalR是一个 ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时 ...

  9. COM-TEAM

  10. sql查询第二大的记录(转)

    问题: 数据库中人表有三个属性,用户(编号,姓名,身高),查询出该身高排名第二的高度.建表语句 create table users ( id ,) primary key, name ), heig ...