知识卡片

三种内存读写危险:RAW/WAR/WAW

专业/工作 · 112

内容

当硬件或编译器把读写操作重排顺序以提升性能时,可能产生三类危险:写后读(RaW)——期望读到刚写入的新值,结果重排后读操作先于写操作执行,读到了旧数据;读后写(WaR)——期望先读到旧值再覆写,结果写操作先执行,读到了不该看到的新数据;写后写(WaW)——多次写同一块内存,只有最后一次的结果该被后续读操作看到,重排后却可能是别的写操作”意外”成为最后一次。不存在”读后读”危险,因为读操作不修改数据,谁先谁后都不影响结果。这三种危险不是Vulkan独有的概念,而是所有存在乱序执行、多级缓存或并行流水线的系统(CPU乱序执行、编译器指令重排、分布式系统的读写副本)都要面对的通用问题,同步原语的本质就是在必要的地方人为插入顺序约束来消除这些危险。

参考来源

《Vulkan 应用开发指南》第4章《移动数据》