也许这个夏天会写一些东西,这里先说说我做过些什么,知道些什么。
过去的五年里,先后在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. 如何使用autolayout的UIView加入动画

    hi,all: 在经过了一番犹豫之后,我决定将我自己做的这个小APP的源代码发布给大家: 其出发点是和大家一起学习iOS开发,仅供学习參考之用. 之前代码是托管与gitlab 上的.今天我将其pull ...

  2. MEF初体验之八:过滤目录

    当在使用子容器的时候,基于某些具体标准来过滤目录可能是重要的.例如,基于部件的创建策略来过滤是很常见的.下面的代码片段演示了如何构建这种特别方法: var catalog = new Assembly ...

  3. VS公布 错 到文件失败 复制到

    他自己和构建网站 ASP.MVC4 最近更改写功能 自此从未公布 已经报道 错 15 到文件失败 easyui\themes\gray\images\Thumbs.db  拷贝到 obj\Releas ...

  4. poj 1185 火炮 (减少国家DP)

    火炮 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19690   Accepted: 7602 Description 司 ...

  5. 二十9天 月出冲击黑鸟 —Spring的AOP_AspectJ @annotation

    6月14日,阴转雨. "四面垂杨十里荷,向云何处最花多, 画楼南畔夕阳和.天气乍凉人寂寞, 光阴须得酒消磨,且来花里听笙歌." 面向切面的框架AspectJ邂逅Spring,不仅造 ...

  6. 安装、设置与启动MySql绿色版的方法

    原文:安装.设置与启动MySql绿色版的方法 1.解压 mysql-noinstall-5.1.30-win32.zip(下载地址http://dev.mysql.com/downloads/mysq ...

  7. 霸气侧漏HTML5--之--canvas(1) api + 弹球例子

    html5也许最有吸引力的新功能是canvas 漆.基本可以足够强大后,以取代flash页面的效果.下面来介绍canvas要使用: HTML5 Canvas的基本图形都是以路径为基础的.通常使用Con ...

  8. HDU 1505 Largest Rectangle in a Histogram && HDU 1506 City Game(动态规划)

    1506意甲冠军:给你一个连续的直方图(拼贴底部长度1).求连续基质区. 对每一个直方图,分别向左向右进行扩展. #include<cstdio> #include<stdlib.h ...

  9. CODE - TSQL convert Query to JSON

    原文 ODE - TSQL convert Query to JSON TSQL - Query to JSON It is my philosophy that good development s ...

  10. iOS6和iOS7适应代码(6) —— NSLocalizedString

    我们的应用程序都需要国际化,字符串的重要组成部分.一般来说.我们是通过一个string资源文件来达到这个目的,我们需要支持多国语言,有多少次把这个文档本地化.需要使用的代码NSLocalizedStr ...