DirectX 12公开用于图形(称为“ Direct”),计算或复制任务的命令队列。就提供的功能而言,每一个都是下一个的超集。该规范指出命令队列可以由设备并发执行。但是,API并没有以任何方式限制命令队列的数量(至少我不知道有任何限制)。

显然,不同的供应商处理的情况大不相同:


英特尔在最近的一次演讲(幻灯片23)中指出,目前他们的GPU无法并行处理Graphics&Compute,并且复制引擎的吞吐量很弱。他们建议不要使用多个图形/计算队列。
AMD早在很久以前就开始宣传使用队列/“异步着色器”(从Mantle和当前的gen控制台开始)。还有一些开发人员(示例)通过并行执行计算和图形任务来确认显着的性能提升。
最近有一些关于Nvidia不支持硬件中的异步着色器的大惊小怪的事情:一次使用单独的Graphics和Compute队列似乎会使速度变慢,这表明驱动程序仿真。另一方面,并​​行复制操作已得到CUDA的长期支持,这清楚地表明DMA引擎可以独立工作。

是否有任何方法可以在运行时确定它是否将CommandList提交到多个CommandQueues而不是单个CommandQueues是否有意义? (鉴于前一种情况不涉及太多的工程设计开销)

虽然我可以轻松地看到并行执行与计算/图形操作并行的内存操作有何用处,但令我震惊的是,运行多个操作不必要地复杂并行执行计算和图形处理(除非没有重大的性能优势)。
对我来说,还不清楚这如何能带来更好的性能。除了许多小的连续任务无法产生足够的GPU负载的病理情况外。

评论

除了检查谁制造GPU外,我认为目前没有任何有意义的方法可以做出这种判断。最终,除了“硬件可以同时从多个队列执行命令”之外,还有更多的因素,而D3D12则将这些细节抽象化了。实际上,D3D12甚至不区分可以同时执行队列的硬件和可以顺序执行队列的硬件,文档只说它们的抽象允许并发执行。

好问题 !我还觉得同时获得性能来执行计算和着色会很特别。也许由于使超线程以某种方式更快的相同事实而可能取得收益。当某些单元正忙于其他队列时进行交错操作。就像着色器阻塞了纹理单元一样,计算阶段并没有使用它们,这本身会阻塞FPU或DPU。

嗯太糟糕了。如果没有更多信息,那么也许“除了检查谁制造了GPU外,否”已经算作答案。阅读了所有这些AMD营销知识之后,我很高兴听到我并不孤单。

您知道只是在此问题的重要性(实际上不重要)上加了一些权重。 PS4 SDK有一个错误,该错误不允许发送到除队列0之外的任何其他队列。我认为,如果它是如此重要,它将可以更快地得到解决。

#1 楼

随应用程序一起提供测试实际平台的基准测试序列。 (我想可能会回答许多问题...)

我怀疑性能在很大程度上取决于硬件的使用方式。由于硬件不太可能以某种方式向后检测您的应用程序,并告诉您该怎么做,因此我会选择您设计中看起来不错的东西。


“ ...命令队列可以由设备同时执行...“


关键字是CAN。我看不出有任何供应商会搞砸这个理由。最后,平台提供商(Intel / AMD / Nvidia)负责使您成为一个足够好的驱动程序,以使您不必考虑更换供应商。如果他们确实对此功能有一个“知道的问题”(顺便说一句,它没有功能意义,只有性能),那么他们也应该使用他们所知道的来解决它。我的意思是大声喊叫,回退是他们已经实施的。同步执行。

硬件足以满足我们开发人员的需求。

评论


$ \ begingroup $
AMD的GCN即使在图形队列中同时发布图形和图形时,也将同时执行图形和计算,但通常不会跨多个命令缓冲区(多个绘制调用甚至可能是粗略的)。驱动程序(或应用程序-我认为在DX12或Vulkan中)必须检查数据依赖性,并在需要时在绘制(图形)和调度(计算)之间进行阻塞。如果您具有与图形真正异步的计算(例如下一帧的物理过程),则多个命令队列可能会很有用,但是我对此没有直接的经验。
$ \ endgroup $
–丹尼尔·格塞尔(Daniel M Gessel)
16年5月5日,0:22