MTLBuffer didModifyRange 不需要

问题描述 投票:0回答:1

我认为我的计算机(2013 年底的 macbook,IntelHD4000 显卡)不需要 MTLBuffer 方法 didModifyRange。为什么会这样呢?什么情况下需要?

是不是因为这个GPU使用系统内存,所以CPU和GPU总是同步的?或者有时没有它就可以工作,但一般来说它是必需的?

文档说这是 MTLResourceModeManaged 所必需的。但我已经删除了 didModifyRange 调用,并且在许多情况下没有任何变化。

memory metal mtlbuffer
1个回答
0
投票

托管缓冲区在 Intel、AMD 和 Apple Silicon GPU 上的实现方式不同。 Apple Silicon 和 Intel GPU 使用统一内存,这意味着 CPU 和 GPU 中的

MTLBuffer
的物理内存位置是匹配的。 AMD GPU 的情况并非如此。在 AMD GPU 上(通常在其他独立 GPU 上,其他 API 也有类似的概念),您可以将“托管”缓冲区视为两个独立的内存物理位置,一个用于 CPU,一个用于 GPU。驱动程序负责确保它们是一致的,这意味着根据 API 语义,缓冲区的 GPU 内容的变化对 CPU 是可见的,反之亦然。

回答你的问题,由于英特尔的CPU和GPU的内存物理位置是相同的,因此你没有调用

didModifyRange
这一事实不会影响你的特定情况下的应用程序。由于某些缓存未刷新或类似的原因,仍然可能在某些极端情况下它可能无法工作,但总的来说,它会工作。如果您的计算机配备 AMD GPU,情况就不会如此。如果没有
didModifyRange
,您就看不到 GPU 上的 CPU 变化。

© www.soinside.com 2019 - 2024. All rights reserved.