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
好问题 !我也觉得同时获得性能来执行计算和着色会很特别。也许由于使超线程以某种方式更快的相同事实而可能取得收益。当某些单元正忙于其他队列时进行交错操作。例如着色器阻塞了纹理单元,而计算级却没有使用它们,这本身会阻塞FPU或DPU。
—
v.oddou
嗯太糟糕了。如果没有更多信息,那么也许“除了检查谁制造了GPU外,否”已经算作答案。阅读了所有这些AMD营销资料之后,我很高兴听到我并不孤单。
—
Wumpf
您知道只是在这个问题的重要性(实际上是不重要的)上加了一些重量。PS4 SDK有一个错误,该错误不允许发送到除队列0之外的任何其他队列。我认为,如果它是如此关键,它将可以更快地得到解决。
—
v.oddou