Vulkan是否支持子组本地内存共享与操作?有无等价OpenCL __local、CUDA __shared__的功能?
Vulkan 存在与 OpenCL __local、CUDA __shared__完全对等的工作组共享内存功能,在不同的着色器语言中有对应的声明关键字:
- 使用 GLSL 编写 Vulkan 着色器时,对应关键字为
shared - 使用 HLSL 编写 Vulkan 着色器时,对应关键字为
groupshared
该内存区域的生命周期和工作组绑定,同一工作组内的所有着色器调用都可以读写这片低延迟的片上内存,和你熟悉的 OpenCL/CUDA 共享内存逻辑完全一致。
初始化与使用方法
共享内存本身没有专属的初始化API,你可以根据业务需求自行实现初始化逻辑:
固定大小的共享内存直接声明即可,示例:
// 声明长度为64的32位浮点型共享数组 shared float local_cache[64];声明后可以指定工作组内特定的调用(比如本地索引为0的调用)写入初始值,再调用
groupMemoryBarrier()执行工作组内存屏障,确保初始值写入对所有工作组可见后再进行后续操作。如果你需要使用动态大小的共享内存,只需要将数组声明为未指定长度的共享数组,示例:
shared uint dynamic_shared_buf[];对应长度在CPU侧调度计算任务或者创建管线时指定即可。
子组相关说明
你提到的子组教程中提到的shared memory就是上述工作组共享内存。Vulkan 标准目前没有提供仅对子组可见的专属共享内存,如果需要子组范围内的共享数据,可以直接通过子组广播、子组洗牌等内置函数传递,也可以在工作组共享内存中为每个子组划分专属的存储区域使用。
内容的提问来源于stack exchange,提问作者alagris
相关产品推荐
相关产品推荐

