调度调用中超过 maxComputeWorkGroupCount 设备限制
Exceed maxComputeWorkGroupCount device limitation in dispatch call
根据 Vulkan spec document :
To record a dispatch, call:
void vkCmdDispatch(
VkCommandBuffer commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ);
groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]
但是我使用大于物理设备限制的 groupCountX 调用调度,它工作得很好。并且验证层没有给出任何警告。我只是想知道此 WorkGroupCount 限制是否仅适用于某些供应商?
不,我们不能说报告的限制仅适用于某些供应商。通过 vkGetPhysicalDeviceProperties() 函数调用获得的物理设备限制适用于安装在您执行应用程序的计算机上的设备。当您从此类物理设备创建逻辑设备时,您的应用程序中使用的参数必须限制在报告的范围内。它们特定于 hardware/vendor/operating system/driver 的组合,并且如果这些更改中的任何一个可能会有所不同。但是该规范要求硬件支持一些最小(或最大)值,并且这些要求的限制适用于所有供应商。例如,所有供应商必须支持至少为 65535 的 maxComputeWorkGroupCount。
至于你的问题的第一部分 - 为什么它能正常工作......好吧,规范规定如果你超出限制那么你可能会得到未定义的行为。即使我们不遵守这些限制,仍能正常工作的应用程序仍然可以被视为未定义的行为。那么为什么它起作用可能不像问题那么奇怪如果在给定的硬件上仍然可以分派更多的组,那么为什么驱动程序报告更小的组计数值?我不知道答案,只能推测。也许在某些情况下(例如某些状态 parameters/values 或计算着色器的大小,或着色器中访问的描述符的数量)将分派的工作组数量降低到报告的限制,而你只是没有达到它(还)。
没有,
Vulkan 规范中的有效使用部分是绝对的。
(除了扩展名在文本的当前版本中是 sometimes treated poorly,但这不适用于这种情况)
违反有效用法会导致未定义的行为。这意味着从 "everything appears to work normally" 到 "your PC becomes sentient and enslaves humanity".
的任何内容
出于所有意图和目的,违反有效用法是您代码的逻辑错误,您永远不应该这样做。
如果验证层没有报告,请确保您已正确启用它们并且确实超出了限制。否则图层不完整,您应该在 their repo.
报告
根据 Vulkan spec document :
To record a dispatch, call:
void vkCmdDispatch( VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]
但是我使用大于物理设备限制的 groupCountX 调用调度,它工作得很好。并且验证层没有给出任何警告。我只是想知道此 WorkGroupCount 限制是否仅适用于某些供应商?
不,我们不能说报告的限制仅适用于某些供应商。通过 vkGetPhysicalDeviceProperties() 函数调用获得的物理设备限制适用于安装在您执行应用程序的计算机上的设备。当您从此类物理设备创建逻辑设备时,您的应用程序中使用的参数必须限制在报告的范围内。它们特定于 hardware/vendor/operating system/driver 的组合,并且如果这些更改中的任何一个可能会有所不同。但是该规范要求硬件支持一些最小(或最大)值,并且这些要求的限制适用于所有供应商。例如,所有供应商必须支持至少为 65535 的 maxComputeWorkGroupCount。
至于你的问题的第一部分 - 为什么它能正常工作......好吧,规范规定如果你超出限制那么你可能会得到未定义的行为。即使我们不遵守这些限制,仍能正常工作的应用程序仍然可以被视为未定义的行为。那么为什么它起作用可能不像问题那么奇怪如果在给定的硬件上仍然可以分派更多的组,那么为什么驱动程序报告更小的组计数值?我不知道答案,只能推测。也许在某些情况下(例如某些状态 parameters/values 或计算着色器的大小,或着色器中访问的描述符的数量)将分派的工作组数量降低到报告的限制,而你只是没有达到它(还)。
没有,
Vulkan 规范中的有效使用部分是绝对的。
(除了扩展名在文本的当前版本中是 sometimes treated poorly,但这不适用于这种情况)
违反有效用法会导致未定义的行为。这意味着从 "everything appears to work normally" 到 "your PC becomes sentient and enslaves humanity".
的任何内容出于所有意图和目的,违反有效用法是您代码的逻辑错误,您永远不应该这样做。
如果验证层没有报告,请确保您已正确启用它们并且确实超出了限制。否则图层不完整,您应该在 their repo.
报告