同一内存地址的并发写入操作是否具备事务性?
并发写入同一内存地址的常见问题解答
写入结果是混合值还是二选一
在绝大多数主流消费级硬件上,只要是对齐到硬件原生位宽的等长写入操作,最终存储结果只会是两个写入值中的其中一个,不会出现逐位混合的0b10110011这类结果。
但如果是非对齐写入、跨硬件位宽写入,或者是没有基础写入原子性保障的老旧硬件、特殊嵌入式设备,确实有可能出现部分位来自第一个写入值、剩余位来自第二个写入值的混合情况。
以上结论仅针对无软件锁、无原子操作指令加持的纯硬件并发无同步写入场景。
CPU与GPU执行这类操作的差异
CPU和GPU的底层写入逻辑差异很大:
- 主流CPU对对齐的、长度不超过总线位宽的写入操作默认提供写入原子性保障,只要操作符合对齐要求,就不会出现混合值,最终只会生效其中一个写入请求的结果。只有当写入长度超过总线位宽、或者地址未对齐时,才有可能出现写入撕裂得到混合值。
- GPU的显存写入默认没有低层级的原子性保障,尤其是多个流多处理器(SM)并发写入同一地址时,哪怕是对齐的等长写入,也有可能出现部分字节/位来自不同写入请求的混合结果,只有显式调用GPU的原子写入指令时,才会保障最终结果是其中一个写入值。
写入结果与硬件位宽的关联
这类结果确实和硬件位宽强相关:
- 如果你在16位位宽的硬件上执行16位对齐的16位写入操作,只要两个写入都是等长的对齐操作,就不会出现值重叠撕裂,最终结果一定是两个写入值中的一个。
- 但如果你在16位位宽的硬件上执行32位写入,这个操作会被硬件拆分为两次独立的16位写入,两次写入之间没有原子性绑定,并发写入时就大概率出现低16位来自第一个请求、高16位来自第二个请求的重叠结果。
内容的提问来源于stack exchange,提问作者Slaus
相关产品推荐
相关产品推荐

