Vulkan 的新扩展 VK_KHR_vulkan_memory_model 的目的是什么?

What is the purpose of Vulkan's new extension VK_KHR_vulkan_memory_model?

Khronos 刚刚发布了他们新的内存模型扩展,但还没有进行非正式讨论、示例实现等,所以我对基本细节感到困惑。

https://www.khronos.org/blog/vulkan-has-just-become-the-worlds-first-graphics-api-with-a-formal-memory-model.-so-what-is-a-memory-model-and-why-should-i-care

https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#memory-model

这些新扩展试图解决什么问题?他们是在尝试在语言级别解决同步问题(比如删除 C++ 代码中繁琐的互斥体),还是一组新的复杂功能让您更好地控制 GPU 如何在内部处理同步?

(推测性问题)在一般情况下学习和合并这个新模型是个好主意,还是这个模型只适用于某些多线程模式并可能增加开销?

除其他外,它为 C++ here 描述的原子操作提供了相同类型的细粒度内存排序保证。我敢说很多,甚至可能是大多数 PC C++ 开发人员对此并不太了解,因为 x86 架构基本上使内存排序变得多余。

但是,GPU 不是 x86 架构,在 GPU 着色器内核上大规模并行执行的计算操作可能可以,并且在某些情况下必须使用显式排序保证在针对共享数据集。

This video 很好地介绍了适用于 C++ 的原子和顺序。

大多数开发人员不需要详细了解内存模型或使用扩展。就像大多数 C++ 开发人员不需要非常熟悉 C++ 内存模型一样(这不仅仅是因为 x86,这是因为大多数程序除了适当地使用标准库互斥之外不需要任何东西)。

但是内存模型允许以更少的歧义指定 Vulkan 的内存一致性和同步原语——在某些情况下,还可以更加清晰和一致。在大多数情况下,定义实际上并没有改变:之前没有数据竞争的代码将继续没有数据竞争。对于一些进行高级或细粒度同步的开发人员来说,额外的精度和清晰度使他们能够确切地知道如何在不使用昂贵的过于强大的同步的情况下使他们的程序无数据争用。

最后,在构建模型的过程中,小组发现了一些以前设计不当或损坏的东西(其中许多都回到了 OpenGL 中)。他们现在已经能够准确地说出这些东西的作用,无论它们是否仍然有用,并构建能够实现实际预期目的的替代品。

扩展宣称这些更改是可用的,但更重要的是,一旦扩展是最终的而不是临时的,这将意味着该实现已经过验证以实际符合内存模型。