Splitting a DMA Buffer(MSDN翻译)

Splitting a DMA Buffer

分割点被VMM用来将KMD提交的大型操作项分割成更小的操作项,使需要执行的GPU资源变少。例如,大的DMA buffer会引用一系列Allocation,而本地显存或共享内存无法满足需求。只有将该操作项分成多个更小的操作项,以降低对GPU资源的需求。 

Note  DMA buffer分割 和 DMA Buffer抢占使两个独立的不同概念。KMD必须支持DMA buffer分割,而DMA buffer抢占可以不支持。在不支持Context 保存和回复的系统中,GPU Scheduler会连续地调度一个DMA buffer的不同分割部分,以确保分割的部分不会与来自不同GPU上下文的另一个DMA buffer交叉。但是Paging buffer应该在一个DMA buffer的不同分割部分之间提交,因为paging操作需要在不同DMA buffer之间进行。每个KMD用来建立Application DMA 流的每个分割点都会被VMM使用。一个被提交的DMA buffer应该在每个分割点之后重新写入足够的GPU状态,用来应付不同分割部分之间被插入Paging buffer的情况。

为了指定分割点,KMD需要为D3DDDI_PATCHLOCATIONLIST中引用的每个Allocation在D3DDDI_PATCHLOCATIONLIST中成员SplitOffset和SlotId指定值。为了跟踪特定DMAbuffer中Allocation的使用情况, VMM用DXGK_DRIVERCAPS结构的MaxAllocationListSlotId成员的值创建数组所需的维度(PS:或者是数组的大小),该结构是KMD通过DxgkDdiQueryAdapterInfo提供。该数组初始化为0,并在Patch-location列表的分割部分项被处理时填充(PS:这样就能知道那些被处理那些未被处理)。patch loction使用的D3DDDI_PATCHLOCATIONLIST的SlotId成员表示必须更新资源表中的哪一行,而SplitOffset成员表示allocation需要分配在DMA buffer中位置偏移。在没有GPU需要访问的资源的情况下DMA buffer能执行到SplitOffset指定的位置。类似的,如果新的patch-location分割部分项引用了同样的SlotId,之前的allocation会被新的allocation替代并且之前的allocation不在被使用(即能够被page-out)

当DMA buffer需要page in资源时,VMM会从头到尾处理patch-location list中每个元素。驱动填充的 D3DDDI_PATCHLOCATIONLIST结构SplitOffset成员必须有值;这些元素严格递增(即allocation出现顺序和在DMA buffer流中使用顺序一致)。VMM 按patch-location list 指定的顺序page in 在patch-location中引用的资源。的资源。VMM执行到因为内存低而无法page in allocation时;VMM会提交当前部分的DMA buffer给GPU scheduler准备执行。DMA buffer从上一个分割点开始执行到不能被page in的allocation所指定到的SplitOffset值的位置。一旦提交,VMM将使用resource table决定当前分割点偏移处所需要的allocation列表。resource table中所有的Allocation 保持在当前的物理位置,其他不在使用的allocation可能被evict。VMM会继续处理patch-location list,仍然会可能被分割多次。

驱动应该在每次allocation绑定或未绑定时(bound or unbound)指定分割点。为了指定allocation未绑定,驱动能够给DXGK_ALLOCATIONLIST中fhDeviceSpecificAllocation指定一个NULL句柄,以及给关联的D3DDDI_PATCHLOCATIONLIST中SlotId指定一个合适的值。驱动应该取消绑定大型资源以增加VMM能解决复杂的内存布局的问题的机会。

类似的,驱动应该在每个分割点reprogram大型资源。当使用分割点时,VMM会强制将之前bound的allocation给以前的allocation(PS:不理解具体的意思。有可能是指绑定的allocation不会被释放,从而不能将该内存重复利用)。这会产生内存碎片,能够导致VMM不能解决复杂的内存布局问题,而如果没有之前绑定的allocation的限制这些问题就能够解决。当计算分割点状态时,VMM会确定哪个Slot Id在这个分割点被reprogram(即,同一个patch-location list中每个的元素共享同样的SplitOffset值),并且忽略这个分割点的布局限制。例如,如果驱动使用64MB的texture,会在每个分割点reprogram这个texture,使VMM能够在分割点之间在内存中移动这个texture。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值