一次 Dispatch 调用的每个维度最多可以有 65535 个线程组

There can be at most 65535 Thread Groups in each dimension of a Dispatch call

我有一个 DirectCompute 应用程序对图像进行计算(例如计算平均像素值、应用过滤器等等)。对于某些计算,我只是将图像视为整数数组并像这样调度计算机着色器:

FImmediateContext.Dispatch(PixelCount, 1, 1);

结果完全符合预期,计算正确。尽管如此,在运行时,我在调试日志中看到以下消息:

D3D11 ERROR: ID3D11DeviceContext::Dispatch: There can be at most 65535 Thread Groups in each dimension of a Dispatch call.  One of the following is too high: ThreadGroupCountX (3762013), ThreadGroupCountY (1), ThreadGroupCountZ (1) [ EXECUTION ERROR #2097390: DEVICE_DISPATCH_THREADGROUPCOUNT_OVERFLOW]

此错误仅显示在调试日志中,其他一切都是正确的,包括计算结果。这让我想到 GPU 以某种方式管理着非常大的线程组,可能将其分解为按顺序执行的较小的组。

我的问题是:我应该关心这个错误还是可以保留它并让 GPU 为我完成工作?

谢谢。

如果您只关心它在您的特定硬件和驱动程序上的工作情况,那很好。如果您关心它是否适用于所有 Direct3D Feature Level 11.0 卡,那么它就不好,因为不能保证它适用于任何其他驱动程序或设备。

有关 DirectCompute 限制的详细信息,请参阅 Microsoft Docs

If you care about robust behavior, it's important to test DirectCompute applications across a selection of cards & drivers. The same is true of basically any use of DirectX 12. Much of the correctness behavior is left up to the application code.