也许这个夏天会写一些东西,这里先说说我做过些什么,知道些什么。
过去的五年里,先后在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. CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

    JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...

  2. httpclient 文件上传

    /**      * 上传文件      */     public static Boolean  uploadFile(String fileName, String url) {         ...

  3. 如何嗅闻交换网络和ARP骗子-ARP解释的原则

    在嗅探以太网(一般指嗅探器可以对流经的网络数据包窃听)(sniff)不为网络安全是好事,虽然网络管理员能够跟踪数据包,发现 互联网问题,但前提是,如果破坏者使用.在整个网络带来了严重的安全威胁. 至于 ...

  4. c语言实现hashtable,相似C++的map和iOS的NSDictionary

    跟线性数组和链表不同.HashTable是高速查找的数据结构.本文中的HashTable使用链表处理数组. 该HashTable能够指定table的长度.提供了遍历的方法. 包含table的长度的选择 ...

  5. HDU 5059 Help him(细节)

    HDU 5059 Help him 题目链接 直接用字符串去比較就可以,先推断原数字正确不对,然后写一个推断函数,注意细节,然后注意判掉空串情况 代码: #include <cstdio> ...

  6. Android文本Flood it游戏源代码

    flood_it 流行的Flood it游戏的Android版 游戏玩法: 按下屏幕下方的颜色button,左上角的色块就会变颜色.仅仅要把整片色块变成同色就赢了. 效果图 <ignore_js ...

  7. teamfoundationserver2010之使用vs2010&&vs2013创建修改签入签出提交代码等操作

    好久之前就在个人的电脑上装了vs2013,看到原生支持html5和css3,前端开发还是挺不错的 而公司开发一直用着vs2010,真是羡慕嫉妒恨啊... 于是乎就有了今天的测试 使用工具 teamfo ...

  8. JAVA该队列中的数组,圆阵队列,链队列

    /** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...

  9. C++几个小函数

    之前看书,遇到几个编程题,要实现一些库自带的函数.于是动手写了写,并且做了一些测试.今晚在测试的时候,还发现了一些其他内存分配的问题,顺路一起记下.这里只写了字符串转整型,字符串赋值函数. #incl ...

  10. Gradle 2.0用户手册——总览(译)(转)

    2.1 特性 本章将介绍一系列Gradle的特性. 申明式构建和基于约定的构建 Gradle的核心是基于Groovy呈现了一种丰富的针对特定领域的语言,称之为Domain Specific Langu ...