【发布时间】:2022-06-23 19:28:32
【问题描述】:
如果0b000000000 和0b11111111 同时写入同一个内存地址,它最终可能会变成0b10110011,或者它总是会变成0b000000000 或0b11111111? CPU和GPU执行之间有什么区别吗?它是否取决于位深度,因此 16 位硬件上的 32 位写入可能会以重叠结束,但 16 位写入不会?
【问题讨论】:
-
一般来说,您描述的是一种竞争条件,但如果没有更多细节,就不可能告诉您结果
-
一般来说,在 CPU 上;内存事务发生在单个内核的缓存中,然后如果两个内核同时写入相同的“位置”,则一次一行(通常一次 64 字节或更多)将其事务处理到更高级别的缓存中,当它们都尝试刷新到 L2 或 L3 时,基本上会发生缓存冲突。解决缓存冲突取决于系统且复杂。
-
大多数(全部?)ISA 将自然对齐的单词(GPR 存储)定义为原子的。 “写撕裂”可能是寻找更多信息的好搜索词。我认为英特尔 x86 不保证 128 位和更大(SIMD 寄存器)存储的原子性,即使对齐,即使某些/所有实现确实提供了这种原子性。
-
This 最近的帖子应该(部分)回答这个问题。除此之外,由于 DRAM(控制器),AFAIK 所有现代处理器都以原子方式加载/存储字节大小的内存值。
标签: multiprocessing gpu atomic cpu-architecture multicore