【问题标题】:Are concurrent write operations into the same word transactional?对同一个词的并发写入操作是事务性的吗?
【发布时间】:2022-06-23 19:28:32
【问题描述】:

如果0b0000000000b11111111 同时写入同一个内存地址,它最终可能会变成0b10110011,或者它总是会变成0b0000000000b11111111? CPU和GPU执行之间有什么区别吗?它是否取决于位深度,因此 16 位硬件上的 32 位写入可能会以重叠结束,但 16 位写入不会?

【问题讨论】:

  • 一般来说,您描述的是一种竞争条件,但如果没有更多细节,就不可能告诉您结果
  • 一般来说,在 CPU 上;内存事务发生在单个内核的缓存中,然后如果两个内核同时写入相同的“位置”,则一次一行(通常一次 64 字节或更多)将其事务处理到更高级别的缓存中,当它们都尝试刷新到 L2 或 L3 时,基本上会发生缓存冲突。解决缓存冲突取决于系统且复杂。
  • 大多数(全部?)ISA 将自然对齐的单词(GPR 存储)定义为原子的。 “写撕裂”可能是寻找更多信息的好搜索词。我认为英特尔 x86 不保证 128 位和更大(SIMD 寄存器)存储的原子性,即使对齐,即使某些/所有实现确实提供了这种原子性。
  • This 最近的帖子应该(部分)回答这个问题。除此之外,由于 DRAM(控制器),AFAIK 所有现代处理器都以原子方式加载/存储字节大小的内存值。

标签: multiprocessing gpu atomic cpu-architecture multicore


【解决方案1】:

它不会以 0b10110011 或任何其他随机的形式出现。这样做意味着有两个数据源竞争同时驱动微电子的某些部分,这意味着一个电子设备试图烧毁另一个电子设备。这不是一个好主意。

因此,微电子几乎总是被设计成对共享资源(如总线)的访问在某处进行仲裁。对于经典总线,一次只有一个设备会“启用输出”,所有其他设备都处于三态/高阻抗状态,因此不会与有源设备发生冲突。因此,想要同时驱动总线的两个设备最终会通过总线控制逻辑对其访问进行串行化,因此最终结果将始终是 0b11111111 或 0b00000000 之一。

在现代 CPU 的情况下,这将是 L3 控制逻辑在哪个内核先运行之间进行仲裁的问题(据我所知,缓存控制器内部甚至可能存在一些三态/高 Z 逻辑)。

我说“几乎总是”——Amstrad 1980 年代的一台计算机的电子设计中存在错误(我忘了是哪个)。只需对设备上的寄存器进行几次写入,就可以让两个设备同时驱动同一总线。不久之后,机器会过热并烧毁(冒烟)。某类孩子会喜欢进入电子商店,在显示模型中输入必要的命令然后离开......

简而言之,任何现代 CPU/GPU 的微电子技术都会阻止随机混合,但至于最终结果是哪一个,谁也说不准。

当然,如果写入的值比系统字宽宽,那就会改变。例如,如果它是 4 位系统,您最终可能会得到 0b11110000 或 0b00001111。如今,系统字宽往往与任何整数类型一样宽或更宽,因此不会发生这种情况。但是,如果它是一个 32 位系统,并且您从一个内核写入 0xffffffffffffffff,从另一个内核写入 0x0000000000000000,您最终可能会得到 0xffffffff00000000(反之亦然),因为写入 64 位值将是两个写入周期,这可能在理论在两个核心之间混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多