有多少个直接/计算/复制队列有意义?


11

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

显然,不同的供应商处理此问题非常不同:

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

有什么方法可以在运行时确定将CommandList提交给多个CommandQueue而不是一个CommandQueues是否有意义?(鉴于以前的案例不涉及太多的工程开销)

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


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

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

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

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

Answers:


1

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

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

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

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

对我们开发人员而言,硬件就足够了。


AMD的GCN即使在图形队列中同时发布图形和图形时也将同时执行图形和计算,但通常不会跨多个命令缓冲区(多个绘制调用甚至可能是粗略的)。驱动程序(或应用程序-我认为在DX12或Vulkan中)必须检查数据依赖性,并在需要时在绘制(图形)和调度(计算)之间进行阻塞。如果您具有与图形真正异步的计算(例如下一帧的物理过程),则多个命令队列可能会很有用,但是我对此没有直接的经验。
Daniel M Gessel '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.