也许这个夏天会写一些东西,这里先说说我做过些什么,知道些什么。
过去的五年里,先后在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. Android属于查询执行情况的电话号码

    这部分是昨天学习,但是因为眼所以现在到眼睛超负荷,以后要合理规划时间. 现在里面的手机号码归属地查询主要通过两种途径:1.网络查询.2.匹配本地归属地数据库. 我认为最好的两个方法的结合,在进行联网查 ...

  2. Web层的搭建

    Web层的搭建 前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DD ...

  3. [WebGL入门]四,渲染准备

    注意:文章翻译http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家 ...

  4. XCL-Charts画一个图(CurveChart)

    情节线图与往常不同的是,它是一个比较特殊线位置计算.所以我得到一个单独的类.相同.只需要输入数据源的基类, 加,控制要添加的.你可以画出你自己主动设置按照预期的效果. 代码: //图基类 chart ...

  5. bootstrap+jQuery.validate

    bootstrap+jQuery.validate表单校验   谈谈表单校验 这大概是一种惯例,学习前台后台最开始接触的业务都是用户注册和登录.现在社会坚持以人为本的理念,在网站开发过程同样如此.Us ...

  6. MySQL之终端(Terminal)管理MySQL

    原文:MySQL之终端(Terminal)管理MySQL 前言:MySQL有很多的可视化管理工具,比如“mysql-workbench”和“sequel-pro-”. 现在我写MySQL的终端命令操作 ...

  7. Cocos2d-x 2.2.3 Android配置

    今天总结出来的部署流程,已经成功把自己的项目编译到android真机上.省去了安装ndk等步骤 环境: win7 64位 1.导入项目到eclipse 2.导入libcocos2dx 样例:C:\co ...

  8. Qt原始资源形象问题后删除

        这些天Qt请项目超市收银系统,作为练一练手,无论如何,亦休闲亦无关,做几乎同样的.旨在取代以前的资源图片, 是什么改变了,码里面的路径都改了.还是编译只是去,总是提示这样一个错误. <s ...

  9. (大数据工程师学习路径)第三步 Git Community Book----Git基本用法(上)

    一.git的初始化 1.Git 配置 使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名. $ git config --global user.name &quo ...

  10. ArrayList实现根据某属性大小相间排序

    Java本身提供了一个集合的帮助类java.util.Collections,提供了对集合操作一些方法,借助于此类提供的sort方法可以实现对List进行排序操作 import java.util.A ...