线程访问同一缓存行的

问题描述 投票:4回答:3

我碰到一个建议线程不访问相同的缓存行,我真的不能明白为什么,还同时做对题目我这个问题来到身边一个搜索:Multiple threads and CPU cache其中一个答案建议:

你只是想避免试图同时访问位于同一高速缓存行的数据两个线程

就我看到它,内存从进程快速访问缓存存储的页面,因为它说,在这里:http://en.wikipedia.org/wiki/Thread_%28computing%29#How_threads_differ_from_processes

线程共享它们的地址空间

它不应该是一个问题的两个线程,因为如果一个网页是在缓存和线程试图访问内存将获得无论打到其他线程的高速缓存访​​问相同的缓存行。

我听说避免访问在几个不同的场合相同的高速缓存行,以便它不能是一个神话线程的说法。我缺少的是在这里吗?

multithreading caching operating-system
3个回答
4
投票

在大多数(可能所有,但我没有一个详尽的硬件知识),多核CPU,当一个内核尝试写入到相应的存储缓存将锁定当前访问线。因此,其他内核试图访问同一缓存线将在等待举行。

只要你可以线程之间共享相同的数据,因为它的只读(或很少更新),但是如果你继续写进去,隐藏的访问序列化将产生的性能等同于运行在相同内核的所有线程(实际上是差了些,由于缓存锁定延迟)。


3
投票

关于多核CPU上运行时的readers-writer problem的速度优化的,为什么不推荐会谈

在这种情况下,如果可能会更快,以避免cache lockLOCK# signal)和抑制cache line bouncing需要通过不同的缓存线运行的读者/作者维护cache coherence

你说得对,这不是必须避免的,因为东西会无法正常工作的问题。这只是一个建议的速度优化。

有关内部处理器高速缓存的思考是一个极端的低级别的速度优化的情况下。对于大多数典型的编程任务的速度瓶颈在于硬件电路之外,以下Intel Guide for Developing Multithreaded Applications是刚够


也可以看看

在“高速缓存行”的一些插图是在qazxsw POI可用


0
投票

此YouTube视频可能会有所帮助。问题是当两个处理器写入相同的缓存行,两个高速缓存必须保持高速缓存一致性。想象芯1中的高速缓存线写入数据,并将其放置在M态的高速缓存行(在MESI协议),而芯体2的高速缓存线是我的状态。如果核心2写入相同的缓存行,核心二级缓存行会为M状态强制核心高速缓存行我的状态。在最坏的情况下,核1或芯体2的高速缓存线将M之间乒乓效应和I状态。每当M和I之间的高速缓存线过渡,高速缓存行应从其他高速缓存(I-> M)被读取或写入到外部存储器(冲洗; M-> I)。这种情况会降低性能,由于高速缓存和外部存储器存取之间的数据交换。

Intel® 64 and IA-32 Architectures Software Developer’s Manual

下面的代码示例是有助于了解在多个线程访问同一缓存行的情况。

https://www.youtube.com/watch?v=S3kg_zCz_PA

© www.soinside.com 2019 - 2024. All rights reserved.