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来配合。

继续阅读Vulkan中的gl_GlobalInvocationID, local_size_x的理解