【问题标题】:threads accessing same cache line线程访问同一缓存行
【发布时间】:2014-12-27 20:06:54
【问题描述】:

我遇到了一个关于线程不要访问相同缓存行的建议,我真的不明白为什么,在搜索该主题时,我遇到了以下问题: Multiple threads and CPU cache 其中一个答案建议:

您只是想避免两个线程同时尝试访问位于同一缓存行上的数据

在我看来,缓存存储内存页面以便从进程中快速访问,正如这里所说:http://en.wikipedia.org/wiki/Thread_%28computing%29#How_threads_differ_from_processes

线程共享它们的地址空间

两个线程访问同一个缓存行应该不是问题,因为如果一个页面在缓存中,并且尝试访问内存的线程将获得缓存命中,而不管其他线程如何。

我听说过关于避免线程在几个不同的场合访问同一个缓存行的论点,所以这不是一个神话。我在这里错过了什么?

【问题讨论】:

    标签: multithreading caching operating-system


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,当我使用用户空间线程时,它们驻留在同一个 CPU 上,或者当两个非用户线程驻留在同一个 CPU 上时,考虑这个问题没有意义吗?
    • 操作系统会自动将你的线程分配给不同的内核(除非你强制它为所有内核使用相同的内核)。这就是在多核架构中使用线程的全部意义所在。 OTOH,如果性能不是问题,为什么还要首先使用线程? :)
    【解决方案2】:

    为什么不推荐讨论readers-writer problem 在多核 CPU 上运行时的速度优化

    在这种情况下,如果通过在不同的缓存行上运行读取器/写入器来避免cache lock (LOCK# signal) 并抑制维护cache coherence 所需的cache line bouncing,可能会更快。

    你是对的,这不是一个必须避免的问题,因为某些事情会失败。这只是一种建议的速度优化。

    考虑内部处理器缓存是一种极低级别的速度优化案例。对于大多数典型的编程任务,速度瓶颈在于硬件电路之外,遵循Intel Guide for Developing Multithreaded Applications 就足够了


    另见

    Intel® 64 and IA-32 Architectures Software Developer’s Manual 中提供了“缓存行”的一些插图

    【讨论】:

      【解决方案3】:

      这个 youtube 剪辑可能会有所帮助。问题是当两个处理器写入同一个高速缓存行时,两个高速缓存必须保持高速缓存的一致性。想象一下核心 1 将数据写入高速缓存行并将高速缓存行置于 M 状态(在 MESI 协议中),而核心 2 高速缓存行是 I 状态。如果核心 2 写入同一缓存行,核心 2 缓存中的行将是 M 状态,强制核心 1 缓存行变为 I 状态。在最坏的情况下,核心 1 或核心 2 高速缓存行将在 M 和 I 状态之间反复进行。每次缓存线在 M 和 I 之间转换时,应该从其他缓存(I->M)读取缓存线或将缓存线写入外部存储器(刷新;M->I)。由于缓存和外部内存访问之间的数据交换,这种情况会影响性能。

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

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

      https://www.geeksforgeeks.org/sum-array-using-pthreads/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-01
        • 2011-01-27
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多