Vulkan中的gl_GlobalInvocationID, local_size_x的理解

最近在学习Vulkan,结果在查看示例代码的时候,对于如下两句出现了疑问:

首先是Invocation这个单词的理解,计算机语言中他的意思是 "the act of making a particular function start" ,中文意思是 "调用,启用"。

其中

意思是初始化,X * Y * Z 个计算单元供我们的代码调用,可以简单理解成线程数。如果不设置这几个值,默认值是 1,也就是只提供一个计算单元(线程)。

而使用如下的代码

意思是获取当前代码运行的计算单元的编号,也可以理解成获取当前线程的索引。

下面的代码都使用如下的命令编译成Vulkan使用的SPIR-V格式的代码

比如下面的代码,就是一个简单的利用gl_GlobalInvocationID,进行并行计算的例子:

但是,如果传入的数组的大小超过我们设置的计算单元的数量的情况,上述的代码是处理不了的。

可以如下方式处理上述情况:

如果想动态调整计算单元的数量,增加处理灵活性,可以参考下面的代码:

外部通过

函数调用的时候,指定

参数中的

参数中的

参数中的

指定的数值来动态调整所需要的计算单元的数量。

整个参数的设置流程特别长,非常难掌握。具体的使用例子参考 Glavnokoman/vuh以及 Vulkan® 1.0.95 - A Specification - Khronos Group文档中的上述参数的使用例子。

如果内部不指定,也可以通过外部调用

的时候设置,但是这样的设置存在一定的灵活性问题,可能需要多个独立的ComputePipeline来配合。

具体信息,可以参考下图:

相关介绍,请参考 Compute Shader。网页如果打不开,可以点击下图,查看详细内容:

参考链接


发布者

《Vulkan中的gl_GlobalInvocationID, local_size_x的理解》上有4条评论

  1. 那个图片上的 WorkGroup ID 和 LocalInvocationID 都写错了吧,跟图片不一致,应该是(2,1,0)和(1,1,0)

  2. 大佬,我用的是 localsizeid 的写法,但 Vulkan 似乎一直认为我没传 spec


    warning(Vulkan): [Perf] Validation Performance Warning: [ UNASSIGNED-BestPractices-LocalWorkgroup-Multiple64 ] | MessageID = 0xc064ba5c | vkCreateComputePipelines(): pCreateInfos[0] [AMD] compute shader with work group dimensions (1, 1, 1), workgroup size (1), is not a multiple of 64. Make the workgroup size a multiple
    of 64 to obtain best performance across all AMD GPU generations.

    你有遇到这种情况吗

    1. 这个是个性能警告,说是给出的数据是 1*1*1 的矩阵,而您所使用的 AMD GPU 可以一次性处理 64 (4*4*4) 的矩阵,这样的方式可以使用,但是有些浪费硬件算力

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注