dx11底层

 

D3D runtime把shader传输到UMD之前,会做一些验证工作,比如shader代码语法是否正确,设置的sampler数目是否超过最大限制等等。

在UMD中,shader代码最终会被编译成硬件相关的代码,传输到video memory中,shader参数会被传输到video memory中的const buffer中。

现在不论AMD还是NV,都是一套驱动支持不同代的显卡,所以shader代码通常先被编译成IR(中间代码),然后再编译成具体硬件相关的shader汇编语言。

一般是通过UMD中硬件抽象层转化为硬件相关的packet,packet类型主要包括硬件寄存器设置packet,drawcall packet等等,然后把packet写入command buffer(或称作DMA buffer),这些buffer先被拷贝到remote buffer,最终会被传送到gpu端的indirect ring buffer。

根据顶点缓冲和索引缓冲创建时候的格式,顶点缓冲和索引缓冲会被UMD直接放入video memory(设置格式为直接创建在video memory中,类似opengl中的vbo)或者延迟载入(创建在system memory中),在gpu实际读取时候,才传入video memory。

 

 我们知道,纹理图像通常是线性格式,而在gpu中我们通常使用z tile格式,在UMD中我们并不会进行纹理的地址转化,而是根据传入的参数把特定tile mode传入gpu,gpu会根据tile mode进行纹理的swizzle操作。z order 相关知识可以看wiki页http://en.wikipedia.org/wiki/Z-order_curve

纹理swizzle的知识请参考:http://www.cnblogs.com/mikewolf2002/archive/2012/03/11/2390097.html

 

 

现在gpu上常用的video memory是GDDR5,和主机上常用的内存ddr3比起来,它具有带宽高,时延长的特点。下面是core i7 2600和GTX480中内存和显存的比较。

 

Core i7 2600

GTX 480

带宽

19GB/s

180GB/s

时延

140 clocks

400-800 clocks

 

       DRAM芯片通常被组织成2维grid的形式,每个交叉点都是由一个晶体管和电容组成,每个交叉点表示memory一个地址位。比如1G GDDR5显存,它被组织32个GDDR5 块:

 

clip_image002

 

  每个32M的block,包括4个bank 分组,每个bank分组包括16个(或者32)bank。

 

clip_image004

 

每个bank由一个2维grid的DRAM芯片组成:

 

clip_image006

 

    行地址是A0-A11,共4k,列地址A0-A5,共64,所以一个bank内space是256k

 

    通常DRAM是按照行读写的,所以我们要得到好的读写效率,最好一次把一行数据读完。GDDR5的Pagesize通常是2k。

 

 

 

   下面我们看下memory 如何与GPU和 host连接,了解video memory的工作flow:

 

 

       GPU中一些快速的client,比如Depth block,color block,texture block等都是直接和MC连接,而一些数据量不是很大的block,比如command processor(CP)要经过hub,然后再到传到相应的MC(Memory controller)。

 

      在hub中,也许有VM L2, 会进行一些page table的查找,之后请求被路由到相应的MC,MC中主要包括client interface, VM L1, arb等模块。Client infterface会和不同的client打交道,然后把它们传递到VM L1,进行page table的查找,最后进过ARB仲裁,进入到相应的GDDR中。GPU的MC通常都是32bit的,而DDR3的MC通常是64位,我们可以通过下面公式计算得到gpu的memory带宽:mclk * datarate* channelwidth*channel number/8/1000, 简化即为:mclk*4*32*channel number/8/1000, 假设显卡有12 个mc channel,则memory带宽为:1375*4*12*32/8/1000=264GB/s

 

clip_image010

 

      其它的一些PCIE设备和主机,都是通过PCIE总线,然后进入MMU(内存管理单元),再进入hub,这儿MMU是一个总称,在不同实现中,可能MMU包括很多block。

 

     GPU和主机以及其它设备的交互都是通过PCIE总线进行的,GPU和主机之间通常使用PCIE2.0 16 lane(最新的显卡使用PCIE3.0), 上行、下行都达到了8GB/s,其它慢速设备,比如display可能只需要4lane就够了。

 

 

 

 

 

posted @ 2012-09-24 19:34  凌霄神采奕奕  阅读(459)  评论(0编辑  收藏  举报