Vulkan 缓冲区工作组 ID 在大量元素时不返回实际值



为布局输入限定符创建一个带有pow(2, 24)local_size_x = 64的缓冲区将返回WorkGroupID = 262143由于pow(2,24) / 64 - 1,这一切都很好,它是零索引。

但是,如果我们将问题的全局维度/无元素/大小增加到pow(2, 25)假设WorkGroupID将无缘无故地返回值,则它们与数学不匹配。

以下是我认为该设备获得的一些重要限制:

maxStorageBufferRange:          uint32_t = 4294967295
maxComputeSharedMemorySize:     uint32_t = 32768
maxComputeWorkGroupCount:       uint32_t[3] = 00000202898A8EC4
maxComputeWorkGroupCount[0]:    uint32_t = 65535
maxComputeWorkGroupCount[1]:    uint32_t = 65535
maxComputeWorkGroupCount[2]:    uint32_t = 65535
maxComputeWorkGroupInvocations: uint32_t = 1024
maxComputeWorkGroupSize:        uint32_t[3] = 00000202898A8ED4
maxComputeWorkGroupSize[0]:     uint32_t = 1024
maxComputeWorkGroupSize[1]:     uint32_t = 1024
maxComputeWorkGroupSize[2]:     uint32_t = 1024

我不会过分分配设备支持的更多元素。 所以在 2 天 + 16 小时后,我仍然没有弄清楚发生了什么......

WorkGroupSizeWorkGroupIDLocalInvocationIDGlobalInvocationID在我达到n个元素时会出现同样的问题。难怪GlobalInvocationID由于它的计算方式而出现同样的问题......

#version 450
// Size of the Local Work-group is defined trough input layout qualifier
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0) buffer deviceBuffer
{
uint x[];
};

void main() {
uint i = gl_GlobalInvocationID.x;
//uint i = gl_WorkGroupSize.x * gl_WorkGroupID.x * gl_LocalInvocationID.x;

//x[i] += x[i];
// Total No. of Work Items (threads) in Global Dimension
//x[i] = gl_NumWorkGroups.x;
// Size of Work Dimension specified in Input Layout Qualifier
//x[i] = gl_WorkGroupSize.x;
// Is given by Global Dimension / Work Group Size
x[i] = gl_WorkGroupID.x;
//x[i] = gl_LocalInvocationID.x;
}
maxComputeWorkGroupCount[0]: uint32_t = 65535
maxComputeWorkGroupCount[1]: uint32_t = 65535
maxComputeWorkGroupCount[2]: uint32_t = 65535
vkCmdDispatch

的大小为x = pow(2, 25), y = 1, z = 1

根据您提供的信息groupCountX= 225= 33554432,但限制为maxComputeWorkGroupCount[0]= 65535 = 216-1

vkCmdDispatch的Vulkan规范有效用法说:

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

违反有效用法是未定义的行为。"未定义的行为"是指从"一切看似正常"到"你的PC陷入黑洞并摧毁这个太阳系"的任何内容。出于所有意图和目的,违反有效用法是应用程序代码的逻辑错误。

最新更新