Vulkan 是否支持着色器中的原子浮点操作?

Are atomic float operations in shaders supported with Vulkan?

对于 OpenGL,存在 Nvidia 扩展 NV_shader_atomic_float [1],它支持原子读取-修改-写入操作,以在 GLSL 着色器中使用浮点组件缓冲或纹理内存。

Vulkan 是否也存在此功能?我找不到有关启用该功能的任何扩展的信息。该功能不是通过 Vulkan 扩展提供的吗?

[1] https://www.khronos.org/registry/OpenGL/extensions/NV/NV_shader_atomic_float.txt

不,没有提供原子浮点运算的 Vulkan 扩展(还没有?)。如果 Nvidia 看到足够的开发人员需求,他们可能会创建这样的扩展。

SPIR-V 支持浮点类型的原子指令,但包含这些指令的 SPIR-V 模块目前被 Vulkan's SPIR-V environment spec 禁止:

Atomic instructions must declare a scalar 32-bit integer type, or a scalar 64-bit integer type if the Int64Atomics capability is enabled, for the value pointed to by Pointer.

这里是:VK_EXT_shader_atomic_float
该扩展已由 NVIDIA 于 2020 年 7 月添加,并与所有 Vulkan 版本兼容。

引用规范。描述:

This extension allows a shader to contain floating-point atomic operations on buffer, workgroup, and image memory. It also advertises the SPIR-V AtomicFloat32AddEXT and AtomicFloat64AddEXT capabilities that allows atomic addition on floating-points numbers. The supported operations include OpAtomicFAddEXT, OpAtomicExchange, OpAtomicLoad and OpAtomicStore.

gpuinfo.org 上已经有一些条目表明支持该扩展。需要 NVIDIA 驱动程序 451.79.0.0 或更高版本等苹果设备。