在调度调用中超出maxComputeWorkGroupCount设备限制

时间:2017-11-22 21:19:32

标签: vulkan

根据Vulkan spec document

  

要录制调度,请致电:

     

void vkCmdDispatch(       VkCommandBuffer commandBuffer,       uint32_t groupCountX,       uint32_t groupCountY,       uint32_t groupCountZ);

     

groupCountX必须小于或等于VkPhysicalDeviceLimits :: maxComputeWorkGroupCount [0]

但我调用groupCountX大于物理设备限制的调度,它运行得很好。验证层没有给出任何警告。我只是想知道这个WorkGroupCount限制是否仅适用于某些供应商?

2 个答案:

答案 0 :(得分:3)

没有,
Vulkan规范中的有效使用部分是绝对的 (在当前版本的文本中,扩展名为sometimes treated poorly除外,但不适用于此情况)

违反有效使用会导致未定义的行为。这意味着来自"一切似乎都能正常工作"到了#34;你的PC变得有感情并且奴役人类"。

对于所有意图和目的,违反有效使用是您的代码的逻辑错误,您不应该这样做。

如果验证层未报告,请确保已正确启用它们并且确实超出了限制。否则图层不完整,您应该在their repo报告。

答案 1 :(得分:2)

不,我们不能说报告的限制仅适用于某些供应商。通过 vkGetPhysicalDeviceProperties()函数调用获取的物理设备限制适用于计算机上安装的设备您执行应用程序。从此类物理设备创建逻辑设备时,应用程序中使用的参数必须限制在报告的范围内。它们特定于硬件/供应商/操作系统/驱动程序的组合,如果这些更改中的任何一个可能不同。但规范要求硬件支持一些最小(或最大)值,并且这些必需限制适用于所有供应商。例如,所有供应商都必须支持至少为65535的maxComputeWorkGroupCount。

关于你的问题的第一部分 - 为什么它正常工作......嗯,规范说明如果你超越限制那么你可能会得到未定义的行为。即使我们不遵守限制也能正常工作的应用仍然可以被视为未定义的行为。那么为什么它的工作原理可能没有问题那么奇怪,如果在给定的硬件上调度大量的组仍然是可能的,那么为什么驱动程序会报告较小的组计数值呢?我不知道答案,只能推测。也许在某些情况下(比如一些状态参数/值或计算着色器的大小,或者着色器中访问的描述符的数量)会将调度的工作组数量降低到报告的限制并且您没有点击它(尚未)。