我有一个MTLBuffer,它使用的是由CPU分配的内存,因此由CPU和GPU共享。
按照Apple的建议,我正在使用三重缓冲来消除可能由于一个处理器等待另一处理器完成而引起的延迟。
我的顶点数据每帧都会发生变化,因此我使用CPU将每一帧写入阵列的一部分,并使用GPU读取另一部分。
我想做的是读取一些GPU当前正在读取的值,因为它们为我节省了一些时间来计算CPU正在写入的缓冲区部分。
从本质上讲,这是因为当前帧的数据取决于先前的帧数据。
这有效吗?由于内存是在iOS上共享的,因此CPU和GPU可以一次读取同一部分内存吗?
答案 0 :(得分:3)
我认为这是有效和安全的,有两个原因。首先,CPU实际上通常必须先读取才能写入。诸如高速缓存和内存总线之类的东西不允许以我们通常想到的粒度(字节甚至寄存器大小)访问RAM。为了进行写入,通常必须从内存中读取较大的块,仅修改已写入的部分,然后(最终)将较大的块写回到内存中。因此,即使从理论上讲,即使您不显式地从GPU正在读取的部分缓冲区中读取内容,而仅写入GPU未访问的部分,该方法仍然可以隐式地从缓冲区的某些部分读取内容GPU正在读取。由于没有提供信息,因此我们需要可靠地避免这种情况,因此我认为这不是问题。
第二,没有警告您在Apple文档中所描述的内容。有关资源对象的文章中有the "Maintaining Coherency Between CPU and GPU Memory" section。那只是讨论了CPU或GPU都在修改共享数据,而不是两者都在读取数据的情况。
然后有the "Resource Storage Modes and Device Memory Models" section描述了iOS 9和macOS 10.11引入的新存储模式。还有MTLResourceStorageModeShared
本身的文档。再次提及阅读与写作,但没有提及阅读与阅读。
如果同时阅读有问题,我认为苹果会对此进行讨论。