2014-10-31 62 views
2

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

你只是想避免试图同时访问位于同一缓存行

我看到它,内存高速缓存存储的网页快速的方式进行数据两个线程从过程中访问,并且如此这里说的:http://en.wikipedia.org/wiki/Thread_%28computing%29#How_threads_differ_from_processes

线程共享它们的地址空间

它不应该是一个问题的两个线程,因为如果一个网页是在缓存和线程试图访问访问同一缓存行的无论其他线程如何,内存都会获得缓存命中。

我听说过有关避免线程在几个不同场合访问相同缓存行的争论,所以它不能成为一个神话。我在这里错过了什么?

回答

2

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

只要它是只读的(或者不常更新),你可以在线程之间共享相同的数据,但是如果你一直写入它,隐藏的访问序列化将产生相当于在同一个核心上运行所有线程的性能由于缓存锁定延迟而变得更糟)。

+0

感谢您的回答是可用的,当我使用它们驻留在同一个C上的用户空间线程PU还是两个非用户线程驻留在同一个CPU上时,没有考虑到这个问题? – 2014-10-31 13:43:23

+0

操作系统会自动将您的线程分配给不同的内核(除非您强制其使用相同的内核)。这就是在多核架构中使用线程的关键。 OTOH,如果性能不是问题,为什么还要首先使用线程呢? :) – 2014-10-31 13:46:24

3

的,为什么不推荐说话的readers-writer problem速度优化的多核CPU

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

你是对的,它不是一个必须避免的问题,因为有些东西会失效。这只是一个建议的速度优化。

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


又见

的 “缓存线” 的一些ilustrations在Intel® 64 and IA-32 Architectures Software Developer’s Manual

enter image description here

enter image description here