内存可见于内存可用
在GPU执行过程中有责任保证接下来访问的这块内存是保证有效的,也就是确保先前写入的数据对目标单元可见。简单介绍一下GPU Cache体系,平时听得比较多的是CPU Cache,但是GPU同样有着自己的Cache体系。
如下图所示,在这里可以看GPU同样是有着L1/L2 Cache的架构。
那么在GPU中是如何保证先前写入的数据保证对目标单元可见呢?答案是通过L1/L2 Cache的配合来完成,首先L1 Cache用于存储SM(Streaming multiprocessor,
可以认为一个大的计算单元)内的数据,在SM内的运算单元能够共享该L1 Cache但是跨SM之间的L1 Cache不能相互访问。而L2 Cache是全部SM都可以访问。
根据这个特性L1 Cache可以通过L2 Cache来保证Cache一致性。当一个SM完成计算时将其结果写入L1 Cache中。后续将其结果更新到L2 Cache中。
其它 L1 Cache通过特定的一致性指令从L2 Cache中获取最新写入的数据,确保使用最新的数据保证了其数据一致性。
那么对于Vulkan来说这个代表了什么?别忘了同步也需要保证内存依赖,那么在每个不同的Pipeline Stage的执行过程中也需要保证使用的数据是最新(避免脏数据),
在Pipeline Stage中执行的操作都可能会在L1 Cache中写入数据,但是并不会保证更新到L2 Cache中,只有当某个Pipeline Stage真正的要使用的时候从更新到L2 Cache中再更新到L1 Cache中才可以使用到最新的数据。
回到这里现在来总结这一小节的名称,当L1 Cache写入新数据时,那么L2 Cache中的数据就已经失效。其他SM中的L1 Cache需要从L2 Cache中拉取最新数据这个过程被称为内存可见,
将L1 Cache最新的写入内容更新到L2 Cache的过程被称为内存可用。更简单的说内存可见使Cache无效,内存可用使Cache更新。在Vulkan中可以通过Memory Barrier来保证内存依赖的正确。