假设一个单线程应用程序。如果您调用ExecuteCommandLists两次(A和B)。在启动B的任何命令之前, A是否能保证在 GPU 上执行其所有命令?我在文档中可以找到的最接近的内容是这个,但它似乎并不能真正保证A在B开始之前完成:
应用程序可以从多个线程向任何命令队列提交命令列表。运行时将执行按提交顺序序列化这些请求的工作。
作为比较,我知道Vulkan 中显然无法保证这一点:
vkQueueSubmit 是一个队列提交命令,每个批次由 pSubmits 的一个元素定义为 VkSubmitInfo 结构的实例。批次按照它们在 pSubmits 中出现的顺序开始执行,但可能会乱序完成。
不过,我不确定 DX12 是否也能以同样的方式工作。
弗兰克卢纳的书说:
命令列表从第一个数组元素开始按顺序执行
然而,在这种情况下,他谈论的是使用ExecuteCommandLists两个命令列表(C和D)调用一次。这些操作与两个单独的呼叫相同吗?我的同事认为这仍然只能保证它们按顺序启动,而不能保证C在D开始之前完成。
我缺少的地方有更清晰的文档吗?
我在 Direct X 论坛上问了同样的问题,这是 Microsoft 工程师 Jesse Natalie 的回答:
调用 ExecuteCommandLists 两次可保证第一个工作负载 (A) 在第二个工作负载 (B) 之前完成。使用两个命令列表调用 ExecuteCommandLists 允许驱动程序合并两个命令列表,以便第二个命令列表 (D) 可以在第一个命令列表 (C) 的所有工作完成之前开始执行工作。
具体来说,允许应用程序在 A 和 B 之间插入栅栏信号或等待,而驱动程序对此没有可见性,因此驱动程序必须确保 A 中的所有内容在栅栏操作之前都已完成。在对 API 的单次调用中没有这样的机会,因此驱动程序可以优化该场景。
来源: http ://forums.directxtech.com/index.php?topic=5975.0
| 归档时间: |
|
| 查看次数: |
1530 次 |
| 最近记录: |