首页 > 解决方案 > CPU 和 GPU 之间共享的 iOS 内存以及这对读取意味着什么

问题描述

我有一个 MTLBuffer 正在使用由 cpu 分配的内存,因此由 cpu 和 GPU 共享。

根据 Apple 的建议,我正在使用三重缓冲来消除一个处理器等待另一个处理器完成可能导致的延迟。

我的顶点数据每帧都会改变,所以每一帧我都用 CPU 写入数组的一个部分,并用 GPU 读取不同的部分。

我想做的是读取 GPU 当前也在读取的一些值,因为它们节省了我一些时间来计算 CPU 正在写入的缓冲区部分。

本质上这是因为当前帧的数据依赖于先前帧的数据。

这是有效的吗?由于内存在 iOS 上共享,CPU 和 GPU 是否可以同时读取同一部分内存?

标签: iosmemorygpucpumetal

解决方案


我认为这是有效且安全的,原因有两个。首先,CPU 实际上通常必须先读取才能写入。像缓存和内存总线这样的东西不允许以我们通常认为的粒度(字节甚至寄存器大小)访问 RAM。为了写入,它通常必须从内存中读取更大的块,只修改写入的部分,然后(最终)将更大的块写回内存。因此,即使您没有从 GPU 正在读取的部分缓冲区中显式读取,而您只写入 GPU 未访问的部分,理论上仍然可以从缓冲区的部分中隐式读取GPU 正在读取。由于我们没有得到可靠地避免这种情况所需的信息,我会说这不被认为是一个问题。

其次,没有警告您在 Apple 文档中描述的内容。关于资源对象的文章中有“维护 CPU 和 GPU 内存之间的一致性”部分。这仅讨论了 CPU 或 GPU 正在修改共享数据的情况,而不是两者都只是读取的情况。

然后是“资源存储模式和设备内存模型”部分,描述了 iOS 9 和 macOS 10.11 引入的新存储模式。以及自己的文档MTLResourceStorageModeShared。同样,这里提到了阅读与写作,但没有提到阅读与阅读。

如果同步阅读有问题,我想苹果会讨论的。


推荐阅读