【问题标题】:Are atomic float operations in shaders supported with Vulkan?Vulkan 是否支持着色器中的原子浮点操作?
【发布时间】:2019-05-07 06:18:45
【问题描述】:

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

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

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

【问题讨论】:

  • 原子作为核心规范的一部分被支持。请参阅khronos.org/registry/vulkan/specs/1.1/html/vkspec.html(搜索“原子”)并参阅github.com/KhronosGroup/GLSL/blob/master/extensions/khr/…(搜索“原子映射”)以了解 GLSL 着色器语言中的 Vulkan 细节。
  • 感谢您的链接。但是,我不清楚是否也支持原子 floats。如果我没记错的话,OpenGL 中有原生 atomic int 支持。但是 Vulkan 呢 - 原生支持是否也仅限于 atomic int 还是原生支持 atomic float?如果是这样,那是否也意味着所有支持 Vulkan 的设备都必须支持原子浮点数?我找不到任何明确的说法。

标签: glsl nvidia vulkan


【解决方案1】:

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

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

原子指令必须Pointer。

【讨论】:

  • 您确定 Vulkan 不支持原子浮点操作吗? Vulkan 官方规范中对原子的描述如何?它没有说明任何地方都支持原子浮点数,但也没有说明它们也不支持。
  • 如果规范没有明确声明支持某些东西,那么可以安全地假设它不支持。
  • Vulkan SPIR-V 环境规范禁止它:“对于指向的值,原子指令必须声明一个标量 32 位整数类型,或者如果启用了 Int64Atomics 功能,则必须声明一个标量 64 位整数类型通过指针。”需要延期才能放松这一点。
【解决方案2】:

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

引用规范。说明:

此扩展允许着色器在缓冲区、工作组和图像内存上包含浮点原子操作。它还宣传了允许对浮点数进行原子加法的 SPIR-V AtomicFloat32AddEXT 和 AtomicFloat64AddEXT 功能。支持的操作包括 OpAtomicFAddEXT、OpAtomicExchange、OpAtomicLoad 和 OpAtomicStore。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多