Using Vulkan -- Atomics

张开发
2026/4/5 1:48:42 15 分钟阅读

分享文章

Using Vulkan -- Atomics
原子操作的类型变体想要更好地理解各类相关扩展首先需要了解 Vulkan 提供的不同原子操作类型主要分为以下维度数据类型floatint位宽16 bit32 bit64 bit操作类型加载loads存储stores交换exchange加法add最小值min最大值max其他操作etc.存储类StorageBuffer或Uniform缓冲区Workgroup共享内存Image普通图像或稀疏图像基础支持在 Vulkan 1.0 且未启用任何扩展的情况下应用程序仅可使用32 位整型32-bit int进行原子操作该类型支持所有受支持的 SPIR-V 原子操作加载、存储、交换等。SPIR-V 中部分原子操作受Kernel能力限制目前在 Vulkan 中暂不被允许使用。原子计数器尽管 GLSL 和 SPIR-V 均支持原子计数器的使用但 Vulkan 并未开放使用AtomicCounter存储类所需的AtomicStorageSPIR-V 能力。官方建议应用程序可通过对数值1调用OpAtomicIAdd和OpAtomicISub指令实现原子计数器的同等效果。扩展原子操作支持目前可扩展原子操作支持的相关扩展如下VK_KHR_shader_atomic_int64VK_EXT_shader_image_atomic_int64VK_EXT_shader_atomic_floatVK_EXT_shader_atomic_float2下文将对各扩展进行详细说明。VK_KHR_shader_atomic_int64Promoted to core in Vulkan 1.2GLSL - GL_EXT_shader_atomic_int64此扩展允许在缓冲区和共享内存中执行64 位整型64-bit int原子操作。若声明了Int64AtomicsSPIR-V 能力所有受支持的 SPIR-V 操作均可用于 64 位整型。可通过两个特性位查询 64 位整型原子操作支持的存储类shaderBufferInt64Atomics- 缓冲区shaderSharedInt64Atomics- 共享内存若使用 Vulkan 1.2 及以上版本或设备暴露了该扩展则必然支持shaderBufferInt64Atomics特性。VK_EXT_shader_image_atomic_int64SPV_EXT_shader_image_int64GLSL_EXT_shader_image_int64此扩展允许在普通图像和稀疏图像中执行64 位整型64-bit int原子操作。若同时声明了Int64Atomics和Int64ImageEXTSPIR-V 能力所有受支持的 SPIR-V 操作均可用于图像的 64 位整型原子操作。普通图像与稀疏图像的支持差异该扩展暴露了shaderImageInt64Atomics和sparseImageInt64Atomics两个特性位其中sparseImage*系列特性位为附加特性位仅在shaderImage*特性位启用的前提下才可使用。部分硬件对稀疏资源图像执行原子操作的效率较低因此官方将该原子特性拆分使稀疏图像的原子操作成为实现可选择性暴露的附加特性。VK_EXT_shader_atomic_floatSPV_EXT_shader_atomic_float_addGLSL_EXT_shader_atomic_float此扩展允许在缓冲区、共享内存、普通图像和稀疏图像中执行浮点型float原子操作仅该扩展为浮点类型开放了子集原子操作的支持。该扩展定义了多个特性位可按照*Float*Atomics和*Float*AtomicAdd两类进行分组*Float*Atomics系列特性允许对浮点类型执行OpAtomicStore、OpAtomicLoad和OpAtomicExchange操作。注意OpAtomicCompareExchange比较交换操作未被包含在内因 SPIR-V 规范仅允许该操作作用于整型。*Float*AtomicAdd系列特性允许使用两个扩展的 SPIR-V 操作指令 ——AtomicFloat32AddEXT和AtomicFloat64AddEXT。其余特性位可按32 位浮点和64 位浮点的支持范围进一步划分32 位浮点32-bit float支持shaderBufferFloat32*- 缓冲区shaderSharedFloat32*- 共享内存shaderImageFloat32*- 普通图像sparseImageFloat32*- 稀疏图像64 位浮点64-bit float支持shaderBufferFloat64*- 缓冲区shaderSharedFloat64*- 共享内存OpenGLES 的 OES_shader_image_atomic 扩展允许在r32f格式图像上通过imageAtomicExchange执行原子操作。若要将相关代码移植到 Vulkan应用程序需检查设备是否支持shaderImageFloat32Atomics特性以实现同等功能。VK_EXT_shader_atomic_float2SPV_EXT_shader_atomic_float_min_maxSPV_EXT_shader_atomic_float16_addGLSL_EXT_shader_atomic_float此扩展为VK_EXT_shader_atomic_float补充了两类此前缺失的特性支持第一类16 位浮点型原子操作支持在缓冲区和共享内存中新增16 位浮点16-bit floats原子操作支持使用方式与VK_EXT_shader_atomic_float中的浮点操作一致shaderBufferFloat16*- 缓冲区shaderSharedFloat16*- 共享内存第二类浮点型的最小 / 最大值原子操作支持新增浮点类型的最小值min和最大值max原子操作支持对应指令为OpAtomicFMinEXT和OpAtomicFMaxEXT不同位宽的支持特性位如下16 位浮点需声明AtomicFloat16MinMaxEXT能力shaderBufferFloat16AtomicMinMax- 缓冲区shaderSharedFloat16AtomicMinMax- 共享内存32 位浮点需声明AtomicFloat32MinMaxEXT能力shaderBufferFloat32AtomicMinMax- 缓冲区shaderSharedFloat32AtomicMinMax- 共享内存shaderImageFloat32AtomicMinMax- 普通图像sparseImageFloat32AtomicMinMax- 稀疏图像64 位浮点需声明AtomicFloat64MinMaxEXT能力shaderBufferFloat64AtomicMinMax- 缓冲区shaderSharedFloat64AtomicMinMax- 共享内存

更多文章