争用内存中的读取共享数据?
Contention for read shared data in memory?
我目前正在研究 计算机体系结构:Hennessy 和 Patterson 的定量方法 在第 5 章(线程级并行)中,他们讨论了缓存一致性和复制多处理。他们要求我们通过设置用例来做出以下假设:
在我教科书的前几页,他们告诉读者做出以下假设:
- 处理器 A 写入内存位置 X
- 处理器 A 写入内存位置 Y.
- 处理器 C 从内存位置读取 Y 将看到正确的值-这意味着 处理器 C 也会看到内存位置 X.
的正确值
合乎逻辑的结论是
These restrictions allow processors to reorder reads, but forces the
processor to finish a write in program order.
然而,几段之后,当讨论将复制作为加强一致性的方案时,他们说
Replication reduces both latency of access and contention for a read
shared data item.
我的解释是将数据复制到本地缓存允许多核处理器减少延迟(由于数据局部性 - 数据明显更接近处理器)。我同意那部分。但是,我不清楚为什么会有 contention for a read shared data item
。这似乎意味着 RAR (Read after Read)
数据危害,我知道这并不存在。
除非处理器尝试写入共享内存位置,否则为什么在读取共享数据项时会出现任何类型的争用?
编辑: Whosebug 上有很多关于线程争用的帖子,包括 What is thread contention?。但是这些几乎独占使用锁为例。我的理解是,锁是一种用于增强一致性的更高级别的应用程序模式。此外,我作为答案看到的所有示例都涉及对目标数据项的某种修改(写入)。
任何内存结构都有有限数量的访问或读取端口,它们代表允许您读取或写入数据的物理线路。如果只有一个读端口,但多个代理可能同时从内存中读取,那么它们将争用该端口,因为一次只有其中一个可以使用它。减少争用和提高整体带宽的方法之一是通过单独的访问端口在单独的物理结构中复制数据。例如,每个核心可能有自己的私有缓存,其中可能存在同一缓存行的多个副本。在这样的设计中,每个核心都能够独立访问其缓存行副本。
多核竞争读取某些东西不是数据危害(正确性问题),它更像是结构危害(有限的读取端口)。当多个内核不想读取相同的数据时,内存/缓存总线不会进行多播。
但这仍然是术语的延伸:"structural hazard" 通常表示在单个核心内,例如一个除法器 ALU,在启动一个除法器后的几个周期内不能开始一个新的除法器,因此背靠背独立的 div
指令仍然必须停止。
内存预期具有可变延迟,因此无法精确安排。这只是老生常谈。
我目前正在研究 计算机体系结构:Hennessy 和 Patterson 的定量方法 在第 5 章(线程级并行)中,他们讨论了缓存一致性和复制多处理。他们要求我们通过设置用例来做出以下假设:
在我教科书的前几页,他们告诉读者做出以下假设:
- 处理器 A 写入内存位置 X
- 处理器 A 写入内存位置 Y.
- 处理器 C 从内存位置读取 Y 将看到正确的值-这意味着 处理器 C 也会看到内存位置 X. 的正确值
合乎逻辑的结论是
These restrictions allow processors to reorder reads, but forces the processor to finish a write in program order.
然而,几段之后,当讨论将复制作为加强一致性的方案时,他们说
Replication reduces both latency of access and contention for a read shared data item.
我的解释是将数据复制到本地缓存允许多核处理器减少延迟(由于数据局部性 - 数据明显更接近处理器)。我同意那部分。但是,我不清楚为什么会有 contention for a read shared data item
。这似乎意味着 RAR (Read after Read)
数据危害,我知道这并不存在。
除非处理器尝试写入共享内存位置,否则为什么在读取共享数据项时会出现任何类型的争用?
编辑: Whosebug 上有很多关于线程争用的帖子,包括 What is thread contention?。但是这些几乎独占使用锁为例。我的理解是,锁是一种用于增强一致性的更高级别的应用程序模式。此外,我作为答案看到的所有示例都涉及对目标数据项的某种修改(写入)。
任何内存结构都有有限数量的访问或读取端口,它们代表允许您读取或写入数据的物理线路。如果只有一个读端口,但多个代理可能同时从内存中读取,那么它们将争用该端口,因为一次只有其中一个可以使用它。减少争用和提高整体带宽的方法之一是通过单独的访问端口在单独的物理结构中复制数据。例如,每个核心可能有自己的私有缓存,其中可能存在同一缓存行的多个副本。在这样的设计中,每个核心都能够独立访问其缓存行副本。
多核竞争读取某些东西不是数据危害(正确性问题),它更像是结构危害(有限的读取端口)。当多个内核不想读取相同的数据时,内存/缓存总线不会进行多播。
但这仍然是术语的延伸:"structural hazard" 通常表示在单个核心内,例如一个除法器 ALU,在启动一个除法器后的几个周期内不能开始一个新的除法器,因此背靠背独立的 div
指令仍然必须停止。
内存预期具有可变延迟,因此无法精确安排。这只是老生常谈。